你好,
我工作在I2C接口代码。我有提到i2c_eeprom驱动程序代码。一些我不理解的代码片段意味着准确工作的代码。
如果任何一个帮助理解然后将非常有助于我接口传感器。
奴隶设备使用IQS333触摸传感器。我无法正常交流。
以下是代码片段,请解释工作
在准备字节函数
1。SEND_I2C_COMMAND (0 x0100);/ /将R / W位设置为1(读访问)
2。WAIT_FOR_RECEIVED_BYTE ();/ /等待接收的数据
和i2c_eeprom_error_code
i2c_eeprom_error_code i2c_wait_until_i2c_eeprom_ready(空白)
{
uint16_t ui16tx_abrt_source;
/ /检查是否收到ACK
(uint32_t ui32Indx = 0;ui32Indx < I2C_MAX_RETRIES;ui32Indx + +)
{
SEND_I2C_COMMAND (();/ /做一个虚拟访问
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();/ /等待Tx FIFO是空的
WAIT_UNTIL_NO_MASTER_ACTIVITY ();/ /没有等到主人活动
ui16tx_abrt_source = GetWord16 (I2C_TX_ABRT_SOURCE_REG);/ /读取I2C_TX_ABRT_SOURCE_REG登记
GetWord16 (I2C_CLR_TX_ABRT_REG);/ /清楚I2C_TX_ABRT_SOURCE登记
如果((ui16tx_abrt_source & ABRT_7B_ADDR_NOACK) = = 0)
{
返回I2C_NO_ERROR;
}
}
返回I2C_7B_ADDR_NOACK_ERROR;
}
附加片段之上。
需要紧急帮助。
感谢和问候
罗希特
嗨Rajapurerohit,
SEND_I2C_COMMAND将所需的数据到I2C总线。SEND_I2C_COMMAND (0 x0100);会导致阅读教学,因此I2C模块将问题重新启动条件和力量模块对总线的地址和奴隶的阅读,提供时钟的奴隶从奴隶为了打卡数据本身。请检查SEND_I2C_COMMAND i2c_eeprom (X)的定义。c文件。这个定义集I2C_DATA_CMD_REG,所以请检查数据表获取更多的信息。WAIT_FOR_RECEIVED_BYTE控制只有当它充当一个主方向。停止使用的宏代码,等待设备接收数据FIFO。请澄清你的问题是哪一个?我没有IQS333触摸传感器,所以我无法复制你的问题。如果你想要更多的信息,请让我知道。
谢谢,PM_Dialog
嗨PM_Dialog,
谢谢你的回应。
1。如果我在我的代码不包括WAIT_FOR_RECEIVED_BYTE吗?
2。如何检查是否收到ACK的片段?
(uint32_t ui32Indx = 0;ui32Indx < I2C_MAX_RETRIES;ui32Indx + +)
{
SEND_I2C_COMMAND (();/ /做一个虚拟访问
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();/ /等待Tx FIFO是空的
WAIT_UNTIL_NO_MASTER_ACTIVITY ();/ /没有等到主人活动
ui16tx_abrt_source = GetWord16 (I2C_TX_ABRT_SOURCE_REG);/ /读取I2C_TX_ABRT_SOURCE_REG登记
GetWord16 (I2C_CLR_TX_ABRT_REG);/ /清楚I2C_TX_ABRT_SOURCE登记
如果((ui16tx_abrt_source & ABRT_7B_ADDR_NOACK) = = 0)
{
返回I2C_NO_ERROR;
}
}
返回I2C_7B_ADDR_NOACK_ERROR;
}
3所示。IQS333 ProxSense工具箱,使用I2C协议通信。它有3个别针sci, SDA和RDY。设备开始与主人交流每当RDY 14 msec线低。但是就我而言,如果我试图读地址代码,总是陷入WAIT_FOR_RECEIVED_BYTE。我有附加IQS333应用程序,它可以帮助你进一步的信息。
感谢和问候
罗希特
嗨Rajapurerohit,
WAIT_FOR_RECEIVED_BYTE设置接收FIFO寄存器(I2C_RXFLR_REG I2C)水平。这个寄存器包含有效数据条目的数量接收FIFO,所以如果你不使用这个定义你将无法知道什么时候接收数据。请检查数据表获取更多的信息。
i2c_wait_until_eeprom_ready()函数是轮询直到I2C已经准备好了。首先,该函数发送一个虚拟价值,等到Tx的FIFO是空的。我强烈建议你探测针(sci, SDA和RDY),准备一个地址。如果你尝试,我认为它会更清楚问题。
谢谢,PM_Dialog
谢谢你的回复,
我能评论WAIT_FOR_RECEIVED_BYTE后,读取数据没有WAIT_FOR_RECEIVED_BYTE就工作了。
但我面临问题在阅读多个字节。作为IQS333返回多个字节,也有称为i2c_eeprom并试图读取多个数据使用test_read_data ();功能,我总是获得相同的Who_i寄存器中的数据缓冲区,即使我改变各自的地址。
你能建议我任何函数读取20字节?
感谢和问候
罗希特
嗨Rajapurerohit,
test_read_data()函数调用i2c_eeprom_read_data(),读取数据从I2C eepm内存位置的指针。在这个例子中,32个字节读取一次。所以,如果你想读20字节每一次,你应该修改i2c_eeprom_read_data(),和改变tmp_size 20。请注意,数据存储在38是的FIFO和后read_data_single()发送读取命令(0 x0100)。所以你应该定义tmp_size等于或小于32字节。
谢谢,PM_Dialog
嗨PM_Dialog,
非常感谢你的回复,
我写代码来读取多个读/写数据传感器通过引用i2c_eeprom。
附件是我的读/写的代码片段。你能请帮我是否它是正确的或做的任何更改。
特别是在写多个数据。
/ /读取数据
iqs333_error_code iqs333_read_byte (uint8_t地址、uint8_t *字节,uint32_t大小)
{
uint8_t ui8j;
如果(i2c_wait_until_iqs333_ready () ! = I2C_NO_ERROR)
{
返回I2C_7B_ADDR_NOACK_ERROR;
}
/ /关键部分
GLOBAL_INT_DISABLE ();
i2c_send_address(地址);
(ui8j = 0;ui8j <大小;ui8j + +)
{
WAIT_WHILE_I2C_FIFO_IS_FULL ();/ /等待如果Tx FIFO
SEND_I2C_COMMAND (0 x0100);/ /设置读访问
}
/ /关键部分的结束
GLOBAL_INT_RESTORE ();
/ /接收的数据
(ui8j = 0;ui8j <大小;ui8j + +)
{
/ / WAIT_FOR_RECEIVED_BYTE ();/ /等待接收的数据
*字节= (0 xff & GetWord16 (I2C_DATA_CMD_REG));/ /接收到的字节
(字节)+ +;
}
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();/ /等待Tx FIFO是空的
WAIT_UNTIL_NO_MASTER_ACTIVITY ();/ /没有等到主人活动
返回I2C_NO_ERROR;
}
/ /写数据
iqs333_error_code iqs333_write_byte (uint8_t地址、uint8_t *字节,uint32_t大小)
{
uint8_t ui8j;
如果(i2c_wait_until_iqs333_ready () ! = I2C_NO_ERROR)
{
返回I2C_7B_ADDR_NOACK_ERROR;
}
/ /关键部分
GLOBAL_INT_DISABLE ();
i2c_send_address(地址);
(ui8j = 0;ui8j <大小;ui8j + +)
{
WAIT_WHILE_I2C_FIFO_IS_FULL ();/ /等待如果Tx FIFO
SEND_I2C_COMMAND &(*字节0 xff);/ /发送字节写
(字节)+ +;
}
/ /关键部分的结束
GLOBAL_INT_RESTORE ();
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();/ /等待Tx FIFO是空的
WAIT_UNTIL_NO_MASTER_ACTIVITY ();/ /没有等到主人活动
返回I2C_NO_ERROR;
}
感谢和问候
罗希特
嗨Rajapurerohit,
让我检查你的代码片段,我将回到你尽快的反馈。请澄清,如果你有任何问题附带的代码?
谢谢,PM_Dialog
嗨PM_Dialog,
我已经测试了片段,但我无法看数据缓冲区。如果你验证代码和给你的反馈对我是很有帮助的。
所以你能帮我我犯错误吗?
感谢和问候
罗希特
嗨Rajapurerohit,
强烈推荐使用i2c_eeprom的api。h / c库。你试图利用i2c_eeprom_read_data()和i2c_eeprom_write_byte()函数来读取和写入字节eepm ?附加代码是为读/写一个字节,如果我理解正确。
谢谢,PM_Dialog
你好PM_Dialog,
是的,我从i2ceeprom.h / api的使用。c库。但是我有修改和使用read_byte和write_byte api读取多个字节和多个字节写。
你试着读/写多个字节的代码片段。因为我有修改它为多个数据。
感谢和问候
罗希特
嗨Rajapurerohit,
你能明确你的意思与“多个数据”?i2c_eeprom图书馆已经实现api的使用。你能请i2c_eeprom_read_data试()和i2c_eeprom_write_data ()。我不能复制你的问题在默认i2c SDK的例子。
谢谢,PM_Dialog