0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Adafruit TCA9548A 1-to-8 I2C 多路复用器:解决 I2C 设备地址冲突的利器

chencui 2026-05-11 12:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Adafruit TCA9548A 1-to-8 I2C 多路复用器:解决 I2C 设备地址冲突的利器

在电子设计中,当我们遇到需要连接多个具有相同 I2C 地址的设备时,常常会陷入困境。不过,Adafruit TCA9548A 1-to-8 I2C 多路复用器的出现,为我们提供了一个完美的解决方案。

文件下载:2717.pdf

一、概述

在使用 I2C 传感器时,我们可能会遇到这样的问题:某个 I2C 传感器芯片具有固定的 I2C 地址,而 I2C 协议不允许在同一 SDA/SCL 引脚上连接两个具有相同地址的设备。这时,TCA9548A 多路复用器就派上用场了。它就像一个门卫,能够根据我们的指令将命令传输到选定的 I2C 引脚组。

该多路复用器本身的 I2C 地址默认为 0x70,但可以在 0x70 到 0x77 之间进行调整。我们只需向该端口写入一个包含所需多路复用输出编号的单字节,后续的 I2C 数据包就会被发送到该端口。理论上,我们可以在 0x70 - 0x77 每个地址上使用 8 个这样的多路复用器,从而控制 64 个具有相同 I2C 地址的设备。

二、引脚说明

1. 电源引脚

  • Vin:电源引脚,传感器芯片使用 3 - 5 VDC 供电。为板子供电时,应提供与微控制器逻辑电平相同的电源,例如对于 5V 的 Arduino 微控制器,使用 5V 电源。
  • GND:电源和逻辑的公共接地端。

2. I2C 控制侧引脚

  • SCL:芯片本身的 I2C 时钟引脚,连接到微控制器的 I2C 时钟线。
  • SDA:芯片本身的 I2C 数据引脚,连接到微控制器的 I2C 数据线。
  • RST:复位引脚,用于复位多路复用器芯片。默认情况下拉高,连接到地即可复位。
  • A0、A1、A2:多路复用器的地址选择引脚。默认情况下,多路复用器的地址为 0x70,这三个引脚被拉低。将它们连接到 Vin 可以将地址设置为 0x71 - 0x77。其中,A0 是最低有效位(拉高时地址增加 1),A1 是次低有效位(拉高时地址增加 2),A2 是第三低有效位(拉高时地址增加 4)。

3. I2C 多路复用侧引脚

有 8 组 SDx 和 SCx 引脚,从 SD0/SC0 到 SD7/SC7。这些是多路复用引脚,每组都是一个完全独立的 I2C 总线集。因此,只要每个设备都连接到一个 I2C 总线上,我们就可以连接 8 个具有相同地址的 I2C 设备。需要注意的是,这些引脚没有安装上拉电阻,如果使用的芯片或扩展板没有 I2C 上拉电阻,一定要添加。而且,Vin 可以是 3.3V,而这些引脚可以上拉到 5V(即它们支持 5V)。

三、组装步骤

1. 准备排针

如果需要,将排针裁剪到合适的长度。将其插入面包板,长引脚朝下,这样更便于焊接。

2. 添加扩展板

将扩展板放在排针上,使短引脚穿过扩展板的焊盘。

3. 焊接

确保焊接所有引脚,以实现可靠的电气连接。如果需要焊接技巧,可以查看相关的焊接指南。

四、Arduino 接线与测试

1. 基本原理

TCA9548A 多路复用器有一个 I2C 地址(默认 0x70),我们可以向它发送命令,告诉它要与哪个 I2C 多路复用输出进行通信,然后就可以对目标板进行寻址。

2. 示例代码

#define TCAADDR 0x70
void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 < < i);
  Wire.endTransmission(); 
}

我们可以调用 tcaselect(0)tcaselect(7) 来设置多路复用器。如果碰巧有 I2C 地址为 0x70 的 I2C 设备,需要将 TCA9548 扩展板上的一个地址引脚短接到 Vin,以避免冲突。

3. 示例复用

