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

嗨,对话框中,
我没有在演示项目中找到使用重启信号的示例。
通过引用Html帮助文件,我发现有一个名为'hw_i2c_set_restart_enabled '的函数。这是生成重启信号的唯一关键步骤吗?
当用户按“写-读”动作的顺序操作I2C时,硬件是否会产生重启信号?是这样的:
启动device_addr(w) A reg_addr重启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年4个月前
加入:2017-01-22 02:42
对话能帮到我吗?

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

谢谢

MT_dialog
离线
最后看到:6个月2个星期前
工作人员
加入: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年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
对不起,我没有逻辑分析仪。
我正在研究demo_i2c.c的示例代码,并试图将我的I2C代码迁移到smarsnippets。
Demo_i2c使用hw_i2c_write_byte,hw_i2c_write_buffer_sync/hw_i2c_read_buffer_sync读取fm75的reg。
像这样阅读FM75的规则:
START (automatically) //——>如何启动一个新的I2C操作?
设备地址将自动传输(在I2C开始前需要设置)
hw_i2c_write_byte(注册地址)
Hw_i2c_read_buffer_sync /hw_i2c_write_buffer_sync(读/写一些数据)
停止(自动)

我认为这个程序不会产生RESTART信号。
如何实现我的I2C过程包括重启信号?——write reg_address attempt to read and then switch to read mode (Slave read address), read data…
-------------------------------
开始
发送Device_addr (W)
发送Reg_addr
重新启动
发送Device_addr(右)
读取数据
....
停止
----------------------------------
谢谢

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

继续:
参考24LC256的说明书,我们可以看到I2C的随机读序列是:

开始
发送从地址(控制字节,写)
发送内存地址(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), & abt_src, HW_I2C_F_NONE);//->是否生成START,并发送Slave地址?
hw_i2c_read_buffer_sync(HW_I2C1, read_buffer, sizeof(read_buffer) - 1, & abt_src, HW_I2C_F_NONE);//->方向改变(写->读),是否发出RESTART命令并发送Slave地址(读)?然后从EEPROM读取数据?

I2C控制器隐藏了很多步骤…如果上述行为是真的。

MT_dialog
离线
最后看到:6个月2个星期前
工作人员
加入: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模块将发出一个重启条件,发送带有读位的slave地址,并开始从slave读取数据。

由于MT_dialog