产生I2C重启信号

6个职位/ 0个新职位
最后发表
jamesleo-konka
离线
最后看到:4年2个月前
加入:2017-01-22 02:42
产生I2C重启信号

嗨,对话框中,
我没有在演示项目中找到使用重启信号的示例。
通过引用Html帮助文件,我发现有一个名为“hw_i2c_set_restart_enabled”的函数。这是生成Restart信号的唯一关键步骤吗?
当用户按“写-读”操作顺序操作I2C时,硬件是否会产生重启信号?是这样的:
Start device_addr(w) A reg_addr Restart device_addr(r) A data A data

另一个问题是hw i2c驱动程序,在文件hw_i2c.c中:
在hw_i2c_read_buffer_sync函数中,有一个while循环来重复hw_i2c_read_byte_trigger(id):
While (rr < len && hw_i2c_is_tx_fifo_not_full(id)) {
hw_i2c_read_byte_trigger (id);
rr + +;

这些代码的用途是什么?

谢谢

詹姆斯

关键词:
设备:
jamesleo-konka
离线
最后看到:4年2个月前
加入:2017-01-22 02:42
对话可以帮我吗?

对话可以帮我吗?
我想这样操作I2C:
--------------------------------
开始
发送Device_addr (W)
发送Reg_addr
重新启动
发送Device_addr(右)
读取数据
....
停止
----------------------------------
如何初始化HW I2C总线和产生'重启'信号?

谢谢

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

hw_i2c_set_restart_enable()只是使I2C模块能够发出重启信号(只是设置I2C_RESTART_EN位),你不从应用程序控制重启,I2C模块将发送重启信号而不显式做任何事情,也没有应用程序使用该功能,因为默认情况下I2C_RESTART_EN是启用的(重置值是0x1),是的,您提到的顺序应该发生,因为启用的重启是默认情况下活动的。那么,你有没有尝试过I2C交易,但你没有看到这种情况发生在你的分析仪上?因为我可以这样做,而不必显式地设置一些东西,因为就像我上面提到的,它是一个默认的功能。

关于您提到的代码,该代码设置了I2C_DATA_CMD_REG中的读位,以便I2C模块向从设备提供时钟,从设备输出其数据,因此,每次hw_i2c_read_byte_trigger()执行时,I2C模块都会产生时钟周期,以便在计时器上从从计时器中读取一个字节。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
对不起,我没有逻辑分析器。
我正在研究demo_i2c.c的示例代码,并试图将我的I2C代码迁移到Smartsnippets。
Demo_i2c使用hw_i2c_write_byte,hw_i2c_write_buffer_sync/hw_i2c_read_buffer_sync读取fm75的reg。
FM75的注册表如下:
START (automatic) //——>如何启动一个新的I2C操作?
Divece地址会自动传送(你需要在开始I2C之前设置好)
hw_i2c_write_byte(注册地址)
Hw_i2c_read_buffer_sync /hw_i2c_write_buffer_sync(读写多个数据)
停止(自动)

我认为这个程序不会产生RESTART信号。
如何实现我的I2C程序包括一个RESTART信号?——write reg_address尝试读,然后切换到读模式(从读地址),读数据…
-------------------------------
开始
发送Device_addr (W)
发送Reg_addr
重新启动
发送Device_addr(右)
读取数据
....
停止
----------------------------------
谢谢

jamesleo-konka
离线
最后看到:4年2个月前
加入:2017-01-22 02:42
继续:

继续:
参考24LC256的说明书,我们可以看到I2C的Random Read sequence是:

开始
发送从属地址(控制字节,写入)
发送内存地址(2字节)
开始(重新启动)
发送从属地址(控制字节,读取)
读取数据

demo_i2c.c中的操作代码如下:

set_target_address (EEPROM_ADDRESS);
resource_acquire (RES_MASK (RES_ID_I2C1) RES_WAIT_FOREVER);
hw_i2c_write_buffer_sync(HW_I2C1, addr, sizeof(addr), &abrt_src, HW_I2C_F_NONE);//->是否生成START,并发送从地址?
hw_i2c_read_buffer_sync(HW_I2C1, read_buffer, sizeof(read_buffer) - 1, &abrt_src, HW_I2C_F_NONE);//->方向改变(写->读),这发出一个RESTART命令和发送从地址(读)?然后从EEPROM读取数据?

许多步骤似乎被I2C控制器隐藏了……如果上述操作是正确的。

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨Jamesleo-konka,

嗨Jamesleo-konka,

如上所述,外设的首选用法是通过适配器,因此为了启动I2C事务,请设置外设和I2C适配器,并通过适配器启动事务,而不是使用低级驱动程序。关于重启信号,正如前面提到的,这是I2C模块将要做的事情,因为I2C_RESTART_EN是活动的,所以这是模块将要做的事情,你不能强制它。

关于你发布的功能,

Hw_i2c_write_buffer_sync()函数,它将强制模块在总线上用写字节写入从服务器的地址,然后是你想要读取的寄存器地址,在驱动程序的情况下是0x00 0x00。

hw_i2c_read_buffer_sync()函数,这将启动读取过程,由于方向改变(从读到写),I2C模块将发出一个重启条件,发送从机的地址与读位,并开始从从机读取数据。

由于MT_dialog