产生I2C重启信号

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

Hi, Dialog,
在演示项目中,我没有找到使用重启信号的示例。
通过引用Html帮助文件,我发现有一个名为“hw\u i2c\u set\u restart\u enabled”的函数。这是生成重启信号的唯一关键步骤吗?
将硬件生成一个重启信号当你ser operate I2C in sequence of 'write - read' action? like this:
启动设备\u addr(w)A寄存器\u addr重新启动设备\u addr(r)A数据A数据…停止

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

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

Thanks

詹姆斯

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

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

Thanks

MT\u对话框
离线
最后一次见到:1周4天前
工作人员
已加入:2015-06-08 11:34
嗨,孔卡先生,

嗨,孔卡先生,

hw\u i2c\u set\u restart\u enable()只允许i2c模块发出重新启动信号(只设置i2c\u restart\u EN位),您不需要从应用程序控制重新启动,i2c模块将发送重新启动信号,而无需显式执行任何操作,此外,没有应用程序使用该功能,因为I2C\u RESTART\u EN在默认情况下处于启用状态(重置值为0x1),是的,您提到的序列应该发生,因为RESTART enabled在默认情况下处于活动状态。所以你有没有试过I2C的交易,你没有看到这种情况发生在你的分析仪上?因为我能够做到这一点,而不必显式地设置一些东西,因为就像我上面提到的那样,它是一个默认的函数性。

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

谢谢你的对话

jamesleo-konka
离线
最后一次见到:3年9个月前
已加入:2017-01-22 02:42
嗨,MT\u Dialog,

嗨,MT\u Dialog,
对不起,我没有逻辑分析仪。
我正在研究demo_i2c.c的示例代码,并尝试将i2c代码迁移到Smartsnippets。
demo_i2c use hw_i2c_write_byte,hw_i2c_write_buffer_sync/hw_i2c_read_buffer_sync to read fm75's reg.
像这样读FM75的reg:
启动(自动)//-->如何启动新的I2C操作?
Divece地址将自动传输(需要在开始I2C之前设置)
硬件i2c写字节(寄存器地址)
硬件i2c读取缓冲区同步/硬件i2c写入缓冲区同步(读取/写入大量数据)
停止(自动)

我想这个程序不会产生重启信号。
如何实现我的I2C程序包括一个重启信号?---写入寄存器地址尝试读取,然后切换到读取模式(从读取地址),读取数据。。。
-------------------------------
起点
Send Device_addr(W)
发送注册地址
重新启动
发送设备地址(R)
读取数据
....
住手
----------------------------------
Thanks

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

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

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

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

设置目标地址(EEPROM地址);
资源获取(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); //-> direction changed (write -> read), does this issue a RESTART command and send Slave address(Read)? and then read data from EEPROM?

I2C控制器似乎隐藏了许多步骤。。。如果上述行为属实。

MT\u对话框
离线
最后一次见到:1周4天前
工作人员
已加入:2015-06-08 11:34
嗨,孔卡先生,

嗨,孔卡先生,

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

关于你发布的功能,

函数,该函数将强制模块在总线上用一个写入字节写入从机的地址,然后再写入要读取的寄存器的地址,如果驱动程序是0x00 0x00。

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

谢谢你的对话