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通道。