TCA9548A I2C多路复用器接ESP32:解决传感器地址冲突,8通道挂满不撞车

2026-10-22 13:01:27 58阅读

玩I2C遇到地址冲突?一片TCA9548A就搞定

做机器人最烦的不是写代码,是传感器一多就撞地址。两个BMP280气压计、三个OLED屏,全是0x76或0x3C——I2C总线上同一个地址只能挂一个设备,这怎么办?花几百块换SPI接口的传感器?没必要。一片TCA9548A(也叫PCA9548A)I2C多路复用器,十几块钱,直接解决。

TCA9548A I2C多路复用器模块实物图

TCA9548A是TI出品的一颗8通道I2C开关芯片。它本身的地址是0x70(可以通过A0-A2三个引脚改到0x70-0x77),接上之后,你往它写一个字节,就能选通对应的通道(CH0-CH7)。比如写0x01选通CH0,写0x04选通CH2,写0xFF八个通道全开。选通之后,挂在对应通道上的设备就能被主机正常访问了。

接线其实很简单

TCA9548A模块一般有10个引脚:VCC接3.3V或5V,GND接地,SDA和SCL接主控的I2C总线。然后它分出8组通道,每组各有SDA和SCL(有些模块还把每组的VCC和GND也引出来了)。你要做的就是把不同传感器接到不同通道的SDA/SCL上。

TCA9548A I2C多路复用器模块与排针配件实物图

注意几个坑:第一,I2C总线必须接上拉电阻,一般模块自带4.7K上拉,但如果你挂的设备多、线长,可能需要外加更强的上拉(比如2.2K)。第二,A0-A2三个地址选择引脚默认拉高,所以默认地址是0x77,有些模块默认接地就是0x70——买之前看一眼原理图或者直接用I2C扫描确认。

Arduino代码怎么写

核心就是一步:在访问某个通道上的设备之前,先写一个字节选中那个通道。用Wire库的话就是:

Wire.beginTransmission(0x70); Wire.write(0x01); Wire.endTransmission(); 这样就切到了CH0。接下来你正常调用Wire操作挂在CH0上的传感器就行了,比如读BMP280的气压数据。然后想读CH1上的另一个BMP280?再写一次0x02切过去。

有个小技巧:如果你确定某几个通道不会同时使用,可以在每次读传感器前都先切通道,这样代码逻辑更清晰,也不容易串数据。千万别在一个循环里连续读两个同地址的传感器却不切通道——你会读到一堆乱码或者上一次残留的数据。

实际用在机器人上是什么场景

最典型的就是多路距离传感器或者多路IMU。比如你做一台六足机器人,每条腿末端装一个VL53L0X测距模块,六个模块全是0x29地址——不用复用器根本没法同时用。挂上TCA9548A,每个模块接一个通道,循环切换读取,十分钟搞定。另外,多路OLED显示、多路温湿度传感器、多路电流传感器,原理都一样。

总结一下:I2C地址冲突是新手做机器人最容易踩的坑之一。TCA9548A就是专门解决这个问题的,十几块钱、接线简单、代码也不复杂。如果你的项目里有三个以上I2C设备撞了地址,直接上这颗芯片,省得折腾换接口。


作者:开源复现员
链接:https://www.aiddithome.com/p/136932704ce08e.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
胶佬憨憨
1楼 · 2026-10-22 13:05:00

代码那块写Wire.write(0x01)切通道的逻辑我之前搞反了,调了半天才发现

第三次终于亮了
2楼 · 2026-10-22 13:05:00

这个模块买回来第一件事是跑I2C扫描确认地址,有些模块默认0x70有些默认0x77

电烙铁爱好者
3楼 · 2026-10-22 13:04:59

请教一下,如果用两个TCA9548A级联是不是可以挂16个通道?

阿伟不emo
4楼 · 2026-10-22 13:04:58

我之前挂三个BMP280全撞地址,差点换SPI方案,看到这文章才知道有TCA9548A,十几块就解决了