大家好,
我正在处理I2C接口代码。我已转介I2C_EEPROM驱动程序代码。我不理解的代码段很少意味着代码的确切工作。
如果有人帮助理解,那么将传感器连接到我将非常有帮助。
使用IQS333触摸传感器的从设备。我无法正确沟通的地方。
以下是代码片段,请说明工作
在就绪字节功能中
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_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寄存器
if((ui16tx_abrt_source&abrt_7b_addr_noack)== 0)
{
返回i2c_no_error;
}
}
返回i2c_7b_addr_noack_error;
}
上面附带的片段。
紧急帮助需要。
谢谢并恭祝安康
罗希特
关键字:
设备:
嗨,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_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寄存器
if((ui16tx_abrt_source&abrt_7b_addr_noack)== 0)
{
返回i2c_no_error;
}
}
返回i2c_7b_addr_noack_error;
}
3. IQS333是使用I2C协议进行通信的Proxsense套件。它有3个PINS SCL,SDA和RDY。每当14msec的RDY线路较低时,设备就会开始与主通信。但是,就我而言,如果我尝试读取地址代码,请始终在WAIT_FOR_RECEIVED_BYTE中。我已附上IQS333应用程序,它可能会帮助您获取更多信息。
谢谢并恭祝安康
罗希特
嗨,rajapurerohit,
WAIT_FOR_RECEIVED_BYTE设置接收FIFO级寄存器(I2C_RXFLR_REG I2C)。该寄存器包含接收FIFO中有效的数据条目的数量,因此,如果您不使用此定义,则无法知道何时接收数据。请检查数据表以获取更多信息。
I2C_WAIT_UNTIL_EEPROM_READY()函数进行了轮询,直到准备就绪。首先,此函数发送一个虚拟值,并且一直等到TX的FIFO为空。我强烈建议您探究您的销钉(SCL,SDA和RDY),并尝试准备一个地址。如果您尝试一下,我认为更清楚的是问题所在。
谢谢,pm_dialog
感谢你的回复,
在评论wait_for_received_byte之后,我能够阅读数据,它不用wait_for_received_byte来工作。
但是我在阅读多个字节时面临问题。由于IQS333返回多个字节,而且我也引用了I2C_EEPROM,并尝试使用test_read_data()读取多个数据;功能,即使我更改各自的地址,我也总是会在缓冲区中获得同样的WHO_I AM注册数据。
您能建议我任何读20比特的功能吗?
谢谢并恭祝安康
罗希特
嗨,rajapurerohit,
test_read_data()函数调用I2C_EEPROM_READ_DATA(),该数据将I2C EEPROM的数据读取到给定指针的内存位置。在此示例中,一次读取32个字节。因此,如果您想每次读取20个字节,则应修改i2c_eeprom_read_data(),然后使用20个更改tmp_size。读取命令(0x0100)。因此,您应该定义tmp_size等于或小于32个字节。
谢谢,pm_dialog
嗨,pm_dialog,
非常感谢你的回复,
我已经编写了代码来通过引用i2c_eeprom将多个读 /写入数据读取到传感器。
附件是我的读/写代码段。您能帮我吗,无论是正确的还是要做的任何更改。
特别是写多个数据。
//读取数据
IQS333_ERROR_CODE IQS333_READ_BYTE(UINT8_T地址,UINT8_T *BYTE,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{
wait_while_i2c_fifo_is_full();//等待TX FIFO已满
send_i2c_command(0x0100);//设置读取时间的访问
}
//关键部分的结尾
global_int_restore();
//获取收到的数据{
for(ui8j = 0; ui8j
// wait_for_received_byte();//等待收到的数据
*字节=(0xff&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 *BYTE,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{
wait_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_activity();//等到无主活动直到
返回i2c_no_error;
}
谢谢并恭祝安康
罗希特
嗨,rajapurerohit,
让我检查您的代码片段,我会尽快与您联系。您能澄清一下是否有附件代码有任何问题?
谢谢,pm_dialog
嗨,pm_dialog,
我已经测试了摘要,但是我无法在缓冲区上观看数据。如果您验证代码并提供反馈,这对我有帮助。
那么,您能帮我在哪里犯错吗?
谢谢并恭祝安康
罗希特
嗨,rajapurerohit,
强烈建议使用I2C_EEPROM.H/C库中的API。您是否尝试使用I2C_EEPROM_READ_DATA()和I2C_EEPROM_WRITE_BYTE()函数来读取和写入字节到EEPROM中?如果我正确理解,您的附件代码将用于阅读/编写一个字节。
谢谢,pm_dialog
你好pm_dialog,
是的,我从i2ceeprom.h/.c库中使用了API。但是我已经修改并使用了read_byte和write_byte api,以读取多个字节和多个写入字节。
您是否尝试过摘要来读/编写多个字节。因为我已将其修改为多个数据。
谢谢并恭祝安康
罗希特
嗨,rajapurerohit,
您能否澄清一下“多个数据”的意思?I2C_EEPROM库已经通过此用途实现了API。您可以尝试I2C_EEPROM_READ_DATA()和I2C_EEPROM_WRITE_DATA()吗?我无法在SDK的默认I2C示例中复制您的问题。
谢谢,pm_dialog