I2C地址
I2C总线是最常用的总线之一。因为它占用的I/O资源少,总线结构简单。I2C总线上设备的关系是“一主多从”,所以I2C协议中最重要的一个组成部分是I2C从设备地址。从设备地址有两种格式:7bit和12bit。由于实际使用中基本上不会挂载如此多的从设备,所以很多从设备的地址都采用7bit的格式。但是随着提供I2C接口的从设备种类越来越多 ,不同功能的从设备地址就会产生重叠。
地址冲突现象
主设备无法正常读写总线上设备地址产生冲突的从设备。通过逻辑分析仪分析总线时序,发现主设备每次请求从设备时,总线上就会有两个从设备应答,接下来的时序就乱套了。
地址冲突的原因
人为因素
在从设备选型时没有考虑到从设备地址,选用了两个相同地址的从设备。
非固定的从设备地址
一般从设备的地址经硬件上的配置后,基本都是固定的7bit。但是有一些从设备地址不是固定,如EEPROM存储器CAT24C04 。当读取CAT24C04的地址0xFF以下的数据时,从设备地址为0xA1,当读取0xFF以上的数据时从设备地址为0xA5。当总线上同时挂载了一个时钟芯片PCA8563时,因为PCA8563的从设备读取地址是0xA5,所以这两个器件就会产生了地址冲突。很多人都会只看到CAT24C04的地址是0xA1,而忽略了0xA5,从而造成了总线地址冲突。
不可避免的地址冲突
当工程师门根据项目的需求选型了两个从设备。两个从设备的地址都是不可配置,并且两个从设备地址相同。
解决方法
当从设备地址可配置时
对设备地址进行配置,避免设备地址相同。
当从设备地址不可配置时
使用多路复用器
NXP的I2C总线多路复用器,如PCA9540B是现在市面上最主流的产品之一。
使用多路开关
NXP的I2C总线多路开关,如PCA9543A是现在市面上最主流的产品之一。
归为同一组的从设备地址都不相同,把存在地址冲突的从设备放到另外一组,每次只打开一个开关,主器件每个时刻只能和其中一组设备通信。这样同样可以解决地址冲突问题。
增加一条I2C总线
现在的MCU一般都提供2个以上的I2C接口,如果在从设备地址产生冲突,并且MCU资源有剩的情况下。可以通过增加一条I2C总线来解决地址冲突问题。