解决地址冲突
两个或多个 I2C 传感器地址一样时,不能直接挂在同一条 I2C 总线上。把它们分别接到不同通道,再由程序切换通道读取。
Overview
TCA9548A 是 8 通道 I2C 多路复用器。主控只占用一组 SDA/SCL,通过写 TCA9548A 的控制寄存器,选择打开 CH0-CH7 中的某一路或多路。
两个或多个 I2C 传感器地址一样时,不能直接挂在同一条 I2C 总线上。把它们分别接到不同通道,再由程序切换通道读取。
模块上有多个 Qwiic / STEMMA QT 风格接口,适合快速插接 I2C 传感器,减少杜邦线接错。
某一路模块拉低 SDA/SCL 时,便于逐路排查。实际维修时可以一通道一通道扫地址,定位是哪一路有问题。
Wiring
主控侧只接 GND、VCC、SDA、SCL 四根线;传感器接到 CH0-CH7 的任意一路。按 SparkFun 官方原理图,Main / Qwiic 接口 1-4 脚线序为 GND、VCC、SDA、SCL。ESP32 是 3.3V 逻辑,接 ESP32 时 VCC 按 3.3V 接,不要把 I2C 上拉到 5V。
您好,这个 Qwiic Main 主控口不是按“VCC、SCL、GND、SDA”排列。请按官方原理图 1-4 脚确认:1 GND、2 VCC/3.3V、3 SDA、4 SCL。如果接 ESP32,VCC 请接 3.3V,不要接 5V,否则 SDA/SCL 可能被上拉到 5V,有烧坏 ESP32 IO 的风险。
| TCA9548A 模块 | Arduino UNO | ESP32 常用 | 说明 |
|---|---|---|---|
| GND | GND | GND | 必须共地。 |
| VCC / 3.3V | 3.3V | 3.3V | Qwiic 系统一般按 3.3V 使用;接 ESP32 时不要接 5V。 |
| 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,总线按程序选择通道后轮询读取。
不要把它当万能电平转换器。成品模块的上拉、电源和 Qwiic 线序要看板子设计;ESP32 场景请按 3.3V 总线使用,避免 SDA/SCL 被上拉到 5V。
Qwiic 系统一般偏 3.3V。本页对客户默认写 VCC / 3.3V;接 ESP32 时请接 3.3V,不要接 5V。
Support
复制下面这段填一下发给客服,我们一次就能定位,不用来回问。
References