2013-07-16 52 views
3

最初,我使用了支持I2C的8位寄存器的eBus SDK。该SDK不支持I2C的16位寄存器地址。这个sdk是否有其他支持I2C的16位寄存器地址?支持16位地址的I2c

最良好的祝愿,并感谢您提前

+3

I2C是嵌入式总线,可以在许多不同的芯片上找到。它甚至没有8位寻址(最后一位不是地址位,而是R/W位)。我很困惑你的问题实际上是什么。 – MSalters

+3

如果我理解正确,您想通过I2C读取16位数据?通常设备将只使用2个寄存器来存储16位。 I.E.寄存器0x00将是Data的最低有效位(LSB)。寄存器0x01将是Data的最高有效位(MSB)。您可以将这些附加在一起以获得完整的16位寄存器。你与哪个设备进行通信,并且我理解正确吗? – MrHappyAsthma

+0

@ MSalters:对不起,我很抱歉。我有一个设备,我需要通过I2C总线读取它的寄存器。这些寄存器具有由16位表示的地址(例如0x1234)。这些寄存器的值是8位或16位(存储在一个或两个寄存器中)。 –

回答

4

有几个概念基础上的其他意见清理。所有的I2C器件仅支持7位(8个具有读/写)和10位从寻址。然而,这并不是在主题中提出的概念。

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

根据我个人的经验,我发现通常一个较大的寄存器地址 - 例如0x1234 - 仅仅意味着您需要从寄存器0x12和0x34读/写。两个寄存器将保存8位信息,这些信息一起构成由十六进制0x1234引用的实际16位字。

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

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