I2C写协议:如何在寄存器中写入?

时间:2017-11-06 14:04:20

标签: microcontroller i2c

我正在使用FT4222器件在I2c中对MAX77651进行编程。我希望能够在寄存器中写入。

我能够读取寄存器,所以我知道我没有任何硬件问题。要读入寄存器,我会这样继续:我首先发送我想要阅读的寄存器,然后我只是阅读里面的内容。

要写我试图发送我想写的寄存器然后我发送我想要放入寄存器的数据。但是当我在此之后通过阅读检查我没有得到预期的结果。

以下是我尝试编写和阅读的程序部分:

uint8 resultat=0x11;
uint8 *p_resultat=&resultat;
int chiffre = 8;
uint16 bytesToWrite2 = 1;
uint16 bytesWritten2=1;
uint8 valeur= 0x06;     // Adress of register
uint8 *p_valeur=&valeur;    
uint16         slaveAddr = 0x48;

// ***** reading test of 0x06 : expected value : 0xFF
FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur,
bytesToWrite2,&bytesWritten); 

chiffre = FT4222_I2CMaster_Read(ftHandle,slaveAddr,p_resultat,1, &bytesRead);
printf("The content of the register %02X is : %02X \n " , valeur , resultat);
printf("reading success if : %d = 0 \n " , chiffre);

//********** Writting test to the register 0x40 
***********************************************//

valeur = 0x40;

FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur,
bytesToWrite2,&bytesWritten);

valeur = 0x1F;

FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur,
bytesToWrite2,&bytesWritten);

//*************** Reading of the register 0x40 
*******************************************//

valeur= 0x40;           

FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur,
bytesToWrite2,&bytesWritten); 

chiffre = FT4222_I2CMaster_Read(ftHandle,
slaveAddr,p_resultat,1, &bytesRead);

printf("The content of the register %02X 
is : %02X \n " , valeur , resultat);

printf("reading success if : %d = 0 \n " , chiffre);

该代码应该在寄存器0x40中显示1F,但情况并非如此,这是我得到的:

The content of the register 06 is : FF 
reading success if : 0 = 0 
The content of the register 40 is : 00 
reading success if : 0 = 0 

我的问题很简单,我应该怎样做以及以何种顺序在寄存器中正确写入?

Ps:我没有把我的整个代码放在一边,因为它主要是关于FT4222的配置,并且包含,与解决我的问题无关。

1 个答案:

答案 0 :(得分:2)

请参阅MAX77651 datasheet

第76页的“写入单个寄存器”部分
  

写字节协议如下:

     
      
  • 主设备发送启动命令(S)。
  •   
  • 主机发送7位从机地址,后跟写入位(R / W = 0)。
  •   
  • 被寻址的从设备通过拉低SDA来确认应答(A)。
  •   
  • 主机发送一个8位寄存器指针。
  •   
  • 从机确认寄存器指针。
  •   
  • 主设备发送数据字节。
  •   
  • 从站使用新数据进行更新
  •   
  • 从机确认或不确认数据字节。 SDA的下一个上升沿将数据字节加载到其目标寄存器和   数据变得活跃。
  •   
  • 主设备发送停止条件(P)或重复启动条件(Sr)。发出P确保总线输入滤波器设置为1MHz   或更慢的操作。发出一个Sr离开总线输入过滤器   他们目前的状态。
  •   

您试图通过连续两次调用FT4222_I2CMaster_Write()来写入内部寄存器。您期望第一次写入选择寄存器地址,第二次写入加载数据。但这不是它的工作原理。每次调用FT4222_I2CMaster_Write()都会发送一个START和STOP,这样您的连续调用将导致寄存器地址和数据之间的STOP / START。相反,您应该调用FT4222_I2CMaster_Write()并提供寄存器地址和数据。也许是这样的。

uint8_t buf[2];
buf[0] = register_addr;
buf[1] = data;
FT4222_I2CMaster_Write(ftHandle, slaveAddr, buf, 2, &bytesWritten);

顺便说一下,你的阅读也可能不正确。请参见MAX77651数据手册中的“从单个寄存器读取”部分。您可能需要实现一个寄存器读取,调用FT4222_I2CMaster_WriteEx()后跟FT4222_I2CMaster_ReadEx(),如User Guide For LibFT4222第32页上的“I²C组合消息支持”示例所示。