假设我们要连接两个 HMC5883 扩展板,这些磁力计的固定地址为 0x1E,不能在一个 I2C 总线上连接两个。接线时,将 TCA9548 扩展板的 Vin 连接到 5V(对于 3V 逻辑的 Arduino/微控制器,使用 3.3V),GND 连接到地,SCL 连接到 I2C 时钟,SDA 连接到 I2C 数据。然后将每个传感器扩展板连接到 Vin、地,并使用其中一个 SCn/SDn 多路复用总线。

4. 扫描脚本

#include "Wire.h"
#define TCAADDR 0x70
void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 < < i);
  Wire.endTransmission(); 
}
void setup() {
  while (!Serial);
  delay(1000);
  Wire.begin();
  Serial.begin(115200);
  Serial.println("nTCAScanner ready!");
  for (uint8_t t = 0; t < 8; t++) {
    tcaselect(t);
    Serial.print("TCA Port #");
    Serial.println(t);
    for (uint8_t addr = 0; addr <= 127; addr++) {
      if (addr == TCAADDR) continue;
      Wire.beginTransmission(addr);
      if (!Wire.endTransmission()) {
        Serial.print("Found I2C 0x");
        Serial.println(addr, HEX);
      }
    }
    Serial.println("ndone");
  }
}
void loop() {}

运行这个脚本可以检测连接的设备。

5. 多传感器示例

#include < Wire.h >
#include < Adafruit_Sensor.h >
#include < Adafruit_HMC5883_U.h >
#define TCAADDR 0x70
Adafruit_HMC5883_Unified mag1 = Adafruit_HMC5883_Unified(1);
Adafruit_HMC5883_Unified mag2 = Adafruit_HMC5883_Unified(2);
void displaySensorDetails(Adafruit_HMC5883_Unified *mag) {
  sensor_t sensor;
  mag->getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print("Sensor: ");
  Serial.println(sensor.name);
  Serial.print("Driver Ver: ");
  Serial.println(sensor.version);
  Serial.print("Unique ID: ");
  Serial.println(sensor.sensor_id);
  Serial.print("Max Value: ");
  Serial.print(sensor.max_value);
  Serial.println(" uT");
  Serial.print("Min Value: ");
  Serial.print(sensor.min_value);
  Serial.println(" uT");
  Serial.print("Resolution: ");
  Serial.print(sensor.resolution);
  Serial.println(" uT");
  Serial.println("------------------------------------");
  delay(500);
}
void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 < < i);
  Wire.endTransmission(); 
}
void setup(void) {
  Serial.begin(9600);
  Serial.println("HMC5883 Magnetometer Test");
  Serial.println("");
  tcaselect(2);
  if (!mag1.begin()) {
    Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    while (1);
  }
  tcaselect(6);
  if (!mag2.begin()) {
    Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    while (1);
  }
  tcaselect(2);
  displaySensorDetails(&mag1);
  tcaselect(6);
  displaySensorDetails(&mag2);
}
void loop(void) {
  sensors_event_t event;
  tcaselect(2);
  mag1.getEvent(&event);
  Serial.print("Sensor #1 - ");
  Serial.print("X: ");
  Serial.print(event.magnetic.x);
  Serial.print(" ");
  Serial.print("Y: ");
  Serial.print(event.magnetic.y);
  Serial.print(" ");
  Serial.print("Z: ");
  Serial.print(event.magnetic.z);
  Serial.println(" uT");
  tcaselect(6);
  mag2.getEvent(&event);
  Serial.print("Sensor #2 - ");
  Serial.print("X: ");
  Serial.print(event.magnetic.x);
  Serial.print(" ");
  Serial.print("Y: ");
  Serial.print(event.magnetic.y);
  Serial.print(" ");
  Serial.print("Z: ");
  Serial.print(event.magnetic.z);
  Serial.println(" uT");
  delay(500);
}

通过添加 tcaselect() 函数,我们可以与两个传感器进行通信。

6. 多个多路复用器

由于 TCA9548 是可寻址的,我们可以在总线上使用多个多路复用器。有 8 个可能的地址,这意味着我们可以控制多达 64 个独立的 I2C 总线。为了避免不同多路复用器上具有相同地址的设备之间发生冲突,可以使用以下代码禁用多路复用器上的所有通道:

