⚠️
嗨,那里..感谢您参加论坛。激动人心的消息!现在,我们正在转到我们的新论坛平台,该平台将提供更好的功能,并包含在主话网站中。所有帖子和帐户都已迁移。我们现在仅在新论坛上接受流量 - 请在https://www.dialog-spoomendonductor.com/support。我们将在未来几天修复错误 /优化搜索和标记。
12个帖子 / 0新
最后一篇文章
Rajapurerohit
离线
最后一次露面:9个月3周前
加入:2017-04-20 09:17
i2c读 /写

大家好,
我正在处理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;
}

上面附带的片段。
紧急帮助需要。

谢谢并恭祝安康
罗希特

关键字:
设备:
pm_dialog
离线
最后一次露面:2天14小时前
职员
加入:2018-02-08 11:03
嗨,rajapurerohit,

嗨,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

Rajapurerohit
离线
最后一次露面:9个月3周前
加入:2017-04-20 09:17
嗨,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应用程序,它可能会帮助您获取更多信息。

谢谢并恭祝安康
罗希特

pm_dialog
离线
最后一次露面:2天14小时前
职员
加入:2018-02-08 11:03
嗨,rajapurerohit,

嗨,rajapurerohit,

WAIT_FOR_RECEIVED_BYTE设置接收FIFO级寄存器(I2C_RXFLR_REG I2C)。该寄存器包含接收FIFO中有效的数据条目的数量,因此,如果您不使用此定义,则无法知道何时接收数据。请检查数据表以获取更多信息。

I2C_WAIT_UNTIL_EEPROM_READY()函数进行了轮询,直到准备就绪。首先,此函数发送一个虚拟值,并且一直等到TX的FIFO为空。我强烈建议您探究您的销钉(SCL,SDA和RDY),并尝试准备一个地址。如果您尝试一下,我认为更清楚的是问题所在。

谢谢,pm_dialog

Rajapurerohit
离线
最后一次露面:9个月3周前
加入:2017-04-20 09:17
感谢你的回复,

感谢你的回复,

在评论wait_for_received_byte之后,我能够阅读数据,它不用wait_for_received_byte来工作。
但是我在阅读多个字节时面临问题。由于IQS333返回多个字节,而且我也引用了I2C_EEPROM,并尝试使用test_read_data()读取多个数据;功能,即使我更改各自的地址,我也总是会在缓冲区中获得同样的WHO_I AM注册数据。

您能建议我任何读20比特的功能吗?

谢谢并恭祝安康
罗希特

pm_dialog
离线
最后一次露面:2天14小时前
职员
加入:2018-02-08 11:03
嗨,rajapurerohit,

嗨,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

Rajapurerohit
离线
最后一次露面:9个月3周前
加入:2017-04-20 09:17
嗨,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;
}

谢谢并恭祝安康
罗希特

pm_dialog
离线
最后一次露面:2天14小时前
职员
加入:2018-02-08 11:03
嗨,rajapurerohit,

嗨,rajapurerohit,

让我检查您的代码片段,我会尽快与您联系。您能澄清一下是否有附件代码有任何问题?

谢谢,pm_dialog

Rajapurerohit
离线
最后一次露面:9个月3周前
加入:2017-04-20 09:17
嗨,pm_dialog,

嗨,pm_dialog,

我已经测试了摘要,但是我无法在缓冲区上观看数据。如果您验证代码并提供反馈,这对我有帮助。
那么,您能帮我在哪里犯错吗?

谢谢并恭祝安康
罗希特

pm_dialog
离线
最后一次露面:2天14小时前
职员
加入:2018-02-08 11:03
嗨,rajapurerohit,

嗨,rajapurerohit,

强烈建议使用I2C_EEPROM.H/C库中的API。您是否尝试使用I2C_EEPROM_READ_DATA()和I2C_EEPROM_WRITE_BYTE()函数来读取和写入字节到EEPROM中?如果我正确理解,您的附件代码将用于阅读/编写一个字节。

谢谢,pm_dialog

Rajapurerohit
离线
最后一次露面:9个月3周前
加入:2017-04-20 09:17
你好pm_dialog,

你好pm_dialog,

是的,我从i2ceeprom.h/.c库中使用了API。但是我已经修改并使用了read_byte和write_byte api,以读取多个字节和多个写入字节。
您是否尝试过摘要来读/编写多个字节。因为我已将其修改为多个数据。

谢谢并恭祝安康
罗希特

pm_dialog
离线
最后一次露面:2天14小时前
职员
加入:2018-02-08 11:03
嗨,rajapurerohit,

嗨,rajapurerohit,

您能否澄清一下“多个数据”的意思?I2C_EEPROM库已经通过此用途实现了API。您可以尝试I2C_EEPROM_READ_DATA()和I2C_EEPROM_WRITE_DATA()吗?我无法在SDK的默认I2C示例中复制您的问题。

谢谢,pm_dialog