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 从设备一样发数据了。

二、硬件连接

功能口引脚
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多路扩展模块使用

以上是关于STM32F103学习笔记(10)——I2C多路复用器TCA9548A使用的主要内容,如果未能解决你的问题,请参考以下文章

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

STM32F103VET6基于STM32CubeMX 配置硬件I2C驱动ssd1306 OLED屏幕

i2c 传输,stm32f103 作为 Master,STOP 条件生成问题

GD32F103学习笔记——在GD32F103移植STM32F103代码

STM32F103VE基于STM32CubeMX 配置I2C驱动0.96/1.3 OLED显示

STM32F103VET6基于STM32CubeMX 配置硬件I2C驱动SH1106 OLED屏幕