⚠️
大家好. .谢谢光临论坛。令人兴奋的消息!我们现在在移动的过程中,我们的新论坛平台,将提供更好的功能和包含在主对话框的网站。所有文章和帐户已经被迁移。我们现在只接受交通新论坛,请发布任何新的线程//www.wsdof.com/support。我们将修复bug /优化搜索和标签在接下来的日子里。
12个新帖子/ 0
最后发表
Rajapurerohit
离线
最后看到:1年11个月前
加入:2017-04-20 09:17
I2C读/写

你好,
我工作在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;
}

附加片段之上。
需要紧急帮助。

感谢和问候
罗希特

关键词:
设备:
PM_Dialog
离线
最后看到:4个月6天前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨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

Rajapurerohit
离线
最后看到:1年11个月前
加入:2017-04-20 09:17
嗨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应用程序,它可以帮助你进一步的信息。

感谢和问候
罗希特

PM_Dialog
离线
最后看到:4个月6天前
工作人员
加入: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是空的。我强烈建议你探测针(sci, SDA和RDY),准备一个地址。如果你尝试,我认为它会更清楚问题。

谢谢,PM_Dialog

Rajapurerohit
离线
最后看到:1年11个月前
加入:2017-04-20 09:17
谢谢你的回复,

谢谢你的回复,

我能评论WAIT_FOR_RECEIVED_BYTE后,读取数据没有WAIT_FOR_RECEIVED_BYTE就工作了。
但我面临问题在阅读多个字节。作为IQS333返回多个字节,也有称为i2c_eeprom并试图读取多个数据使用test_read_data ();功能,我总是获得相同的Who_i寄存器中的数据缓冲区,即使我改变各自的地址。

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

感谢和问候
罗希特

PM_Dialog
离线
最后看到:4个月6天前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨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

Rajapurerohit
离线
最后看到:1年11个月前
加入:2017-04-20 09:17
嗨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;
}

感谢和问候
罗希特

PM_Dialog
离线
最后看到:4个月6天前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨Rajapurerohit,

让我检查你的代码片段,我将回到你尽快的反馈。请澄清,如果你有任何问题附带的代码?

谢谢,PM_Dialog

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

嗨PM_Dialog,

我已经测试了片段,但我无法看数据缓冲区。如果你验证代码和给你的反馈对我是很有帮助的。
所以你能帮我我犯错误吗?

感谢和问候
罗希特

PM_Dialog
离线
最后看到:4个月6天前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨Rajapurerohit,

强烈推荐使用i2c_eeprom的api。h / c库。你试图利用i2c_eeprom_read_data()和i2c_eeprom_write_byte()函数来读取和写入字节eepm ?附加代码是为读/写一个字节,如果我理解正确。

谢谢,PM_Dialog

Rajapurerohit
离线
最后看到:1年11个月前
加入:2017-04-20 09:17
你好PM_Dialog,

你好PM_Dialog,

是的,我从i2ceeprom.h / api的使用。c库。但是我有修改和使用read_byte和write_byte api读取多个字节和多个字节写。
你试着读/写多个字节的代码片段。因为我有修改它为多个数据。

感谢和问候
罗希特

PM_Dialog
离线
最后看到:4个月6天前
工作人员
加入:2018-02-08 11:03
嗨Rajapurerohit,

嗨Rajapurerohit,

你能明确你的意思与“多个数据”?i2c_eeprom图书馆已经实现api的使用。你能请i2c_eeprom_read_data试()和i2c_eeprom_write_data ()。我不能复制你的问题在默认i2c SDK的例子。

谢谢,PM_Dialog