Sunday, September 24, 2017

PCA9540之应用(2-channel I2C multiplexer)

        这是一款来自NXP的很老的芯片了,现在都升级为PCA9640了。是一颗很容易理解的二选一开关,在很多场合都可以应用到这种简易的IIC开关,便于系统的扩展。之所以把这么一颗简单的IIC开关拿出来,只是因为前段时间犯了一个错误导致花费了一些时间,故而记录一下。
        
器件地址
这是器件地址,很好理解,按照上篇讲到的7位地址则为0x70,即111(MSB),000(LSB)。而且这个地址全部是全固定地址,硬件无法改变,从另外一个角度来讲,一个Master下只能接一个这种开关,无法扩展多个。

控制寄存器

很明确,这里就是后三位用于开关的通道选择,由于本器件只有两个通道,所以3bit已经足以达到目的。

状态表
也很清晰,0x00是上电默认状态,此时任何一个通道都没有选通;0x04则选通的为通道0;0x05则选通的为通道1. 其中D3至D7位无需考虑,有用的只有低3位。

写寄存器
        这是写操作,请注意的是这里。这里是直接写控制寄存器,并没有常规理解上的寄存器地址。也就是说,在发送完器件地址,收到响应后直接发送控制寄存器值即可,无需先发送地址。如果一定要说地址偏移量,也可以说成是0.也即offset设置为0.因为此类IIC器件的功能非常简单,并没有太多的内容需要操作,所以并没有分区分块的操作。

读寄存器
        这是读操作。从上图可以看出,也是非常简单,只需要将R/W位改为1即可,也是没有所谓的地址的。
        当初所犯之错误就在这里,想当然的将读写地址设置为0x00。这样在写的时候还好,没有实际影响,但是在读的时候实际是有一个"地址" 的动作,这样实际写入的就是0x00,也就是说将此前已经实际写入的寄存器值(0x04或0x05)又覆盖掉了,覆盖成0x00,故而一个通道都没有打开。

--------
Any feedback, please contact @ support@itestgroup.com more information click here

Saturday, September 2, 2017

【iTestGroup】IIC总线地址之解惑

在实际项目中,经常会遇到客户对器件地址有不同的定义,刚开始总是非常困惑,不清楚7位地址与8位地址之间到底怎么转换,有些甚至还有10位地址。经过一段时间的摸索,也总算是弄明白了,记录一下。


7位地址:

在7位寻址过程中,从机地址在启动信号后的第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,其中0表示写,1表示读。
slave-address-fig1.png
图1:7位寻址。I2C总线规范规定,标准模式I2C,从机地址为7位长,其次是读/写位。
任何I2C设备都必须遵循这个标准,大部分的从机地址即为这7bit地址,不包含读写位,读写位会根据不同的函数自动添加进去。这就是我们最常见的7位器件地址。

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

10位地址:
I2C总线的10bit寻址和7bit寻址是兼容的,这样就可以在同一个总线上同时使用7bit地址和10bit地址模式的设备,在进行10bit地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是10bit地址。
slave-address-fig4.png
图4:10bit地址寻址
在使用10bit地址模式的时候,分两个字节依次传入数据即可。

Reference:
  1. http://www.usbxyz.com/archives/202
  2. IIC-BUS Specification and User Manual (http://www.nxp.com/documents/user_manual/UM10204.pdf)