STM32F103学习笔记(10)——I2C多路复用器TCA9548A使用

news2025/1/15 13:11:37

一、简介

TCA9548A 器件配有八个可通过 I2C 总线控制的双向转换开关。串行时钟/串行数据 (SCL/SDA) 上行对可扩展为 8 个下行对或通道。根据可编程控制寄存器的内容,可选择任一单独 SCn/SDn 通道或者通道组合。这些下游通道可用于解决 I2C 从器件地址冲突。例如,如果应用中需要八个完全相同的数字温度传感器,则每个通道 (0-7) 可以连接一个传感器。

发生超时或其他不当操作时,系统主控器可通过将RESET 输入置为低电平来复位 TCA9548A。同样,加电复位即可取消选中所有通道并初始化 I2C/SMBus 状态机。将 RESET 置为有效也可实现复位和初始化,并且无需将部件断电。这样可以在下游 I2C 总线之一卡在低电平状态时进行恢复。

  • 1至8个双向转换开关
  • 与1PC总线和SMBus兼容
  • 低电平有效复位输入
  • 三个地址引脚,PC总线上最多支持八个TCA9548A器件
  • 通过1PC总线进行通道选择,可任意组合
  • 加电时所有开关通道取消选定
  • 低RoN开关
  • 支持在1.8V、2.5V、3.3V和5V总线间进行电压电平转换
  • 加电时无干扰
  • 支持热插入·低待机电流
  • 工作电源电压范围为1.65V至5.5V
  • 5V耐压输入
  • 0至400kHz时钟频率
  • 门锁性能超过100mA,符合JESD78l|类规范
  • ESD保护性能超过JESD22规范要求
  • ±2000V人体放电模型(A114-A)
  • 200V机器模型(A115-A)
  • ±1000V充电器件模型(C101)

1.1 应用

TCA9548A 的用途就是 I2C 扩展,每个 TCA9548A 可以扩展出 8 路I2C。TCA9548A 芯片带有地址选择引脚 A0/A1/A2,根据高低电平不同,从 MCU 的一路 I2C 最多可以接入 8 个T CA9548A 芯片,从而可以达到扩展出 8*8=64 路 I2C 的效果。

1.2 I2C地址分配

TCA9548A 是一个 I2C 器件,本身有 I2C 地址。TCA9548A 自身的地址和它 A0,A1,A2 口的电平状态有关,组合出 8 个 I2C 地址。默认地址为0x70(A0,A1,A2全部接地),最大地址为0x77(A0,A1,A2全部上拉)。

1.3 I2C选择通道命令

TCA9548A 只有一个 8 位寄存器,将某一位置1,说明将哪个通道开通。TCA9548A 就会保持这个通道,并透传 I2C 的消息,就可以直接向操作 I2C 从设备一样发数据了。

二、硬件连接

功能口引脚
SCLPB.8
SDAPB.9

三、添加I2C驱动

I2C配置查看 STM32CubeMX学习笔记(9)——I2C接口使用(读写EEPROM AT24C02)

四、移植文件

4.1 board_tca9548a.h

注意:由于我只连接一个 TCA9548A,所以不需要更改模块地址,A0~A2 引脚无需连接或接地,I2C 从设备地址为:0x70

#ifndef _BOARD_TCA9548A_H_
#define _BOARD_TCA9548A_H_

/*********************************************************************
 * INCLUDES
 */
#include <stdint.h>

/*********************************************************************
 * DEFINITIONS
 */
#define TCA9548A_SLAVE_ADDR         0x70

#define TCA9548A_WRITE_BIT          0x00
#define TCA9548A_READ_BIT           0x01

#define TCA9548A_CHANNEL_0          0x01
#define TCA9548A_CHANNEL_1          0x02
#define TCA9548A_CHANNEL_2          0x04
#define TCA9548A_CHANNEL_3          0x08
#define TCA9548A_CHANNEL_4          0x10
#define TCA9548A_CHANNEL_5          0x20
#define TCA9548A_CHANNEL_6          0x40
#define TCA9548A_CHANNEL_7          0x80

/*********************************************************************
 * API FUNCTIONS
 */
void TCA9548A_SetChannel(uint8_t channel);

#endif /* _BOARD_TCA9548A_H_ */

4.2 board_tca9548a.c

/*********************************************************************
 * INCLUDES
 */
#include "i2c.h"

#include "board_tca9548a.h"

/*********************************************************************
 * PUBLIC FUNCTIONS
 */
