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

Isy*_*rog 3 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);
Run Code Online (Sandbox Code Playgroud)

该代码应该在寄存器 0x​​40 中显示 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 
Run Code Online (Sandbox Code Playgroud)

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

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

kkr*_*mbo 6

请参见MAX77651 数据手册第 76 页的“写入单个寄存器”部分

\n\n
\n

写字节协议如下:

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

您正在尝试通过连续两次调用来写入内部寄存器FT4222_I2CMaster_Write()。您期望第一次写入选择寄存器地址,第二次写入加载数据。但事实并非如此。每次调用都会FT4222_I2CMaster_Write()发送 START 和 STOP,因此连续调用将导致寄存器地址和数据之间出现 STOP/START。相反,您应该拨打一个电话FT4222_I2CMaster_Write()并提供寄存器地址和数据。也许是这样的。

\n\n
uint8_t buf[2];\nbuf[0] = register_addr;\nbuf[1] = data;\nFT4222_I2CMaster_Write(ftHandle, slaveAddr, buf, 2, &bytesWritten);\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一句,您的读数也可能不正确。请参见MAX77651数据手册的“读取单个寄存器”部分。FT4222_I2CMaster_WriteEx()您可能需要通过调用来实现寄存器读取,如LibFT4222 用户指南FT4222_I2CMaster_ReadEx()第 32 页的“I\xc2\xb2C 组合消息支持”示例所示

\n