ESP32 中I2C接口多路复用器TCA9548A使用详解

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() {
  
}
原文链接:,转发请注明来源!