两个TCA9548A,8路I2C开关,嵌套

文章介绍了如何在嵌入式系统中通过TCA9548A进行8路I2C通道的控制,包括TCA9548A_SetChannel函数的实现,以及如何通过串口发送指令来控制另一个PCA9546A板子的通道。作者展示了如何在切换两个通道时检测到额外的I2C通道数。
摘要由CSDN通过智能技术生成

1.开关原理

2.控制板上的8路I2C开关程序

#include "BSP_IIC.h"
#include "GPIO.h"
#include "stm32f4xx_hal.h"
#include "i2c.h"


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, &data, 1, 10);//硬件I2C

// TCA9548A_SetChannel(1)  | TCA9548A_WRITE_BIT
	//1110 0000
}

 3.嵌套了另一块板子的8路IIC开关

1).C文件 

#include "TCA9548ASW0.h"
#include "stdio.h"
#include "gpio.h"
#include "I2C.h"
#include "String.h"
#include "BSP_Protocol.h"
#include "usart.h"
#include "PCA9546A_SW.h"

void TCA9548A_SW0_SetChannel(uint8_t channel)
{		
    uint8_t data;
    switch(channel)
    {
        case 0:
            data = TCA9548A_SW0_CHANNEL_0;
            break;
        case 1:
            data = TCA9548A_SW0_CHANNEL_1;
            break;
        case 2:
            data = TCA9548A_SW0_CHANNEL_2;
            break;
        case 3:
            data = TCA9548A_SW0_CHANNEL_3;
            break;
        case 4:
            data = TCA9548A_SW0_CHANNEL_4;
            break;
        case 5:
            data = TCA9548A_SW0_CHANNEL_5;
            break;
        case 6:
            data = TCA9548A_SW0_CHANNEL_6;
            break;
        case 7:
            data = TCA9548A_SW0_CHANNEL_7;
            break;
        default:
            break;        
    }
    HAL_I2C_Master_Transmit(&hi2c2, TCA9548A_SW0_ADDR , &data, 1, 1000);
// TCA9548A_SetChannel(1)  | TCA9548A_WRITE_BIT
	//1110 0000
}
void SET_PDBSW0(void)  //串口发送指令去识别
{

	char String[64];
	char *Str;
	if(strncmp((char*)RxBuffer1,"SET_PDBSW0",10) == 0)
	{
		strtok_r((char*)RxBuffer1,":",&Str);
	}
	
	if(strncmp((char*)Str,"0",1) == 0)
	{
		TCA9548A_SW0_SetChannel(0);
		sprintf(String,"SET_PDB_SW0 OK\r\n");
		Send_String_Function(String);
	}
	if(strncmp((char*)Str,"1",1) == 0)
	{
		TCA9548A_SW0_SetChannel(1);
		sprintf(String,"SET_PDB_SW1 OK\r\n");
		Send_String_Function(String);		
	}
	if(strncmp((char*)Str,"2",1) == 0)
	{
		TCA9548A_SW0_SetChannel(2);
		sprintf(String,"SET_PDB_SW2 OK\r\n");
		Send_String_Function(String);		
	}
	if(strncmp((char*)Str,"3",1) == 0)
	{
		TCA9548A_SW0_SetChannel(3);
		sprintf(String,"SET_PDB_SW3 OK\r\n");
		Send_String_Function(String);
	}
	if(strncmp((char*)Str,"4",1) == 0)
	{
		TCA9548A_SW0_SetChannel(4);
		sprintf(String,"SET_PDB_SW3 OK\r\n");
		Send_String_Function(String);
	}
	if(strncmp((char*)Str,"5",1) == 0)
	{
		TCA9548A_SW0_SetChannel(5);
		sprintf(String,"SET_PDB_SW5 OK\r\n");
		Send_String_Function(String);
	}
	if(strncmp((char*)Str,"6",1) == 0)
	{
		TCA9548A_SW0_SetChannel(6);
		sprintf(String,"SET_PDB_SW6 OK\r\n");
		Send_String_Function(String);
	}
	if(strncmp((char*)Str,"7",1) == 0)
	{
		TCA9548A_SW0_SetChannel(7);
		sprintf(String,"SET_PDB_SW7 OK\r\n");
		Send_String_Function(String);
	}
}

2. .h文件

#ifndef __TCA9548ASW0_H__
#define __TCA9548ASW0_H__

#include "gpio.h"

#define TCA9548A_SW0_ADDR		0xEE

#define TCA9548A_SW0_CHANNEL_0          0x01
#define TCA9548A_SW0_CHANNEL_1          0x02
#define TCA9548A_SW0_CHANNEL_2          0x04
#define TCA9548A_SW0_CHANNEL_3          0x08
#define TCA9548A_SW0_CHANNEL_4          0x10
#define TCA9548A_SW0_CHANNEL_5          0x20
#define TCA9548A_SW0_CHANNEL_6          0x40
#define TCA9548A_SW0_CHANNEL_7          0x80

void TCA9548A_SW0_SetChannel(uint8_t channel);
void SET_PDBSW0(void);




#endif

4.结果展示 

 1)Step1:切主控板 I2C通道4

2)Step 2:切主控板通道4的同时,切另一块板子的通道6.

可以对比出,连切两个通道后多扫出了几个I2C通道。

 

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值