繁体   English   中英

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

[英]I2C Writing protocol: how to write in a register?

我正在使用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的配置,包括,没有任何相关的解决我的问题。

请参见MAX77651数据手册第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()来实现寄存器读取,如“ LibFT4222用户指南 ”的“I²C组合消息支持”示例所示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM