STM32F103学习笔记(10)——I2C多路复用器TCA9548A使用
Posted Leung_ManWah
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103学习笔记(10)——I2C多路复用器TCA9548A使用相关的知识,希望对你有一定的参考价值。
一、简介
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 从设备一样发数据了。
二、硬件连接
功能口 | 引脚 |
---|---|
SCL | PB.8 |
SDA | PB.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多路扩展模块使用
以上是关于STM32F103学习笔记(10)——I2C多路复用器TCA9548A使用的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103学习笔记(10)——I2C多路复用器TCA9548A使用
STM32F103VET6基于STM32CubeMX 配置硬件I2C驱动ssd1306 OLED屏幕
i2c 传输,stm32f103 作为 Master,STOP 条件生成问题
GD32F103学习笔记——在GD32F103移植STM32F103代码