STM32软件IIC驱动TCA9548A多路测量AHT10

STM32软件IIC驱动TCA9548多路测量AHT10

TCA9548A

TCA9548A 有八个可通过 I2C 总线控制的双向转换开关,SCL/SDA 上行对扩展到八个下行对,或者通道,适用于系统中存在I2C目标地址冲突的情况。8路双向转换开关,同一时刻只能选择打开一个通道。

三个地址引脚A0,A1,A2,I2C 总线最多支持八个TCA9548A 器件。最多可以在同一条线下接8个TCA9548A模块,每个TCA9548A模块下可以再接8个I2C设备,这样在一个总线下最高可以挂载64个设备。

TCA9548A写指令:

开始 → 写命令(0x70)→ 选择对应的通道(eg:选择通道0,则写入0x01) → 结束

选择哪个通道就对应的哪个通道置1

TCA9548A读指令:

开始 → 读命令(0x71)→ 接收从机数据 → 结束

AHT10

关于AHT10的详细说明可以看一下两篇文章进行了解: STM32驱动AHT10(OLED显示)51驱动AHT10串口输出,这里就不做具体的说明介绍了。

这里说下相关指令的流程和注意事项:

AHT10写指令:

开始 → 写指令(0x70) → 触发测量指令(0xac) → 命令参数(0x33) → 命令参数(0x00) → 结束

AHT10读指令(温湿度数据都是20bit):

开始 → 读指令(0x71) → 状态寄存器数据读取 → 湿度数据[19:12] → 湿度数据[11:4] → 湿度数据[3:0] + 温度数据[19:16] → 温度数据[15:8] → 温度数据[7:0] → 结束

还有两个注意事项:

1.上电后,传感器最多需要20毫秒时间(此时 SCL为高电平)以达到空闲状态,即做好准备接收由主机(MCU)发送的命令。

2.传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。若状态比特位[Bit7]为0代表数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。

代码逻辑

代码展示

STM32F103C8T6软件IIC驱动TCA9548A拓展2路AHT10温湿度测量(OLED显示通道0温湿度测试数据,串口1输出通道7温湿度数据)

main.c :

c 复制代码
uint32_t CT_data[2];
volatile int  c1,t1;
uint8_t Data;
void AHT10_Measure(void)
{
    OLED_ShowString(1, 5, "AHT10_Test");
    OLED_ShowString(2, 4, "HUM:");
    OLED_ShowString(3, 4, "TEM:");
    while(AHT10_Read_Cal_Enable()==0)//等到校准输出使能位为1,才读取。
    {
        AHT10_Init();//如果为0再使能一次
        Delay_ms(50);
    }
    AHT10_Read_CTdata(CT_data);  //读取温度和湿度 , 可间隔1.5S读一次
    c1 = CT_data[0] * 1000 / 1024 / 1024;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)
    t1 = CT_data[1] * 200 * 10 / 1024 / 1024 - 500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)
    //显示湿度
    OLED_ShowNum(2, 10, c1 / 10, 2);
    OLED_ShowString(2, 12, ".");
    OLED_ShowNum(2, 13, c1 % 10, 1);
    OLED_ShowString(2, 15, "%");
    //显示温度
    OLED_ShowNum(3, 10, t1 / 10, 2);
    OLED_ShowString(3, 12, ".");
    OLED_ShowNum(3, 13, t1 %  10, 1);
    OLED_ShowString(3, 15, "C");  
    Delay_ms(1500); //延时1.5S 
}
int main(void)
{
    /*模块初始化*/
    OLED_Init();		//OLED初始化
    TCA9548A_Init();     //TCA9548初始化
    Serial_Init();
    
    while(1)
    {
        //选择通道0
        TCA9548A_WriteByte(0);
        Data = TCA9548A_ReadByte();
        OLED_ShowHexNum(1, 1, Data, 2);
        AHT10_Measure();
        
        //选择通道7
        TCA9548A_WriteByte(7);
        Data = TCA9548A_ReadByte();
        
        while(AHT10_Read_Cal_Enable()==0)//等到校准输出使能位为1,才读取。
        {
            AHT10_Init();//如果为0再使能一次
            Delay_ms(30);
        }
        AHT10_Read_CTdata(CT_data);  //读取温度和湿度 , 可间隔1.5S读一次
        c1 = CT_data[0]*1000/1024/1024;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)
        t1 = CT_data[1] *200*10/1024/1024-500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)
        //湿度
        Serial_Printf("       H:");
        Serial_SendNumber(c1/10, 2);
        Serial_Printf(".");
        Serial_SendNumber(c1%10, 1);
        Serial_SendString("%");
        Serial_Printf("        ");
        //温度
        Serial_Printf("T:");
        Serial_SendNumber(t1/10, 2);
        Serial_Printf(".");
        Serial_SendNumber(t1%10, 1);
        Serial_Printf(" C\n");
        
	}
}

TCA9548A.c

c 复制代码
#include "stm32f10x.h"   
#include "TCA9548A.h"
#include "MyI2C.h"

#define TCA9548_ADD  0x70       //TCA9548的I2C从机地址

//TCA9548A读一个字节的寄存器
uint8_t TCA9548A_ReadByte(void)
{
    uint8_t Data;
    MyI2C_Start();
    MyI2C_SendByte(TCA9548_ADD << 1 | 0x01);   //发送从机地址,读写位为1,表示即将读取,0x71
    MyI2C_ReceiveAck();
    Data = MyI2C_ReceiveByte();
    MyI2C_SendAck(1);
    MyI2C_Stop();
    
    return Data;
}

//TCA9548A写一个字节的寄存器,用来选择通道
void TCA9548A_WriteByte(uint8_t Channel)
{
    MyI2C_Start();
    MyI2C_SendByte(TCA9548_ADD << 1 | 0x00);    //发送从机地址,读写位为0,表示即将写入,0x70
    MyI2C_ReceiveAck();
    MyI2C_SendByte(1 << Channel);
    MyI2C_ReceiveAck();
    MyI2C_Stop();
}

//TCA9548A初始化
void TCA9548A_Init(void)
{
    MyI2C_Init(); 
}

现象

通道7串口输出

通道0 OLED显示

总结

AHT10需要留够时间给模块初始化和测量数据,不然读出数据可能会有错误。

需要整个工程代码可以在下方评论留言哦!

相关推荐
风逸尘_lz16 小时前
STM32标准工程目录文件解释
stm32·单片机·嵌入式硬件
进击的横打19 小时前
【车载开发系列】系统时钟与定时器
stm32·单片机·fpga开发
LCG元19 小时前
STM32实战案例:基于STM32F103的智能插座(电量计量+远程控制)
stm32·单片机·嵌入式硬件
爱喝纯牛奶的柠檬19 小时前
基于STM32和HAL库的大夏龙雀BT311-10C02S蓝牙模块驱动
stm32·单片机·嵌入式硬件
小谦325120 小时前
NTC热敏电阻分压测量电路的数学特性与应用选择研究
stm32·嵌入式硬件
Xueqian E21 小时前
驱动策略和效率的整理
stm32·单片机·嵌入式硬件
嵌入式老菜鸟qq1252427731 天前
nRF54H20 + Zephyr 开发环境(二):烧录与踩坑实录
stm32·单片机·嵌入式硬件
CODE_RabbitV1 天前
STM32F103C8T6 理论部分学习笔记
笔记·stm32·学习
Heartache boy1 天前
野火STM32_HAL库版课程笔记-空气、烟雾传感器公式换算
笔记·stm32·嵌入式硬件
yuan199971 天前
STM32F407 TIM3正交编码器应用指南
stm32·单片机·嵌入式硬件