⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
12个帖子/ 0新
最后一篇
Rajapurerohit.
离线
最后一次露面:10个月1周前
加入:2017-04-20 09:17
I2C读写

大家好,
我正在研究I2C接口代码。我已经提到了I2C_EEPROM驱动程序代码。很少有代码段我不理解意味着准确的准确工作。
如果有人帮助理解,那么它将对我非常有帮助的接口我的传感器。

从设备使用IS IQS333触摸传感器。在哪里我无法正常沟通。

以下是代码片段,请解释工作
在Ready Byte功能
1.SEND_I2C_COMMAND (0 x0100);//设置R/W位为1 (read access)
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
for (uint32_t ui32index = 0;ui32Indx < I2C_MAX_RETRIES;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.
离线
最后一次露面:57分钟5秒前
职员
加入:2018-02-08 11:03
嗨rajapurerohit,

嗨rajapurerohit,

SEND_I2C_COMMAND将需要的数据推入I2C总线。SEND_I2C_COMMAND (0 x0100);会导致阅读教学,因此I2C模块将问题重新启动条件和力量模块对总线的地址和奴隶的阅读,提供时钟的奴隶从奴隶为了打卡数据本身。请检查i2c_eeprom.c文件中SEND_I2C_COMMAND(X)的定义。此定义设置I2C_DATA_CMD_REG,因此请查看数据表以获得更多信息。WAIT_FOR_RECEIVED_BYTE只在充当master时控制方向。,该宏用于停止代码,并等待设备从FIFO接收数据。你能解释一下你的问题是什么吗?我没有IQS333触摸传感器,所以我无法复制你的问题。如果你想知道更多的信息,请告诉我。

谢谢,PM_DIALOG.

Rajapurerohit.
离线
最后一次露面:10个月1周前
加入:2017-04-20 09:17
嗨PM_Dialog,

嗨PM_Dialog,

谢谢您的答复。

1.如果我在代码中不包括wait_for_received_byte,该怎么办?

2.检查是否收到ACK的检查流程如何?
for (uint32_t ui32index = 0;ui32Indx < I2C_MAX_RETRIES;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个引脚SCL,SDA和RDY。每当RDY线路低14毫秒时,设备开始与Master通信。但在我的情况下,如果我试图读取地址代码,始终陷入wait_for_received_byte。我已附加IQS333应用笔记,它可能会帮助您获取更多信息。

感谢和问候
罗希特

PM_DIALOG.
离线
最后一次露面:57分钟5秒前
职员
加入:2018-02-08 11:03
嗨rajapurerohit,

嗨rajapurerohit,

WAIT_FOR_RECEIVED_BYTE设置接收FIFO级别寄存器(I2C_RXFLR_REG I2C)。这个寄存器包含接收FIFO中有效数据条目的数量,所以如果你不使用这个定义,你将无法知道你何时接收数据。请查看数据表获取更多信息。

I2C_WAIT_UNTIL_EEPROM_READY()函数是轮询,直到I2C已准备就绪。首先,此函数发送伪值,直到TX的FIFO为空。我强烈建议你探测你的引脚(SCL,SDA和RDY)并尝试准备好地址。如果你试过,我认为这将更清楚这个问题可能是什么。

谢谢,PM_DIALOG.

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

感谢您的回复,

我能够在评论wait_for_receive_byte后读取数据,它没有wait_for_received_byte工作。
但我正在阅读多个字节时面临问题。由于IQS333返回多个字节,并且我还引用了I2C_EEPROM,并尝试使用test_read_data()读取多个数据;函数,即使我更改了各个地址,我也总是在缓冲区中获得相同的人在缓冲区中注册数据。

你能建议我任何读取20字节的函数吗?

感谢和问候
罗希特

PM_DIALOG.
离线
最后一次露面:57分钟5秒前
职员
加入: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。请注意,数据将首先存储在38副FIFO中,之后read_data_single()发送读取命令(0x0100)。因此,您应该定义TMP_Size等于或小于32字节。

谢谢,PM_DIALOG.

Rajapurerohit.
离线
最后一次露面:10个月1周前
加入:2017-04-20 09:17
嗨PM_Dialog,

嗨PM_Dialog,

非常感谢您的回复,

我有写入代码以通过引用I2C_EEPROM读取多个读/写数据到传感器。
附加是我的读/写代码片段。你能帮我帮助我是否是正确的或要完成的任何更改。
特别是写多个数据。

//读取数据
Iqs333_error_code iqs333_read_byte(uint8_t address, uint8_t *byte, uint32_t size)
{
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 (0 x0100);//设置次次读取访问
}

//关键部分结束
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_ACTIVITY ();//等到没有主活动

返回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 {
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;
}

感谢和问候
罗希特

PM_DIALOG.
离线
最后一次露面:57分钟5秒前
职员
加入:2018-02-08 11:03
嗨rajapurerohit,

嗨rajapurerohit,

让我检查你的代码片段,我会尽快给你我的反馈。附件的代码你有什么问题吗?

谢谢,PM_DIALOG.

Rajapurerohit.
离线
最后一次露面:10个月1周前
加入:2017-04-20 09:17
嗨PM_Dialog,

嗨PM_Dialog,

我已经测试了这些片段,但我无法查看缓冲区上的数据。如果您验证代码并给出您的反馈,这将对我有帮助。
那么你能帮我犯错吗?

感谢和问候
罗希特

PM_DIALOG.
离线
最后一次露面:57分钟5秒前
职员
加入:2018-02-08 11:03
嗨rajapurerohit,

嗨rajapurerohit,

强烈推荐使用i2c_eeprom.h/c库中的api。您是否尝试使用i2c_eeprom_read_data()和i2c_eeprom_write_byte()函数向EEPROM读写字节?你所附的代码是为了读/写一个字节,如果我理解正确。

谢谢,PM_DIALOG.

Rajapurerohit.
离线
最后一次露面:10个月1周前
加入:2017-04-20 09:17
你好PM_Dialog,

你好PM_Dialog,

是的,我使用i2ceeprom.h / .c库的API。但我已经修改并使用了READ_BYTE和WRITE_BYTE API来读取多个字节和多个写入字节。
您是否尝试读取/写入多个字节的代码片段。因为我已经为多个数据修改了它。

感谢和问候
罗希特

PM_DIALOG.
离线
最后一次露面:57分钟5秒前
职员
加入:2018-02-08 11:03
嗨rajapurerohit,

嗨rajapurerohit,

你能澄清你的意思是“多个数据”?i2c_eeprom库已经从此使用中实现了API。您可以尝试i2c_eeprom_read_data()和i2c_eeprom_write_data()。我无法在SDK的默认I2C示例中复制您的问题。

谢谢,PM_DIALOG.