首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >I2C写入协议:如何在寄存器中写入?

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

Stack Overflow用户
提问于 2017-11-06 14:04:19
回答 1查看 7.5K关注 0票数 2

我正在使用MAX77651设备在I2c中编程FT4222。我想能在登记簿上写字。

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

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

下面是我尝试写和读的程序的一部分:

代码语言:javascript
复制
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,但事实并非如此,以下是我得到的:

代码语言:javascript
复制
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的配置,并包括,没有相关的解决我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-06 19:04:48

请参阅MAX77651数据表第76页中的“写入单个寄存器”一节。

写入字节协议如下:

  • 主程序发送一个开始命令(S)。
  • 主程序发送7位从地址,后面跟着写位(R/W = 0).
  • 被寻址的奴隶通过将SDA拉低来断言确认(A)。
  • 主程序发送一个8位寄存器指针.
  • 从服务器确认寄存器指针。
  • 主程序发送一个数据字节。
  • 从服务器用新数据进行更新。
  • 从节点确认或不确认数据字节。SDA上的下一个上升边缘将数据字节加载到其目标寄存器中,数据就会激活。
  • 主机发送停止条件(P)或重复启动条件(Sr)。发出P确保总线输入滤波器被设置为1 1MHz或更慢的操作。发出Sr将使总线输入过滤器处于当前状态。

您正在尝试用两个连续调用FT4222_I2CMaster_Write()的方式写入内部寄存器。您期望第一次写入选择寄存器地址,第二次写入加载数据。但这不是它的工作方式。每次对FT4222_I2CMaster_Write()的调用都会发送一个开始和停止,因此您的连续呼叫将导致寄存器地址和数据之间的停止/启动。相反,您应该对FT4222_I2CMaster_Write()进行一次调用,并提供注册地址和数据。也许是这样的。

代码语言:javascript
复制
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用户指南第32页中的“I组合消息支持”示例所示。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47138737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档