支持 16 位地址的 I2c

Posted

技术标签:

【中文标题】支持 16 位地址的 I2c【英文标题】:I2c that support 16 bits address 【发布时间】:2013-07-15 02:51:14 【问题描述】:

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

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

【问题讨论】:

I2C 是一种嵌入式总线,可在许多不同的芯片上找到。它甚至没有 8 位寻址(最后一位不是地址位,而是 R/W 位)。我很困惑你的问题到底是什么。 如果我理解正确,您想通过 I2C 读取 16 位数据吗?通常设备将只使用 2 个寄存器来存储 16 位。 IE。寄存器 0x​​00 将是数据的最低有效位 (LSB)。寄存器 0x​​01 将是数据的最高有效位 (MSB)。您可以将它们附加在一起以获得完整的 16 位寄存器。您正在与什么设备通信,我是否理解正确? @MSalters:我很抱歉没有这么清楚。我有一个设备,我需要通过 I2C 总线读取它的寄存器。这些寄存器的地址由 16 位表示(例如 0x1234)。这些寄存器的值是 8 位或 16 位(存储在一或两个寄存器上)。 @MrHappyAsthma:你正确地理解了我。但是,该设备中的寄存器地址是用 16 位而不是 8 位表示的,而 eBus SDK 只允许寻址具有 8 位地址的寄存器。换句话说:寄存器地址 = 0x1234,寄存器值 = 0xab 或 0xabcd。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

正如 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 来强制进行此类传输,您可以欺骗设备为您提供所需的内容。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于支持 16 位地址的 I2c的主要内容,如果未能解决你的问题,请参考以下文章

原理图查看I2C设备地址以及使用STM32和Zephyr Driver进行IC通讯时的注意事项

原理图查看I2C设备地址以及使用STM32和Zephyr Driver进行IC通讯时的注意事项

i2c协议

i2c协议

I2C时序波形图

请教stm32的i2c接收问题