产生I2C重启信号

6个员额/0个新员额
最后一篇文章
jamesleo-konka
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
产生I2C重启信号

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

另一个问题是hw_i2c.c文件中的hw i2c驱动程序:
在hw_i2c_read_buffer_sync函数中,有一个while循环来重复hw_i2c_read_byte_触发器(id):
而(rrhw_i2c_read_byte_trigger (id);
rr + +;
}

这些代码行的用途是什么?

谢谢

詹姆斯

关键词:
设备:
jamesleo-konka
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
你能帮我吗?

你能帮我吗?
我想这样操作I2C:
--------------------------------
开始
发送Device_addr (W)
发送注册地址
重新启动
发送设备地址(R)
读取数据
....
停止
----------------------------------
如何初始化硬件I2C总线并生成“重启”信号?

谢谢

MT_对话框
离线
最后一次见到:6个月2周前
工作人员
加入:2015-06-08 11:34
嗨,康佳先生,

嗨,康佳先生,

hw_i2c_set_restart_enable()只允许i2c模块发出重启信号(只设置i2c_restart_EN位),您不需要从应用程序控制重启,i2c模块将发送重启信号,而无需显式执行任何操作,此外,没有应用程序使用该功能,因为I2C_RESTART_EN在默认情况下处于启用状态(重置值为0x1),是的,您提到的顺序应该发生,因为RESTART enabled在默认情况下处于激活状态。那么,您是否尝试过I2C事务,但在分析仪上没有看到这种情况?因为我能够做到这一点,而不必显式地设置一些东西,因为就像我上面提到的,它是一个默认的函数性。

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

谢谢你的对话

jamesleo-konka
离线
最后一次见到:4年4个月前
加入: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的注册码:
启动(自动)/-->如何启动新的I2C操作?
Divece地址将自动传输(您需要在开始I2C之前进行设置)
硬件i2c写入字节(寄存器地址)
hw_i2c_读取_缓冲区_同步/hw_i2c_写入_缓冲区_同步(读取/写入大量数据)
停止(自动)

我认为这个过程不会产生重启信号。
如何实现I2C程序,包括重新启动信号?--写入注册表地址尝试读取,然后切换到读取模式(从读取地址),读取数据。。。
-------------------------------
开始
发送Device_addr (W)
发送注册地址
重新启动
发送设备地址(R)
读取数据
....
停止
----------------------------------
谢谢

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

继续:
参考24LC256手册,我们可以看到I2C的随机读取顺序为:

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

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

设置目标地址(EEPROM地址);
资源获取(资源掩码(资源ID I2C1),资源永远等待);
hw_i2c_写入_缓冲区_同步(hw_I2C1,addr,sizeof(addr)和abrt_src,hw_i2c_F_无);//->这是否会生成START并发送从属地址?
hw_i2c_read_buffer_sync(HW_I2C1, read_buffer, sizeof(read_buffer) - 1, & abt_src, HW_I2C_F_NONE);//->方向改变(写->读),是否发出RESTART命令并发送Slave地址(读)?然后从EEPROM读取数据?

I2C控制器似乎隐藏了许多步骤。。。如果上述操作为真。

MT_对话框
离线
最后一次见到:6个月2周前
工作人员
加入:2015-06-08 11:34
嗨,康佳先生,

嗨,康佳先生,

如前所述,外围设备的首选用途是通过适配器,因此为了启动I2C事务,请设置外围设备和I2C适配器,并通过适配器而不是通过使用低级驱动程序启动事务。关于重启信号,如前所述,这是I2C模块将要做的事情,因为I2C_restart_EN处于活动状态,所以这是模块将要做的事情,您将无法强制执行。

关于您发布的功能,

hw_i2c_write_buffer_sync()函数,该函数将强制模块使用写入字节写入总线上的从机地址,然后写入您要读取的寄存器地址,如果是驱动程序,则为0x00 0x00。

hw_i2c_read_buffer_sync()函数,这将启动读取过程,由于方向发生变化(从读取到写入),i2c模块将发出重新启动条件,发送从机地址和读取位,并开始从从机读取数据。

谢谢你的对话