
最近,不少小伙伴在使用I2C输出的传感器时,遇到了同一个问题:一路I2C总线上要挂多个传感器,结果地址全都一样——典型的I2C地址冲突。今天我们就来好好聊聊这件事。
先搞懂:什么是I2C地址冲突?
I2C协议使用7位地址(或10位地址)来区分总线上的不同设备。当两个或以上设备拥有相同的I2C地址时,冲突就发生了,通信会乱套。
常见冲突场景
多个同型号传感器
比如你想接4个MPU6050陀螺仪,但它只有两个可选地址:0x68和0x69,最多只能接2个,不够用。
地址完全固定的设备
比如DS1307 RTC时钟模块,固定地址0x68。如果需要多个这类设备,冲突无法避免。
总线负载限制
I2C总线有电容负载限制(标准模式400pF),每个设备大约增加10pF。设备太多会超载,影响通信。
长距离布线
在不同位置挂多组设备,长线会增加电容和电阻,信号质量下降,可靠性变差。
有办法解决吗?当然有!
一、硬件方案(推荐)
1. 利用地址引脚配置地址
很多I2C设备(如BMP280、AT24Cxx)都带有专用地址引脚,通常标为A0, A1, A2或SDO、ADDR。
通过将这些引脚接到VCC(高电平)或GND(低电平),就能直接改变I2C地址——零成本、最理想。
2. 使用I2C多路复用器(最通用)
如果传感器地址固定,或者需要挂载超过8个同地址设备,最稳妥的方案就是I2C多路复用器(如TCA9548)。
它的原理很简单:像一个“通道切换器”,所有设备虽然地址相同,但被物理隔离在不同通道上。
主控先切到通道1与设备1通信,完成后切到通道2……彻底物理隔离,稳定可靠。
通过级联,最多可支持64个设备。

二、软件方案(谨慎使用)
分时供电/片选
无法改地址、不想加硬件成本时,可以通过软件控制设备的电源(VCC)或复位引脚(Reset),分时启动设备。
原理:只给第一片供电→读取数据→断电→给第二片供电→读取数据……同一时刻总线上只有一个设备,自然不会冲突。
优点:零成本,不改变总线拓扑。
缺点:
无法同时读取,数据有时间差。
需要主控提供额外GPIO引脚控制每个设备的电源或复位脚。
硬件设计要注意:断电后设备必须彻底释放总线(SDA/SCL呈高阻态)。

除了TCA9548,还有哪些选择?
I2C多路复用器不仅能解决地址冲突,还能应对总线负载过大的问题。它像一个可控的通道切换器,让主控分时与不同通道上的设备通信。
市面上主流型号按通道数分类,核心参数对比如下(常见型号一览):
常见I2C多路复用器型号与参数对比
最后想问问你:
在实际项目中,你遇到过哪些“奇奇怪怪”的I2C地址冲突?
是用多路复用器硬刚,还是用分时供电“软解决”?
欢迎在评论区分享你的实战经验,也许你的解法正好能帮到另一位正在头疼的工程师~
-
传感器
+关注
关注
2578文章
55868浏览量
795632 -
总线
+关注
关注
10文章
3067浏览量
91976 -
I2C
+关注
关注
28文章
1567浏览量
131982
发布评论请先 登录
MM32F013x上实现I2C多地址的功能应用
基于I2C总线图像传感器配置的FPGA实现
两个PS I2C控制器的回环测试
如何在Versal平台实现两个PS I2C控制器的回环
一路I2C上链接2个两个相同地址的传感器元件,如何实现读取操作?
评论