在实际项目中,经常会遇到客户对器件地址有不同的定义,刚开始总是非常困惑,不清楚7位地址与8位地址之间到底怎么转换,有些甚至还有10位地址。经过一段时间的摸索,也总算是弄明白了,记录一下。
7位地址:
10位地址: 7位地址:
在7位寻址过程中,从机地址在启动信号后的第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,其中0表示写,1表示读。
、

图1:7位寻址。I2C总线规范规定,标准模式I2C,从机地址为7位长,其次是读/写位。
任何I2C设备都必须遵循这个标准,大部分的从机地址即为这7bit地址,不包含读写位,读写位会根据不同的函数自动添加进去。这就是我们最常见的7位器件地址。
8位地址:
一些厂商在提供从机地址的时候说的是包含了读写位的8bit地址,比如他说写地址为0x92,读地址为0x93,如下图所示

图2: 8位寻址
这种情况下,只需要将这个地址的前7bit提取出来,比如为0x49。所以这里很关键的一点是:7位地址的编码规则是xxx:xxxx的分隔形式。从8位地址转换到7位地址时,舍弃掉读写位,也就是最后一位后,按照xxx:xxxx的格式再次编码即可。
还有一种方式可以判断厂商提供的地址是7bit模式地址还是8bit地址模式的地址,7bit地址模式下,地址的取值范围在0x07到0x78之间,若超过了这个范围,那么这个地址可能就是8bit地址。

图3:有效的7bit地址范围
I2C总线的10bit寻址和7bit寻址是兼容的,这样就可以在同一个总线上同时使用7bit地址和10bit地址模式的设备,在进行10bit地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是10bit地址。

图4:10bit地址寻址
在使用10bit地址模式的时候,分两个字节依次传入数据即可。
Reference:
- http://www.usbxyz.com/archives/202
- IIC-BUS Specification and User Manual (http://www.nxp.com/documents/user_manual/UM10204.pdf)
No comments:
Post a Comment