问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP32使用TCA9548A IIC多路复用器拓展

创作时间:
作者:
@小白创作中心

ESP32使用TCA9548A IIC多路复用器拓展

引用
CSDN
1.
https://m.blog.csdn.net/qq_49516462/article/details/144224805

TCA9548A IIC多路复用器是一种用于扩展IIC总线端口的设备,它允许在同一IIC总线上连接多个具有相同地址的设备。本文将详细介绍如何使用TCA9548A多路复用器与ESP32微控制器配合,实现对多个OLED显示器的控制。

TCA9548介绍

IIC通信协议可以实现在同一IIC总线上与多个IIC设备通信,只要所有设备都具有唯一的I2C地址。但无法实现相同的地址连接多个IIC设备。

TCA9548A IIC多路复用器可使用相同的IIC总线与多达8个IIC设备通信。多路复用器使用IIC通信协议与微控制器通信。然后,可以选择要寻址的多路复用器上的哪个IIC总线。

要寻址特定的端口,只需要向具有所需输出端口号的多路复用器发送一个字节。

TCA9548A多路复用器I2C地址

TCA9548A多路复用器使用I2C通信协议与微控制器通信。因此,它需要一个I2C地址。多路复用器地址是可配置的。可以通过调整A0、A1和A2引脚的值来选择0x70到0x77之间的一个值,如下表所示。

A0
A1
A2
I2C Address
LOW
LOW
LOW
0x70
HIGH
LOW
LOW
0x71
LOW
HIGH
LOW
0x72
HIGH
HIGH
LOW
0x73
LOW
LOW
HIGH
0x74
HIGH
LOW
HIGH
0x75
LOW
HIGH
HIGH
0x76
HIGH
HIGH
HIGH
0x77

所以,可以将8个TCA9548A多路复用器连接到相同的IIC总线,仅使用微控制器的一个IIC总线连接具有相同地址的64个设备。例如,将A0, A1和A2连接到GND,则会为多路复用器设置地址0x70。

Pin
Description
VIN
Powers
GND
GND
SDA
连接到主微控制器SDA引脚
SCL
连接到主微控制器SCL引脚
RST
激活低RST引脚—可用于复位多路复用器
A0
选择多路复用器I2C地址-连接到GND或VCC
A1
选择多路复用器I2C地址-连接到GND或VCC
A2
选择多路复用器I2C地址-连接到GND或VCC
SD0
SDA for channel 0
SC0
SCL for channel 0
SD1
SDA for channel 1
SC1
SCL for channel 1
SD2
SDA for channel 2
SC2
SCL for channel 2
SD3
SDA for channel 3
SC3
SCL for channel 3
SD4
SDA for channel 4
SC4
SCL for channel 4
SD5
SDA for channel 5
SC5
SCL for channel 5
SD6
SDA for channel 6
SC6
SCL for channel 6
SD7
SDA for channel 7
SC7
SCL for channel 7

TCA9548A I2C多路复用器选择IIC总线

如前所述,要选择特定的IIC总线来读取/写入数据,只需要将单个字节发送到具有所需输出端口号(0到7)的多路复用器。

可以使用以下函数:

void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A地址为0x70
  Wire.write(1 << bus);          // 发送字节到选择总线
  Wire.endTransmission();
  Serial.print(bus);
}

然后,只需要调用该函数并在发送IIC命令之前将要控制的端口总线号作为参数传递。例如,要控制连接到总线3号的设备,将在调用其他IIC命令之前调用以下行(注意它从0开始):

TCA9548A(2);

控制多个OLED显示器- tca9548a IIC多路复用器

在接下来的内容中,将讲述如何控制多个OLED显示器。例如,控制4个OLED(最多可以连接8个)。

Microcontroller I2C Pins
ESP32 GPIO 22 (SCL), GPIO 21 (SDA)

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 选择IIC总线
void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A 地址
  Wire.write(1 << bus);          // 发送字节到总线
  Wire.endTransmission();
  Serial.print(bus);
}
 
void setup() {
  Serial.begin(115200);
  // 启动与多路复用器的IIC通信
  Wire.begin();
  // 定义OLED在总线2上
  TCA9548A(2);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306分配失败"));
    for(;;);
  } 
  // 清除缓冲区
  display.clearDisplay();
  // 定义OLED在总线3上
  TCA9548A(3);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306分配失败"));
    for(;;);
  } 
  // 清除缓冲区
  display.clearDisplay();
  // 定义OLED在总线4上
  TCA9548A(4);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306分配失败"));
    for(;;);
  } 
  // 清除缓冲区
  display.clearDisplay();
  // 定义OLED在总线5上
  TCA9548A(5);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306分配失败"));
    for(;;);
  } 
  // 清除缓冲区
  display.clearDisplay();
  // 写入2号总线上的OLED
  TCA9548A(2);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // 显示静态文本
  display.println("1");
  display.display(); 
  // 写入3号总线上的OLED
  TCA9548A(3);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // 显示静态文本
  display.println("2");
  display.display(); 
  
  // 写入4号总线上的OLED
  TCA9548A(4);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // 显示静态文本
  display.println("3");
  display.display(); 
  
  // 写入5号总线上的OLED
  TCA9548A(5);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // 显示静态文本
  display.println("4");
  display.display(); 
}
 
void loop() {
  
}

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号