Wire.beginTransmission(TCAADDR1);
Wire.write(0); // no channel selected
Wire.endTransmission();

五、CircuitPython 与 Python

1. 安装 TCA9548A 库

需要安装 Adafruit_Blinka 库,该库为 Python 提供 CircuitPython 支持。这可能还需要在平台上启用 I2C 并验证是否运行 Python 3。由于每个平台略有不同,并且 Linux 经常变化,请访问 CircuitPython on Linux 指南来准备好计算机。安装完成后,从命令行运行以下命令:

sudo pip3 install adafruit-circuitpython-tca9548a

如果默认 Python 是版本 3,可能需要运行 pip 而不是 pip3。请确保不要在 Python 2.x 上使用 CircuitPython,因为它不支持。

2. CircuitPython 用法

使用 CircuitPython 时,需要先将 TCA9548A 库及其依赖项安装到 CIRCUITPY 驱动器lib 文件夹中,然后用示例脚本更新 code.py。可以点击下载项目捆绑包按钮,下载必要的库和 code.py 文件的压缩包,解压后将整个 lib 文件夹和 code.py 文件复制到 CIRCUITPY 驱动器。

3. Python 用法

在计算机上使用 pip3 安装库后,将示例代码复制或下载到计算机上,运行以下命令:

python3 code.py

4. 简单测试示例代码

import board
import adafruit_tca9548a
i2c = board.I2C()
tca = adafruit_tca9548a.TCA9548A(i2c)
for channel in range(8):
    if tca[channel].try_lock():
        print("Channel {}:".format(channel), end="")
        addresses = tca[channel].scan()
        print([hex(address) for address in addresses if address != 0x70])
        tca[channel].unlock()

这个简单的测试会对 TCA9548A 的所有八个端口进行 I2C 扫描,如果有设备连接,会将 I2C 地址打印到 REPL 中。

5. 多传感器示例代码

import time
import board
import adafruit_tsl2591
import adafruit_tca9548a
i2c = board.I2C()
tca = adafruit_tca9548a.TCA9548A(i2c)
tsl1 = adafruit_tsl2591.TSL2591(tca[0])
tsl2 = adafruit_tsl2591.TSL2591(tca[1])
while True:
    print(tsl1.lux, tsl2.lux)
    time.sleep(0.1)

在这个多传感器示例中,TCA9548A 作为 I2C 多路复用器与两个 TSL2591 光传感器一起使用。循环中,每 0.1 秒将两个光传感器的读数打印到 REPL 中。

六、下载资源

可以下载 TCA9548A 的数据手册、Adafruit Fritzing 库中的 Fritzing 对象以及 GitHub 上的 EagleCAD PCB 文件,还能查看原理图和制造图纸。

