TCA9548A 驱动多个IIC器件,切换I2C8个通道,STM32F407

1.器件原理图

2.设备地址

设备地址取决于 A0,A1,A2三个Pin 脚怎么接,TCA9548A 的地址范围为0x00~0x77,原理图R_NC1,R_NC2,R_NC3 没有焊接,故A0,A1,A2,接到GND被拉低,故地址为 0x70。

#define TCA9548A_SLAVE_ADDR   0x70      //地址

#define TCA9548A_WRITE_BIT		    0x00  //W 
#define TCA9548A_READ_BIT			0x01  //R

3.设备总线 PF0,PF1,主控为STM32F407,第2个硬件IIC

不同通道寄存器地址,通道使能。

#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

4. .h文件

#ifndef __BSP_IIC_H
#define __BSP_IIC_H

#include "gpio.h"
#define IIC_SDA_Read() 			 		 HAL_GPIO_ReadPin  (IIC_SDA_GPIO_Port,IIC_SDA_Pin) 

#define IIC_SDA_High() 					 HAL_GPIO_WritePin (IIC_SDA_GPIO_Port,IIC_SDA_Pin,GPIO_PIN_SET)  
#define IIC_SDA_Low() 			 		 HAL_GPIO_WritePin (IIC_SDA_GPIO_Port,IIC_SDA_Pin,GPIO_PIN_RESET)  

#define IIC_SCL_High()					 HAL_GPIO_WritePin (IIC_SCL_GPIO_Port,IIC_SCL_Pin,GPIO_PIN_SET)  
#define IIC_SCL_Low() 					 HAL_GPIO_WritePin (IIC_SCL_GPIO_Port,IIC_SCL_Pin,GPIO_PIN_RESET)

#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


extern void IIC_Start (void);
extern void IIC_Stop(void);
extern uint8_t IIC_Wait_Ack(void);
extern void TCA9548A_SetChannel(uint8_t channel);
extern uint8_t IIC_ReadByte(uint8_t ReadAck);
extern void IIC_Ack(void);
extern void IIC_NAck(void);



#endif

5. .c 源文件

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

形参分别为I2C通道,设备地址,数据个数,超时时间

1)设备地址是8 byte,,存储数据的指针,

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(&hi2c2, (TCA9548A_SLAVE_ADDR << 1) , &data, 1, 10);
}

如何判断是否切换通道成功

1)main 函数里面定义你想写的数据,用示波器抓写入数据的波形

uint8_t data[3] ={0x55,0x01,0x00};
TCA9548A_SetChannel(1);//切换通道1
HAL_I2C_Master_Transmit(&hi2c2, (TCA9548A_SLAVE_ADDR << 1) | TCA9548A_WRITE_BIT, &data[0],3, 1000 );

2)示波器波形图

uint8_t data[3] ={0x55,0x01,0x00};

在起始信号开始后读设备地址:0xE0  1110 0000

data0: 0101 0101 为0x55

data1:0000 0001

data2:0000 0000

箭头处为产生的应答信号~

 

### STM32 使用 TCA9555 芯片 #### 介绍 TCA9555 是一款带有 I²C 兼容接口的 16 位输入/输出扩展器,适用于各种应用场合。该器件提供两个可编程寄存器用于配置数据方向以及读取或写入状态。通过使用此芯片可以有效地增加微控制器上的 GPIO 数量。 #### 硬件连接 为了使 STM32 控制 TCA9555 的工作,在硬件方面需完成如下连线: - 将 VCC 和 GND 连接到相应的电源引脚; - SDA (串行数据线) 应当连到 STM32 上指定作为 IIC 数据传输用途的一个管脚; -_SCL(串行时钟线) 同样要对应接入另一个设定好用来传递同步信号的针脚; 这些设置确保了两者间能够按照标准协议进行通信[^1]。 #### 初始化与操作函数定义 对于初始化过程而言,主要涉及到了对IIC模块本身的启动还有针对特定地址下设备的具体参数调整。下面给出一段基于 HAL 库编写的 C++ 实现代码片段来展示这一流程: ```cpp #include "stm32f1xx_hal.h" #define TCA9555_ADDRESS 0x20 // 默认地址, 可能会因为 A0-A2 引脚电平不同而有所变化 void tca9555_init(I2C_HandleTypeDef *hi2c){ uint8_t config_data[] = {0xFF, 0xFF}; // 设置全部为输入模式 HAL_I2C_Master_Transmit(hi2c, TCA9555_ADDRESS << 1, config_data, sizeof(config_data), HAL_MAX_DELAY); } ``` 上述代码实现了向配置寄存器发送全高字节序列从而把所有的端口都设成输入形式的功能。 #### 输入输出控制实例 这里再补充几个简单的 API 来获取当前引脚的状态或是改变其逻辑电平高低: ```cpp uint16_t read_input_ports(I2C_HandleTypeDef *hi2c){ uint8_t input_port_values[2]; HAL_I2C_Master_Receive(hi2c, (TCA9555_ADDRESS << 1)|1, input_port_values, sizeof(input_port_values), HAL_MAX_DELAY); return ((uint16_t)input_port_values[0]) | (((uint16_t)input_port_values[1])<<8); } void write_output_ports(I2C_HandleTypeDef *hi2c,uint16_t value){ uint8_t output_port_values[2]={ (value & 0xFF), (value >> 8) }; HAL_I2C_Master_Transmit(hi2c,(TCA9555_ADDRESS << 1)|(1|1),output_port_values,sizeof(output_port_values),HAL_MAX_DELAY); } ``` 以上就是关于如何利用 STM32TCA9555 执行基本的操作说明及其对应的源码示例。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值