嗨,对话框,
我找不到样本来使用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
rr ++;
}
这些代码线的使用是什么?
谢谢
詹姆士
设备:
对话可以帮助我吗?
我想像这样操作i2c:
-----------------------------------------
开始
发送device_addr(w)
发送Reg_Addr.
重新开始
发送device_addr(r)
读取数据
....
停止
-------------------------------
如何才能初始化HW I2C总线并生成“重启”信号?
谢谢
嗨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.
嗨,mt_dialog,
对不起,我没有逻辑分析仪。
我正在研究demo_i2c.c.c的示例代码,并尝试将我的i2c代码迁移到smartsnippets。
demo_i2c使用hw_i2c_write_byte,hw_i2c_write_buffer_sync / hw_i2c_read_buffer_sync读取fm75的reg。
阅读FM75的REG,如下所示:
启动(自动)// - >如何启动新的I2C操作?
将自动传输Divece地址(您需要在开始之前将其设置为i2c)
HW_I2C_WRITE_BYTE(寄存器地址)
HW_I2C_READ_BUFFER_SYNC / HW_I2C_WRITE_BUFFER_SYNC(读/写多个数据)
停止(自动)
我认为此过程不会生成重启信号。
如何实现我的I2C过程包括重启信号?---写入REG_ADDRESS尝试读取,然后切换到读取模式(从机读取地址),读取数据...
---------------------------
开始
发送device_addr(w)
发送Reg_Addr.
重新开始
发送device_addr(r)
读取数据
....
停止
-------------------------------
谢谢
继续:
参考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);// - >方向已更改(写入 - >读取),此问题是否发出RESTART命令并发送从属地址(读取)?然后从EEPROM读取数据?
许多步骤似乎被I2C控制器所覆盖......如果上述操作是真的。
嗨jamesleo-konka,
如上所述,优选的使用外围设备是通过适配器,因此为了启动I2C事务设置外围设备和I2C适配器并通过适配器启动事务而不是使用低级驱动程序。关于重启信号,如上所述,它的I2C模块将执行的东西,因为I2C_RESTART_EN处于活动状态,因此模块将执行的东西,您将无法强制它。
关于您发布的功能,
HW_I2C_WRITE_BUFFER_SYNC()函数,它将强制模块与写字节在总线上编写从站的地址,然后将要读取的寄存器的地址,以及在驱动程序的情况下为0x00 0x00。
HW_I2C_READ_BUFFER_SYNC()函数,这将启动读取过程,因为改变方向(从读写写),I2C模块将发出重新启动条件,并使用读取位发送从站的地址并从从机开始读取数据。
谢谢mt_dialog.