《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多路扩展模块使用

    物联沃分享整理
    物联沃-IOTWORD物联网 » 《STM32F103学习笔记(10):深入理解I2C多路复用器TCA9548A的使用》

    发表评论