TCA9548A 1 至 8 I2C 多路复用器简介
I2C 通信协议允许您与同一 I2C 总线上的多个 I2C 设备进行通信,只要所有设备都具有唯一的 I2C 地址。TCA9548A I2C 多路复用器允许您使用同一 I2C 总线与最多 8 个 I2C 设备进行通信。多路复用器使用 I2C 通信协议与微控制器进行通信。
TCA9548A 多路复用器 I2C 地址
TCA9548A 多路复用器使用 I2C 通信协议与微控制器进行通信。因此,它需要一个 I2C 地址。多路复用器的地址是可配置的。可以通过调整 A0、A1 和 A2 引脚的值来选择 0x70 至 0x77 之间的值,如下表所示。
A0 | A1 | A2 | I2C地址 |
LOW | LOW | LOW | 0x70 |
HIGH | LOW | LOW | 0x71 |
LOW | HIGH | LOW | 0x72 |
HIGH | HIGH | LOW | 0x73 |
LOW | LOW | HIGH | 0x74 |
LOW | LOW | LOW | 0x70 |
HIGH | LOW | LOW | 0x71 |
LOW | HIGH | LOW | 0x72 |
因此,最多可以将 8 个 TCA9548A 多路复用器连接到同一条 I2C 总线,例如,如果连接A0,A1, 和A2连接到 GND,它为多路复用器设置地址 0x70。
TCA9548A 引脚排列
引脚 | 描述 |
VIN | 为多路复用器供电 |
GND | 连接至接地 |
SDA | 连接到主控微控制器SDA引脚 |
SCL | 连接到主控微控制器SCL引脚 |
RST | 低电平有效 —可用于复位多路复用器 |
A0 | 选择多路复用器 I2C 地址 — 连接到 GND 或 VCC |
A1 | 选择多路复用器 I2C 地址 — 连接到 GND 或 VCC |
A2 | 选择多路复用器 I2C 地址 — 连接到 GND 或 VCC |
SD0 | 通道 0 的 SDA |
SC0 | 通道 0 的 SCL |
SD1 | 通道 1 的 SDA |
SC1 | 通道 1 的 SCL |
SD2 | 通道 2 的 SDA |
SC2 | 通道 2 的 SCL |
SD3 | 通道 3 的 SDA |
SC3 | 通道 3 的 SCL |
SD4 | 通道 4 的 SDA |
SC4 | 通道 4 的 SCL |
SD5 | 通道 5 的 SDA |
SC5 | 通道 5 的 SCL |
SD6 | 通道 6 的 SDA |
SC6 | 通道 6 的 SCL |
SD7 | 通道 7 的 SDA |
SC7 | 通道 7 的 SCL |
TCA9548A I2C 多路复用器选择 I2C 总线
如前所述,要选择特定的 I2C 总线来读/写数据,只需将单个字节发送到具有所需输出端口号(0 到 7)的多路复用器。
void TCA9548A(uint8_t bus){
Wire.beginTransmission(0x70); // TCA9548A address is 0x70
Wire.write(1 << bus); // send byte to select bus
Wire.endTransmission();
Serial.print(bus);
}
然后,只需调用该函数并在发送 I2C 命令之前将要控制的端口总线号作为参数传递即可。例如,要控制连接到总线号 3 的设备,可以在调用其他 I2C 命令之前调用以下行(注意它从 0 开始):
TCA9548A(2);
控制多个 OLED 显示器 — TCA9548A I2C 多路复用器
下面展示如何控制多个 OLED 显示器。例如,将控制四个 OLED 显示器,您最多可以连接 8 个显示器。
具有 I2C 多路复用器电路的多个 OLED 显示器
连接四个 OLED 显示屏,如下图所示。使用 2、3、4 和 5 号,连接A0,A1, 和A2接地。这为多路复用器选择地址 0x70。
以下是默认的 I2C 引脚,具体取决于使用的微控制器:
微控制器 | I2C 引脚 |
ESP32 | GPIO 22(SCL),GPIO 21(SDA) |
ESP8266 | GPIO 5 (D1) (SCL)、GPIO 4 (D2) (SDA) |
Arduino Uno | A5(SCL)、A4(SDA) |
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128//定义 OLED 宽度和高度。
#define SCREEN_HEIGHT 64
//创建一个Adafruit_SSD1306与 OLED 显示屏通信的实例。
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 选择 I2C 通道
void TCA9548A(uint8_t bus){
Wire.beginTransmission(0x70); // TCA9548A 地址
Wire.write(1 << bus); // send byte to select bus
Wire.endTransmission();
Serial.print(bus);
}
void setup() {
Serial.begin(115200);
// 使用 I2C 多路复用器在 I2C 引脚上启动 I2C 通信
Wire.begin();
//以下几行显示了第一个 OLED 显示器的示例(它连接到 2 号总线)
TCA9548A(2);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Clear the buffer
display.clearDisplay();
//第二个 OLED 显示器的示例(它连接到 3 号总线)
TCA9548A(3);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Clear the buffer
display.clearDisplay();
//第三个 OLED 显示器的示例(它连接到 4 号总线)
TCA9548A(4);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Clear the buffer
display.clearDisplay();
// //第四个 OLED 显示器的示例(它连接到5 号总线)
TCA9548A(5);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// 除显示缓冲区
display.clearDisplay();
// Write to OLED on bus number 2
TCA9548A(2);
display.clearDisplay();
display.setTextSize(8);
display.setTextColor(WHITE);
display.setCursor(45, 10);
// Display static text
display.println("1");
display.display();
// Write to OLED on bus number 3
TCA9548A(3);
display.clearDisplay();
display.setTextSize(8);
display.setTextColor(WHITE);
display.setCursor(45, 10);
// Display static text
display.println("2");
display.display();
// Write to OLED on bus number 4
TCA9548A(4);
display.clearDisplay();
display.setTextSize(8);
display.setTextColor(WHITE);
display.setCursor(45, 10);
// Display static text
display.println("3");
display.display();
// Write to OLED on bus number 5
TCA9548A(5);
display.clearDisplay();
display.setTextSize(8);
display.setTextColor(WHITE);
display.setCursor(45, 10);
// Display static text
display.println("4");
display.display();
}
void loop() {
}