⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
12个职位/ 0个新职位
最后发表
Rajapurerohit
离线
最后看到:10个月1周前
加入:2017-04-20 09:17
I2C读写

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

从设备使用的是IQS333触摸传感器。我无法正常沟通的地方。

下面是代码片段,请解释工作
就绪字节函数
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 (();//创建虚拟访问
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小时36分钟前
工作人员
加入: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.Check if ACK is received snippet的流是怎样的?
for (uint32_t ui32index = 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寄存器
if ((ui16tx_abrt_source & ABRT_7B_ADDR_NOACK) == 0);

返回I2C_NO_ERROR;


返回I2C_7B_ADDR_NOACK_ERROR;

3.IQS333是一种使用I2C协议进行通信的prosensekit。它有SCL, SDA和RDY 3个引脚。当RDY线路低14msec时,设备开始与主设备通信。但是在我的例子中,如果我试图读取地址代码,总是卡在WAIT_FOR_RECEIVED_BYTE中。我附上了IQS333的申请说明,它可能有助于你进一步的信息。

感谢和问候
罗希特

PM_Dialog
离线
最后看到:2小时36分钟前
工作人员
加入: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_RECEIVED_BYTE之后读取数据,它在没有WAIT_FOR_RECEIVED_BYTE的情况下工作。
但是我面临着读取多个字节的问题。由于IQS333返回多个字节,我也参考了i2c_eeprom,并试图读取多个数据使用test_read_data();函数,我总是得到相同的Who_i am寄存器数据在缓冲区,即使我改变各自的地址。

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

感谢和问候
罗希特

PM_Dialog
离线
最后看到:2小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨Rajapurerohit,

test_read_data()函数调用i2c_eeprom_read_data(),它将数据从I2C EEPROM读取到给定指针的内存位置。在本例中,一次读取32个字节。因此,如果您希望每次读取20个字节,您应该修改i2c_eeprom_read_data(),并将tmp_size更改为20。注意,数据首先存储在38 byes 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 <大小;ui8j + +)

WAIT_WHILE_I2C_FIFO_IS_FULL ();//如果Tx FIFO已满,则等待
SEND_I2C_COMMAND (0 x0100);//设置读访问次数

//临界区结束
GLOBAL_INT_RESTORE ();

//获取接收到的数据
For (ui8j = 0;ui8j <大小;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 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 <大小;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
离线
最后看到:2小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨Rajapurerohit,

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

谢谢,PM_Dialog

Rajapurerohit
离线
最后看到:10个月1周前
加入:2017-04-20 09:17
嗨PM_Dialog,

嗨PM_Dialog,

我已经测试了这些片段,但我无法查看缓冲区上的数据。如果您验证代码并给出您的反馈,这将对我有帮助。
所以你能帮我解释一下我哪里做错了吗?

感谢和问候
罗希特

PM_Dialog
离线
最后看到:2小时36分钟前
工作人员
加入: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,

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

感谢和问候
罗希特

PM_Dialog
离线
最后看到:2小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨Rajapurerohit,

你能解释一下“多重数据”是什么意思吗?i2c_eeprom库已经实现了这种使用的api。请尝试i2c_eeprom_read_data()和i2c_eeprom_write_data()。我无法在SDK的默认i2c示例中复制您的问题。

谢谢,PM_Dialog