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

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

本文将讲述如何使用TCA9458A IIC多路复用器扩展IIC总线端口。使用相同的IIC地址控制多个IIC设备,如多个OLED或BME280等

TCA9548介绍

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

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

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

TCA9548A多路复用器I2C地址

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

A0A1A2I2C Address
LOWLOWLOW0x70
HIGHLOWLOW0x71
LOWHIGHLOW0x72
HIGHHIGHLOW0x73
LOWLOWHIGH0x74
HIGHLOWHIGH0x75
LOWHIGHHIGH0x76
HIGHHIGHHIGH0x77

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

PinDescription
VINPowers
GNDGND
SDA连接到主微控制器SDA引脚
SCL连接到主微控制器SCL引脚
RST激活低RST引脚—可用于复位多路复用器
A0选择多路复用器I2C地址-连接到GND或VCC
A1选择多路复用器I2C地址-连接到GND或VCC
A2选择多路复用器I2C地址-连接到GND或VCC
SD0SDA for channel 0
SC0SCL for channel 0
SD1SDA for channel 1
SC1SCL for channel 1
SD2SDA for channel 2
SC2SCL for channel 2
SD3SDA for channel 3
SC3SCL for channel 3
SD4SDA for channel 4
SC4SCL for channel 4
SD5SDA for channel 5
SC5SCL for channel 5
SD6SDA for channel 6
SC6SCL for channel 6
SD7SDA for channel 7
SC7SCL for channel 7

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

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

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

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

TCA9548A(2);

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

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

MicrocontrollerI2C Pins
ESP32GPIO 22 (SCL), GPIO 21 (SDA)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64Adafruit_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号总线上的OLEDTCA9548A(2);display.clearDisplay();display.setTextSize(8);display.setTextColor(WHITE);display.setCursor(45, 10);// 显示静态文本display.println("1");display.display(); // 写入3号总线上的OLEDTCA9548A(3);display.clearDisplay();display.setTextSize(8);display.setTextColor(WHITE);display.setCursor(45, 10);// 显示静态文本display.println("2");display.display(); // 写入4号总线上的OLEDTCA9548A(4);display.clearDisplay();display.setTextSize(8);display.setTextColor(WHITE);display.setCursor(45, 10);// 显示静态文本display.println("3");display.display(); // 写入5号总线上的OLEDTCA9548A(5);display.clearDisplay();display.setTextSize(8);display.setTextColor(WHITE);display.setCursor(45, 10);// 显示静态文本display.println("4");display.display(); 
}void loop() {}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35492.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

BGP路径属性与路由反射器

BGP路径属性 路径属性&#xff1a; 任何一条BGP路由都拥有多个路径属性 当路由器将BGP路由通告给它的对等体时&#xff0c;一并被通告的还有路由所携带的各各路径属性 BGP的路径属性将影响路由优选 路径四个属性分类&#xff1a; 公认必遵&#xff1a;必须包括在每个upda…

C语言期末考试——重点考点

目录 1.C语言的结构 2.三种循环结构 3.逻辑真假判断 4. printf函数 5. 强制类型转化 6. 多分支选择结构 7. 标识符的定义 8. 三目运算符 1.C语言的结构 选择结构、顺序结构、循环结构 2.三种循环结构 for、while、do-while 3.逻辑真假判断 C语言用0表示false,用非0(不…

ci/cd配置任务超时时间

有两个地方决定了任务超时时间&#xff1a; 1. 2.gitlab-runner

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…

梯度下降法以及 Python 实现

文章目录 1. 引言2. 梯度法3. 例子4. 代码实现5. 讨论 — 学习率 η \eta η5.1 当 η \eta η 设置过大5.2 当 η \eta η 设置过小 参考 1. 引言 梯度下降法&#xff0c;可以根据微分求出的斜率计算函数的最小值。 在人工智能中&#xff0c;经常被应用于学习算法。 2. 梯…

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

详细了解IO分类

按照数据流方向如何划分&#xff1f; 输入流&#xff08;Input Stream&#xff09;&#xff1a;从源&#xff08;如文件、网络等&#xff09;读取数据到程序。 输出流&#xff08;Output Stream&#xff09;&#xff1a;将数据从程序写出到目的地&#xff08;如文件、网络、控…

Appium 安装问题汇总

好生气好生气&#xff0c;装了几天了&#xff0c; opencv4nodejs 和 mjpeg-consumer 就是装不了&#xff0c;气死我了不管了&#xff0c;等后面会装的时候再来完善&#xff0c;气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…

目标检测知识点总结

1、数据增强 2、指标 3、vit 、swint ViT算法&#xff0c;创新性地将图像划分成一个个patch&#xff0c;并将每个patch展平为一个向量&#xff0c;使得图像数据转化为序列化数据&#xff0c;之后输入到Transformer模型中&#xff0c;实现了Transformer在图像分类任务中的应用。…

Lecture 11 - List,Set,Map

List, Set and Map are all interfaces: they define how these respective types work, but they don’t provide implementation code overview 1. List&#xff08;列表&#xff09;&#xff1a; &#xff08;1&#xff09; 创建、访问和操作列表&#xff1a;ArrayList …

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台&#xff0c;旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量&#xff0c;能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后&#xff0c;通过集成百度OCR服务的API&#xf…

应对超声波测试挑战,如何选择合适的数字化仪?

一、数字化仪的超声波应用 超声波是频率大于人类听觉范围上限的声学声压&#xff08;声学&#xff09;波。超声波设备的工作频率为20 kHz至几千MHz。表1总结了一些更常见的超声波应用的特征。 每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…

Flink学习连载文章11--双流Join

双流 Join 和两个流合并是不一样的 两个流合并&#xff1a;两个流变为 1 个流 union connect 双流 join: 两个流 join&#xff0c;其实这两个流还是原来的&#xff0c;只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…

vue3+wangeditor富文本编辑器详细教程

一、前言 在这篇教程中&#xff0c;我将指导如何使用 Vue 3 和 WangEditor 创建一个功能丰富的富文本编辑器。WangEditor 是一个轻量级的富文本编辑器&#xff0c;它非常适合集成到 Vue 项目中。这个例子展示了如何配置富文本编辑器&#xff0c;包括工具栏、编辑器配置以及如何…

Python学习39天

my_tools.py文件提供工具函数 """ 此文件编写工具函数&#xff0c;供程序员使用 my_tools """def read_confirm_select():"""让用户输入&#xff1a;Y/N&#xff0c;不区分大小写&#xff0c;将用户输入值转为小写返回&#xff…

LCA - Lowest Common Ancestor

LCA - Lowest Common Ancestor https://www.luogu.com.cn/problem/SP14932 题目描述 A tree is an undirected graph in which any two vertices are connected by exactly one simple path. In other words, any connected graph without cycles is a tree. - Wikipedia T…

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…

恒创科技:如何区分网站的域名主机名

如何区分网站的域名主机名?它们都是网址机制的一部分&#xff0c;当你在地址栏输入它们&#xff0c;就能访问互联网上想去的地方。你可曾思考过主机名和域名的区别呢? 简单来说&#xff0c;域名就像网址&#xff0c;而主机名用于标识网络中的设备。不过&#xff0c;这只是表面…