生成I2C重启信号

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

嗨,Dialog,
我找不到样本来使用Demo项目中的重启信号。
通过引用HTML帮助文件,我发现有一个名为'hw_i2c_set_restart_enabled的函数。这是生成重启信号的唯一一个关键步骤吗?
当用户按“写-读”操作顺序操作I2C时,硬件是否会产生重启信号?这样地:
启动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 硬件i2c读取字节触发器(id);
rr++;
}

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

谢谢

詹姆士

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

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

谢谢

mt_dialog.
离线
最后一次露面:6天16小时前
员工
加入: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.

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

嗨,mt_dialog,
对不起,我没有逻辑分析仪。
我正在研究demo_i2c.c.c的示例代码,并尝试将我的i2c代码迁移到smartsnippets。
演示i2c使用硬件i2c写入字节,硬件i2c写入缓冲区同步/硬件i2c读取缓冲区同步来读取fm75的寄存器。
阅读FM75的REG,如下所示:
启动(自动)// - >如何启动新的I2C操作?
将自动传输Divece地址(您需要在开始之前将其设置为i2c)
HW_I2C_WRITE_BYTE(寄存器地址)
HW_I2C_READ_BUFFER_SYNC / HW_I2C_WRITE_BUFFER_SYNC(读/写多个数据)
停止(自动)

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

孔卡
离线
最后一次露面:3年9个月前
加入: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);//->方向已更改(写入->读取),是否发出重新启动命令并发送从属地址(读取)?然后从EEPROM读取数据?

许多步骤似乎被I2C控制器所覆盖......如果上述操作是真的。

mt_dialog.
离线
最后一次露面:6天16小时前
员工
加入: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.