大家好,
我正在研究I2C接口代码。我已经提到了I2C_EEPROM驱动程序代码。很少有代码段我不理解意味着准确的准确工作。
如果有任何一个人有助于理解,那么我将对我的传感器接口非常有帮助。
从设备使用IS IQS333触摸传感器。在哪里我无法正常沟通。
以下是代码片段,请解释工作
在Ready Byte功能
1. send_i2c_command(0x0100);//将R / W位设置为1(读取访问)
2. wait_for_received_byte();//等待收到的数据
和i2c_eeprom_error_code.
i2c_eeprom_error_code i2c_wait_until_i2c_eeprom_ready(void)
{
uint16_t ui16tx_abrt_source;
//检查是否已收到ACK
for(UINT32_T UI32INDX = 0; UI32INDX
send_i2c_command(0x08);//制作假人
wait_until_i2c_fifo_is_empty();//等到TX FIFO是空的
wait_until_no_master_actity();//等到没有主活动
Ui16tx_abrt_source = getword16(i2c_tx_abrt_source_reg);//读取i2c_tx_abrt_source_reg寄存器
getword16(i2c_clr_tx_abrt_reg);//清除i2c_tx_abrt_source寄存器
if((ui16tx_abrt_source&abrt_7b_addr_noack)== 0)
{
返回i2c_no_error;
}
}
返回i2c_7b_addr_noack_error;
}
附加的片段上方。
紧急帮助。
感谢致敬
rohit.
嗨rajapurerohit,
send_i2c_command将将所需数据推入I2C总线。send_i2c_command(0x0100);将导致读取指令,因此I2C模块将发出重新启动条件并强制到模块在总线上具有从设备的地址以及读取位,并为从站提供时钟,以便从中划出数据奴隶本身。请在i2c_eeprom.c文件中检查send_i2c_command(x)定义。此定义设置I2C_DATA_CMD_REG,因此请检查数据表以获取更多信息。wait_for_received_byte仅在充当主设备时仅控制方向。,宏用于停止代码并等待设备从FIFO接收数据。你能澄清你的问题吗?我没有IQS333触摸传感器,所以我无法复制你的问题。如果您想要更多信息,请告诉我。
谢谢,PM_DIALOG.
嗨pm_dialog,
谢谢您的答复。
1.如果我在代码中不包括wait_for_received_byte,该怎么办?
2.检查是否收到ACK的检查流程如何?{
for(UINT32_T UI32INDX = 0; UI32INDX
send_i2c_command(0x08);//制作假人
wait_until_i2c_fifo_is_empty();//等到TX FIFO是空的
wait_until_no_master_actity();//等到没有主活动
Ui16tx_abrt_source = getword16(i2c_tx_abrt_source_reg);//读取i2c_tx_abrt_source_reg寄存器
getword16(i2c_clr_tx_abrt_reg);//清除i2c_tx_abrt_source寄存器
if((ui16tx_abrt_source&abrt_7b_addr_noack)== 0)
{
返回i2c_no_error;
}
}
返回i2c_7b_addr_noack_error;
}
3. IQS333是一种使用I2C协议进行通信的ProxSense套件。它有3个引脚SCL,SDA和RDY。每当RDY线路低14毫秒时,设备开始与Master通信。但在我的情况下,如果我试图读取地址代码,始终陷入wait_for_received_byte。我已附加IQS333应用笔记,它可能会帮助您获取更多信息。
感谢致敬
rohit.
嗨rajapurerohit,
wait_for_received_byte设置接收FIFO级别寄存器(I2C_RXFLR_REG I2C)。此寄存器包含接收FIFO中的有效数据条目的数量,因此如果您不使用此定义,您将无法知道何时收到数据。请检查数据表以获取更多信息。
I2C_WAIT_UNTIL_EEPROM_READY()函数是轮询,直到I2C已准备就绪。首先,此函数发送伪值,直到TX的FIFO为空。我强烈建议你探测你的引脚(SCL,SDA和RDY)并尝试准备好地址。如果你试过,我认为这将更清楚这个问题可能是什么。
谢谢,PM_DIALOG.
感谢你的回复,
我能够在评论wait_for_receive_byte后读取数据,它没有wait_for_received_byte工作。
但我正在阅读多个字节时面临问题。由于IQS333返回多个字节,并且我还引用了I2C_EEPROM,并尝试使用test_read_data()读取多个数据;函数,即使我更改了各个地址,我也总是在缓冲区中获得相同的人在缓冲区中注册数据。
您能否向我建议我任何读取20字节的功能?
感谢致敬
rohit.
嗨rajapurerohit,
test_read_data()函数调用I2C_EEPROM_READ_DATA(),其将来自I2C EEPROM的数据读取到给定指针的存储位置。在此示例中,一次读取32个字节。因此,如果您希望每次阅读20个字节,则应修改I2C_EEPROM_READ_DATA(),然后使用20更改TMP_SIZE。请注意,数据将首先存储在38副FIFO中,之后read_data_single()发送读取命令(0x0100)。因此,您应该定义TMP_Size等于或小于32字节。
谢谢,PM_DIALOG.
嗨pm_dialog,
非常感谢你的回复,
我有写入代码以通过引用I2C_EEPROM读取多个读/写数据到传感器。
附加是我的读/写代码片段。你能帮我帮助我是否是正确的或要完成的任何更改。
特别是写多个数据。
//读取数据
IQS333_ERROR_CODE IQS333_READ_BYTE(UINT8_T地址,UINT8_T *字节,UINT32_T大小)
{
UINT8_T UI8J;
if(i2c_wait_until_iqs333_ready()!= i2c_no_error)
{
返回i2c_7b_addr_noack_error;
}
//关键部分
global_int_disable();
i2c_send_address(地址);
for(Ui8j = 0; UI8J{
等待_while_i2c_fifo_is_full();//等待TX FIFO已满
send_i2c_command(0x0100);//设置次次读取访问
}
//关键部分结束
global_int_restore();
//获取收到的数据{
for(Ui8j = 0; UI8J
// wait_for_received_byte();//等待收到的数据
* byte =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节
(字节)++;
}
wait_until_i2c_fifo_is_empty();//等到TX FIFO是空的
wait_until_no_master_actity();//等到没有主活动
返回i2c_no_error;
}
//写入数据
IQS333_ERROR_CODE IQS333_WRITE_BYTE(UINT8_T地址,UINT8_T *字节,UINT32_T大小)
{
UINT8_T UI8J;
if(i2c_wait_until_iqs333_ready()!= i2c_no_error)
{
返回i2c_7b_addr_noack_error;
}
//关键部分
global_int_disable();
i2c_send_address(地址);
for(Ui8j = 0; UI8J{
等待_while_i2c_fifo_is_full();//等待TX FIFO已满
send_i2c_command(* byte&0xff);//发送写字节
(字节)++;
}
//关键部分结束
global_int_restore();
wait_until_i2c_fifo_is_empty();//等到TX FIFO是空的
wait_until_no_master_actity();//等到没有主活动
返回i2c_no_error;
}
感谢致敬
rohit.
嗨rajapurerohit,
让我检查你的代码片段,我会尽快回复你的反馈。如果您对附加代码有任何问题,请澄清您吗?
谢谢,PM_DIALOG.
嗨pm_dialog,
我已经测试了片段,但我无法观看缓冲区的数据。如果您验证代码并提供反馈,请对我有所帮助。
那么你能帮我犯错吗?
感谢致敬
rohit.
嗨rajapurerohit,
强烈建议使用i2c_eeprom.h / c库中的apis。您是否尝试使用i2c_eeprom_read_data()和i2c_eeprom_write_byte()函数读取和写入EEPROM的字节?如果我正确理解,附加代码是用于读取/写入一个字节。
谢谢,PM_DIALOG.
你好pm_dialog,
是的,我使用i2ceeprom.h / .c库的API。但我已经修改并使用了READ_BYTE和WRITE_BYTE API来读取多个字节和多个写入字节。
您是否尝试过代码段读/写多个字节。因为我已经修改了多个数据。
感谢致敬
rohit.
嗨rajapurerohit,
你能澄清你的意思是“多个数据”?i2c_eeprom库已经从此使用中实现了API。您可以尝试i2c_eeprom_read_data()和i2c_eeprom_write_data()。我无法在SDK的默认I2C示例中复制您的问题。
谢谢,PM_DIALOG.