解决地址冲突
两个或多个 I2C 传感器地址一样时,不能直接挂在同一条 I2C 总线上。把它们分别接到不同通道,再由程序切换通道读取。
Overview
TCA9548A 是 8 通道 I2C 多路复用器。主控只占用一组 SDA/SCL,通过写 TCA9548A 的控制寄存器,选择打开 CH0-CH7 中的某一路或多路。
两个或多个 I2C 传感器地址一样时,不能直接挂在同一条 I2C 总线上。把它们分别接到不同通道,再由程序切换通道读取。
模块上有多个 Qwiic / STEMMA QT 风格接口,适合快速插接 I2C 传感器,减少杜邦线接错。
某一路模块拉低 SDA/SCL 时,便于逐路排查。实际维修时可以一通道一通道扫地址,定位是哪一路有问题。
Wiring
主控侧只接 VIN、GND、SDA、SCL 四根线;传感器接到 CH0-CH7 的任意一路。Qwiic 红线不要固定理解为 5V,电压按模块和传感器说明为准。
| TCA9548A 模块 | Arduino UNO | ESP32 常用 | 说明 |
|---|---|---|---|
| VIN / VCC | 5V 或 3.3V | 3.3V | 按模块支持电压和传感器电压选择。 |
| GND | GND | GND | 必须共地。 |
| SDA | A4 / SDA | GPIO21 | I2C 数据线。 |
| SCL | A5 / SCL | GPIO22 | I2C 时钟线。 |
| CH0-CH7 | 每一路再接一个 I2C 模块;同地址模块建议分开接不同通道。 | ||
Address
模块默认地址常见为 0x70。A0、A1、A2 地址脚可以组合成 0x70 到 0x77。具体模块焊盘/跳线以实物丝印为准。
接在 CH0-CH7 上的传感器地址不变。程序先选通道,再用传感器原来的地址读数据。例如多个 0x29 的 ToF 模块可以分别接 CH0、CH1、CH2。
芯片允许控制字打开多个通道,但新手排查建议一次只开一路,避免两个相同地址设备同时出现在总线上。
Arduino Code
先确认能扫到 TCA9548A 的 0x70,再逐个通道扫描子模块地址。这个程序不依赖专用库,只用 Arduino Wire。
#include <Wire.h>
#define TCA_ADDR 0x70
void tcaSelect(uint8_t channel) {
if (channel > 7) return;
Wire.beginTransmission(TCA_ADDR);
Wire.write(1 << channel);
Wire.endTransmission();
}
void scanCurrentBus() {
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
}
}
}
void setup() {
Serial.begin(115200);
Wire.begin(); // ESP32 可改成 Wire.begin(21, 22);
Serial.println("TCA9548A channel scanner");
Serial.println("Check TCA9548A at 0x70 first:");
scanCurrentBus();
for (uint8_t ch = 0; ch < 8; ch++) {
Serial.print("\nChannel ");
Serial.println(ch);
tcaSelect(ch);
delay(10);
scanCurrentBus();
}
}
void loop() {
}
FAQ
要先选择通道。主控扫到 0x70 只代表 TCA9548A 在线;接在 CH0-CH7 的传感器,需要程序写入 1 << 通道号 后再扫描。
可以分通道轮流读。不要把多个相同地址模块直接并在同一通道上,否则仍然地址冲突。
它是多路选择器,不是 8 个独立 I2C 控制器。主控仍然是一条 I2C,总线按程序选择通道后轮询读取。
TI 芯片本身有 I2C 总线隔离/电压相关能力,但成品模块的上拉、电源和 Qwiic 线序要看板子设计。客户使用 5V 主控接 3.3V 传感器时,仍建议确认模块是否适合该电平,不要只把它当万能电平转换器。
Qwiic 系统一般偏 3.3V。红线建议写 VCC / V+,不要固定写死 5V;最终按模块 VIN/VCC 说明和传感器支持电压来接。
Customer Reply
References