/**
 @brief 选择通道打开
 @param channel -[in] 通道号
 @return 无
*/
void TCA9548A_SetChannel(uint8_t channel)
{		
    uint8_t data;
    switch(channel)
    {
        case 0:
            data = TCA9548A_CHANNEL_0;
            break;
        case 1:
            data = TCA9548A_CHANNEL_1;
            break;
        case 2:
            data = TCA9548A_CHANNEL_2;
            break;
        case 3:
            data = TCA9548A_CHANNEL_3;
            break;
        case 4:
            data = TCA9548A_CHANNEL_4;
            break;
        case 5:
            data = TCA9548A_CHANNEL_5;
            break;
        case 6:
            data = TCA9548A_CHANNEL_6;
            break;
        case 7:
            data = TCA9548A_CHANNEL_7;
            break;
        default:
            break;        
    }
    HAL_I2C_Master_Transmit(&hi2c1, (TCA9548A_SLAVE_ADDR << 1) | TCA9548A_WRITE_BIT, &data, 1, 10);
}

/****************************************************END OF FILE****************************************************/

五、使用例子

TCA9548A 选择对应通道后,正常发送命令读取 I2C 从设备数据。

#include "board_tca9548a.h"

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  TCA9548A_SetChannel(0); //选择通道0

  GZP6859D_ReadCombinedModeData(0, 0);  //挂在通道0上的I2C从设备发送命令读取传感器数据

  /* USER CODE END 2 */

  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();

  /* Start scheduler */
  osKernelStart();

  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

• 由 Leung 写于 2023 年 1 月 14 日

• 参考:STM32F1 TCA9548A 驱动多个IIC器件
    TCA9548A IIC多路扩展模块使用

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

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

相关文章

高精度加法【c++实现】超详细讲解

高精度存在的意义 大家一定都知道int和long long是有极限的&#xff08;如下表&#xff09;&#xff0c;如果超了就无法计算正确结果了&#xff0c;那该用什么方法来计算呢&#xff1f;这就是我们今天要说的算法———高精度算法。&#xff08;本文只讲加法&#xff09; 类型…

超级浏览器的防关联效果怎么样?

很多从事跨境电商业务的朋友&#xff0c;都尝试用各种手段来防止账号关联&#xff0c;现在有很多不要钱的超级浏览器可以下载使用&#xff0c;但是很多人却不敢把高价值的账号放在超级浏览器上面&#xff0c;今天我们就来详细聊聊这个问题。说超级浏览器之前&#xff0c;我们先…

抖音世界杯直播的低延迟是怎么做到的?

动手点关注干货不迷路世界杯已经结束了&#xff0c;梅西带领阿根廷时隔三十六年之后终于如愿捧杯。抖音直播提供的 4K 超高清超低延迟看播能力给亿万观众留下了深刻的印象&#xff0c;决赛的 PCU 达到 3700w&#xff0c;在这样大规模并发下&#xff0c;如何能稳定流畅地做到更低…

GO语言配置和基础语法应用(一)

一、golang的下载和安装 这一步比较简单&#xff0c;直接打开go的官网&#xff0c;点击download即可&#xff0c;个别人打开慢可以用中国的镜像网站&#xff0c;之后访问的速度和下载第三方库的速度会快很多&#xff0c;之后傻瓜式安装一路到底即可。 配置环境变量 注意&#…

经典文献阅读之--Multi-modal Semantic SLAM(多模态语义SLAM)

0. 简介 在复杂动态环境下&#xff0c;如何去建立一个稳定的SLAM地图是至关重要的。但是现在当前的SLAM系统主要是面向静态场景。目前相较于点云的分类与分割而言。视觉的识别与分割会更加容易。这就可以根据语义信息提高对环境的理解。文章《Multi-modal Semantic SLAM for C…

JavaScript 如何正确的读懂报错信息

