4

最初,我使用了一个支持 8 位 I2C 寄存器的 eBus SDK。此 SDK 不支持 I2C 的 16 位寄存器地址。这个 sdk 是否有任何替代方案支持 I2C 的 16 位寄存器地址?

最良好的祝愿,并在此先感谢您

4

3 回答 3

5

根据其他评论,有一些概念需要澄清。所有 I2C 设备仅支持 7 位(8 位读/写)和 10 位从机寻址。然而,这不是本主题中所问的概念。

根据协议规范,I2C 以 8 位组的形式读取/写入,然后是来自接收数据的设备的确认 (ACK/NACK)。设备如何解释读取/写入的位可能因设备而异。

根据我的个人经验,我发现通常较大的寄存器地址(例如 0x1234)仅仅意味着您需要从寄存器 0x​​12 和 0x34 读取/写入。两个寄存器都将保存 8 位信息,这些信息共同构成十六进制 0x1234 引用的实际 16 位字。

正如我所提到的,这可能因设备而异。您可能需要通读特定 I2C 设备的数据表/手册,以获取有关其寄存器寻址的更多信息,以确保您从正确的寄存器读取/写入并将各个​​ 8 位组装成正确的顺序以提取相应的 16位字。

于 2013-07-17T12:40:50.957 回答
3

正如 MrHappyAsthma 完美指出的那样,I2C 是按 8 位传输组织的。您必须研究设备的文档。搜索诸如通过写入两个字节设置内部 16 位地址之类的东西,然后再进行读取(正如您提到的一两个字节)。它看起来像这样:

// register read scenario (first 0x12 will be your 8-bit API address, and you attach the 0x34 to the data part of your API)
DO WRITE: |S| slave address |W| write 0x12 | write 0x34 |S| (be careful with ordering)
DO READ:  |S| slave address |R| read 1'st byte | read 2'st byte |S| (if 16-bit data)

// register write scenario  (first 0x12 will be your 8-bit API address, and send 3-bytes of data, where first byte is your LSB address)
DO WRITE: |S| slave address |W| write 0x12 | write 0x34 | write data 1'st byte | write data 2'st byte |S| (if 16-bit data)

检查从属设备的文档。如果您能够使用您的 API 来强制进行此类传输,您可以欺骗设备为您提供所需的内容。

于 2013-08-23T03:06:23.700 回答
0

有些人似乎无法理解 I2C 外部地址、内部地址和数据之间有什么区别。

最初的问题只是“如何读取/写入 I2C 寄存器,其内部地址为 16 位?”

smbus 只处理 8 位内部地址。因此,只能读取/写入 I2C EEPROM 的前 256 个字节。

关于at24的讨论很多,但到目前为止我还没有找到任何描述如何使用它甚至安装的东西。

于 2021-12-16T13:02:44.373 回答