生成I2C重启信号

6个帖子/ 0新
最后一篇
jamesleo-konka
离线
最后一次露面:3年11个月前
加入:2017-01-22 02:42
生成I2C重启信号

Hi, Dialog,
我找不到样本来使用Demo项目中的重启信号。
通过引用HTML帮助文件,我发现有一个名为'hw_i2c_set_restart_enabled的函数。这是生成重启信号的唯一一个关键步骤吗?
将硬件生成一个重启信号当你ser operate I2C in sequence of 'write - read' action? like this:
启动device_addr(w)reg_addr重新启动device_addr(r)数据是数据...停止

另一个问题是hw i2c驱动程序,在文件hw_i2c.c中:
在功能函数hw_i2c_read_buffer_sync中,有一段时间循环重复hw_i2c_read_byte_trigger(ID):
而(rr hw_i2c_read_byte_trigger(id);
rr++;
}

这些代码线的使用是什么?

Thanks

詹姆士

关键词:
设备:
jamesleo-konka
离线
最后一次露面:3年11个月前
加入:2017-01-22 02:42
对话可以帮助我吗?

对话可以帮助我吗?
我想像这样操作i2c:
-----------------------------------------
开始
Send Device_addr(W)
发送Reg_Addr.
重新开始
发送device_addr(r)
读取数据
....
停止
-------------------------------------------
如何才能初始化HW I2C总线并生成“重启”信号?

Thanks

mt_dialog.
离线
最后一次露面:1个月1天前
职员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

HW_I2C_SET_RESTART_ENABLE()只需启用I2C模块要发出重启信号的能力(仅设置I2C_RESTART_EN位),您不控制从应用程序重新启动,I2C模块将在不明确执行任何内容的情况下发送重启信号,也有由于默认情况下,没有使用该功能的应用程序(重置值为0x1),并且是默认情况下启用的重新启用以来,因此应该发生的序列。所以你试过I2C交易,你没有看到你的分析仪发生这种情况吗?由于我能够做到这一点而无需明确设置某些东西,因为就像上面提到的那样,它是它的默认功能。

关于您提到的代码,代码将I2C_DATA_CMD_REG中的读取位设置为I2C模块为从设备提供时钟和从设备吐出其数据,因此每次HW_I2C_READ_BYTE_TRIGGES()获取I2C模块产生时钟周期,以便在从站的计时器处读取一个字节。

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:3年11个月前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
对不起,我没有逻辑分析仪。
我正在研究demo_i2c.c.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)
HW_I2C_WRITE_BYTE(寄存器地址)
HW_I2C_READ_BUFFER_SYNC / HW_I2C_WRITE_BUFFER_SYNC(读/写多个数据)
停止(自动)

我认为此过程不会生成重启信号。
如何实现我的I2C过程包括重启信号?---写入REG_ADDRESS尝试读取,然后切换到读取模式(从机读取地址),读取数据...
---------------------------
开始
Send Device_addr(W)
发送Reg_Addr.
重新开始
发送device_addr(r)
读取数据
....
停止
-------------------------------------------
Thanks

jamesleo-konka
离线
最后一次露面:3年11个月前
加入:2017-01-22 02:42
继续:

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

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

demo_i2c.c中的操作代码是这样的:

set_target_address(EEPROM_ADDRESS);
resource_acquire(res_mask(res_d_i2c1),res_wait_forever);
hw_i2c_write_buffer_sync(hw_i2c1,addr,sizeof(addr),&abrt_src,hw_i2c_f_none);// - >此生成启动,并发送从属地址?
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_dialog.
离线
最后一次露面:1个月1天前
职员
加入:2015-06-08 11: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.