总之,Adafruit TCA9548A 1-to-8 I2C 多路复用器为解决 I2C 设备地址冲突问题提供了一个简单而有效的解决方案。无论是使用 Arduino 还是 CircuitPython/Python,都能轻松实现多个相同地址 I2C 设备的连接和通信。大家在实际应用中有没有遇到过类似的地址冲突问题呢?又是如何解决的呢?欢迎在评论区分享交流。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SGM65230S:4位12多路复用器/解复用器,低电压高带宽总线开关

    出色的4位12多路复用器/解复用器,同时也是一款高带宽总线开关,下面我们就来详细了解一下它。 文件下载: SGM65230S-Brief.PDF 一、产品概述 SGM65230S是一
    的头像 发表于 03-17 14:35 354次阅读

    RK3576平台PCA9548 I2C开关设备树配置与生效全解析

    核心设备树配置解析 本文以RK3576平台I2C0挂载PCA9548,通道0/1挂载摄像头(gc05a2/sc4336/imx415)、VC
    的头像 发表于 02-28 11:18 1895次阅读
    RK3576平台PCA<b class='flag-5'>9548</b> <b class='flag-5'>I2C</b>开关<b class='flag-5'>设备</b>树配置与生效全解析

    SN74CBT3257C:高性能4位1-of-2 FET多路复用器/解复用器

    SN74CBT3257C:高性能4位1-of-2 FET多路复用器/解复用器 在电子设计领域,选择合适的多路复用器/解
    的头像 发表于 01-15 17:00 506次阅读

    深入剖析TS3A27518E-Q1:6位1-of-2多路复用器/解复用器的卓越性能与应用

    深入剖析TS3A27518E-Q1:6位1-of-2多路复用器/解复用器的卓越性能与应用 在电子工程师的设计世界里,选择合适的多路复用器/解
    的头像 发表于 01-14 11:30 663次阅读

    深入剖析PCA9544A:多功能4通道I²C和SMBus多路复用器

    就来详细介绍一款非常实用的器件——TI的PCA9544A低电压4通道I²C和SMBus多路复用器,它带有中断逻辑,能为我们的设计带来诸多便利。 文件下载: pca9544
    的头像 发表于 12-29 09:30 824次阅读

    TCA8418:I2C控制的键盘扫描IC深度剖析

    TCA8418:I2C控制的键盘扫描IC深度剖析 在电子设备的设计中,键盘扫描IC是实现人机交互的关键组件之一。德州仪器(TI)的TCA8418就是这样一款具有卓越性能的
    的头像 发表于 12-25 09:20 564次阅读

    探秘TCA9554A:低电压8I2C和SMBus I/O扩展器的实用之选

    探秘TCA9554A:低电压8I2C和SMBus I/O扩展器的实用之选 在硬件设计的领域中,I/O扩展器是一种常见且实用的器件,它能够为
    的头像 发表于 12-24 14:10 847次阅读

    TCA9548A:低电压8通道I²C开关的设计与应用

    TCA9548A:低电压8通道I²C开关的设计与应用 在电子设计领域,I²C总线的应用极为广泛,
    的头像 发表于 12-23 15:25 857次阅读

    TCA9544A:4 通道 I²C 与 SMBus 多路复用器深度解析

    TCA9544A:4 通道 I²C 与 SMBus 多路复用器深度解析 在电子工程师的日常设计中,经常会遇到 I²
    的头像 发表于 12-22 18:10 1486次阅读

    TCA9538:低电压8I2C和SMBus低功耗I/O扩展器的深度剖析

    TCA9538:低电压8I2C和SMBus低功耗I/O扩展器的深度剖析 在电子设计领域,I/O扩展器是一种常见且实用的器件,它能为系统提供
    的头像 发表于 12-22 16:40 1888次阅读

    TCA9534:低电压8I2C和SMBUS低功耗I/O扩展器的全面解析

    tca9534.pdf 一、TCA9534概述 TCA9534是一款16引脚的设备,为两线双向I2C总线(或SMBus)协议提供
    的头像 发表于 12-22 16:25 1320次阅读

    深入解析TCA9617B:I2C总线中继器的卓越之选

    TCA9617B是一款双通道双向I2C缓冲器,支持标准模式、快速模式(400kHz)和快速模式+(1MHz)的I²C操作。这使得它能够适应
    的头像 发表于 12-22 15:20 711次阅读

    支持复位的 TCA9548A-Q1 汽车 8 通道 I²C 开关:设计与应用全解析

    支持复位的 TCA9548A-Q1 汽车 8 通道 I²C 开关:设计与应用全解析 在电子设计领域,I²
    的头像 发表于 12-18 09:35 604次阅读

    深入剖析I2C协议

    I2C也是一种可以多主设备,多从设备的总线协议,通过地址索引,I2C可以使能所需从设备
    的头像 发表于 08-21 15:10 4047次阅读
    深入剖析<b class='flag-5'>I2C</b>协议

    Texas Instruments TUSB1021-Q1 10Gbps线性转接驱动器多路复用器多路复用器数据手册

    Texas Instruments TUSB1021-Q1 10Gbps线性转接驱动器多路复用器和解复用器是一款线性转接驱动器,具有1:2
    的头像 发表于 07-16 09:47 1087次阅读
    Texas Instruments TUSB1021-Q<b class='flag-5'>1</b> 10Gbps线性转接驱动器<b class='flag-5'>多路复用器</b>和<b class='flag-5'>多路</b>解<b class='flag-5'>复用器</b>数据手册