文章目录前言一、查看报错1.控制台报错2.终端报错二、查找错误演示总结前言 一、查看报错 如何阅读报错信息, 根据信息快速锁定错误. 1.控制台报错 红色报错信息格式: xxxx Error: xxxxx报错信息xxxxx 最终报错文件:行编号 at 最终报错方法名 (最终报错文…

PySpark中RDD的数据输出详解

目录 一. 回顾 二.输出为python对象 collect算子 演示 reduce算子 演示 take算子 演示 count算子 演示 小结 三.输出到文件中 savaAsTextFile算子 演示 配置Hadoop依赖 修改rdd分区为1个 小结 四.练习案例 需求&#xff1a; 代码 一. 回顾 数据输入: sc.paralle…

Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context_学习笔记

Transformer-XL学习笔记 一、Transformer-XL出现的原因 首先说明Transformer的变形版本Transformer-XL出现的原因&#xff1a; transformer作为一种特提取器&#xff0c;在NLP中有广泛的应用&#xff0c;但是transformer需要对输入的序列设置固定的长度&#xff0c;例如在Ber…

(考研湖科大教书匠计算机网络)第一章概述-第四节:计算机网络的性能指标

文章目录&#xff08;1&#xff09;速率&#xff08;2&#xff09;带宽&#xff08;3&#xff09;吞吐量&#xff08;4&#xff09;时延①&#xff1a;基本概念②&#xff1a;计算公式&#xff08;5&#xff09;时延带宽积&#xff08;6&#xff09;往返时间RTT&#xff08;7&a…

dp(六) 线性dp整合 最长(公共子串、公共子序列、上升子序列、回文子串)

1、最大公共子串_牛客题霸_牛客网​编辑 2、最长上升子序列(一)_牛客题霸_牛客网 3、最长回文子串_牛客题霸_牛客网 4、最长公共子序列(二)_牛客题霸_牛客网 #include <iostream> using namespace std; #include<vector>int main() {string str1,str2;cin>>…

mysql数据迁移报错问题

mysql8.0.17备份数据库到mysql5.7.26的There was error(s) while executing the queries问题解决&#xff08;数据库高版本向低版本数据迁移解决&#xff09; 问题背景 要将本地的mysql数据库导入到linux中的mysql中&#xff0c;其中&#xff0c;本地mysql数据库的版本是8.0.…

数字硬件建模SystemVerilog-时序逻辑建模(1)RTL时序逻辑的综合要求

数字门级电路可分为两大类&#xff1a;组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点&#xff0c;在后面会作为单独的主题处理。组合逻辑描述了门级电路&#xff0c;其中逻辑块的输出直接反映到该块的输入值的组合&#xff0c;例如&#xff0c;双输入AND门的输出…

N5247A网络分析仪

18320918653 N5247A Agilent N5247A 网络分析仪主要特性与技术指标 10 MHz 至 67 GHz2 端口或 4 端口&#xff0c;具有两个内置信号源可提供 4 端口 110 GHz 单次扫描解决方案110 dB 系统动态范围&#xff0c;32001 个点&#xff0c;32 个通道&#xff0c;5 MHz 中频带宽高输…

MySQL中深入浅出索引

文章目录前言一、索引的常见模型二、InnoDB的索引模型三、索引的维护四、索引的优化覆盖索引联合索引最左前缀原则索引下推前言 我们在看书的时候&#xff0c;打算回看某一个桥段的内容时。这是你肯定会是先翻看书的目录&#xff0c;从目录确定这段内容的位置&#xff0c;然后…

爬虫利用多线程快速爬取数据

一般单线程爬数据太慢了话&#xff0c;就采用多线程。 一般要根据两种情形来选择 自定义线程线程池 往往最关键的地方在&#xff0c;多个线程并发执行后&#xff0c;是否需要线性的返回结果。也就是先调用的线程&#xff0c;返回的结果要在前面。 或者说&#xff0c;某个对…

mysql简单数据查询——数采数据电量与耗料的日统计

目录 前言 步骤1&#xff1a;date_format函数 步骤2&#xff1a;concat函数 步骤3、4&#xff1a;查询中使用变量 完整代码 前言 在数采数据已写入mysql数据库中后&#xff0c;进行数据处理&#xff0c;统计电量与耗料数据 由于数据库版本较低&#xff0c;无法使用较新的…

华为策略路由实验配置

配置接口相关的IP地址&#xff0c;并配置IGP路由协议使得全网互通 AR1配置接口策略路由 对经过本地转发的路由生效&#xff0c;对本地始发的路由不生效 配置nqa检测下一跳状态 nqa test-instance PC1 icmptrace nqa的管理者为PC1&#xff0c;NQA的测试例名为icmptrace test-…

全国青少年软件编程(Scratch)等级考试二级考试真题2022年12月——持续更新.....

1.一个骰子,从3个不同角度看过去的点数如图所示,请问5的对面是什么点数?( ) A.1 B.3 C.4 D.6 正确答案:A 答案解析: 根据图三,用右手定则,大拇指朝上指向6所对的方向,其余四指握起来表示旋转方向,可以看到先5后2,然后把这个姿势对应到图1中,就知道1的对面是5…

C语言进阶(8)——动态内存空间管理

前言 文章目录前言1.为什么存在动态内存分配2.动态内存函数的介绍2.1 malloc函数2.2 free函数2.3 calloc2.4realloc3 常见的动态内存错误4.经典笔试题题目 1&#xff1a;题目 2&#xff1a;题目 3&#xff1a;题目 4&#xff1a;5.C/C程序的内存开辟6.柔性数组6.1 定义6.2 柔性…

1.5、中断和异常

整体框架 1、中断的概念和作用 当中断发生时&#xff0c;CPU 立即进入核心态\color{red}核心态核心态 当中断发生后&#xff0c;当前运行的进程暂停运行&#xff0c;并由操作系统内核对中断进行处理 对于不同的中断信号&#xff0c;会进行不同的处理 发生了中断&#xff0c…