基于HAL库的AHT20温湿度采集

一、I2C总线通信协议

1.I2C介绍

IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps 以上。

注意IIC是为了与低速设备通信而发明的,所以IIC的传输速率比不上SPI

I²C最重要的功能包括:

只需要两条总线; 没有严格的波特率要求,例如使用RS232,主设备生成总线时钟; 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址; I²C是真正的多主设备总线,可提供仲裁和冲突检测; 传输速度: 标准模式:Standard Mode = 100 Kbps 快速模式:Fast Mode = 400 Kbps 高速模式: High speed mode = 3.4 Mbps 超快速模式: Ultra fast mode = 5 Mbps 最大主设备数:无限制; 最大从机数:理论上是127。

2.I2C物理层

I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,SCL和SDA被上拉电阻Rp拉高,使SDA和SCL线都保持高电平。

I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart通信为全双工。

主机和从机的概念:

主机就是负责整个系统的任务协调与分配,从机一般是通过接收主机的指令从而完成某些特定的任务,主机和从机之间通过总线连接,进行数据通讯。 发布主要命令的称为主机,接受命令的称为从机

3.I2C协议层

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

开始信号SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。 ​ 结束信号SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。 ​ 应答信号接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

4.软件IIC和硬件IIC

IIC分为软件IIC和硬件IIC

软件IIC 软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。 使用: 需要在控制产生 I2C 的起始信号时,控制作为SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

直接利用 STM32 芯片中的硬件 I2C 外设。 使用: 只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。

硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。

二、使用CubeMX创建工程

1.新建工程,选择芯片

2.配置RCC

 3.配置SYS

 4.配置USART1

 5.配置I2C

 

 6.NIVC

 7.GPIO

8.时钟配置

 9.创建工程

 

 三、修改代码

1.去奥松官网下载AHT20芯片代码与芯片的相关信息介绍文档: 软件下载-温湿度传感器 温湿度芯片 温湿度变送器模块 气体传感器 流量传感器 广州奥松电子股份有限公司

官方代码使用的是PB14,PB15引脚,需要修改引脚为PB6,PB7 才可以正常使用。

2.进入到下载的AHT20芯片代码文件夹中,复制两个C语言代码文件

3.找到刚刚利用HAL库生成的工程文件,在其中找到Core文件夹下的Inc文件夹,并且进入其中 ,将AHT20-21_DEMO_V1_3.h复制在此Inc文件夹下:

 4.找到刚刚利用HAL库生成的工程文件,在其中找到Core文件夹下的Src文件夹,并且进入其中 ,将AHT20-21_DEMO_V1_3.c复制在此Src文件夹下:

 

5.进入到 keil5工程文件中,添加AHT20-21_DEMO_V1_3.c文件:

 6.修改main.c

/* USER CODE BEGIN Header */
/**
  *******************************
### 使用 AHT20 温湿度传感器读取温度数据 为了从AHT20温湿度传感器读取温度数据,可以采用基于I2C协议的方式,在STM32平台上实现这一功能。具体来说,初始化阶段需确保设备处于正常工作状态并准备好接收指令。 在初始化过程中,程序会先延时等待一段时间让传感器稳定下来[^1]: ```c HAL_Delay(40); ``` 随后向AHT20发送命令以确认其状态,并依据返回的状态码判断是否继续执行后续操作。如果一切顺利,则进一步发出启动测量模式的指令序列来激活传感器进入准备就绪的工作模式[^4]: ```c if ((readBuffer & 0x08) == 0x00) { uint8_t sendBuffer[3] = { 0xBE , 0x08 , 0x00 }; HAL_I2C_Master_Transmit(&hi2c, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY); } ``` 当需要实际获取温度数值时,应构建相应的函数用于触发传感器进行新一轮的数据采样过程。这通常涉及到调用`HAL_I2C_Master_Transmit()`方法传送特定控制字节给目标地址对应的寄存器位置;紧接着利用`HAL_I2C_Master_Receive()`接受来自该器件所反馈回来的一系列原始二进制编码形式的结果集[^2]。 对于接收到的数据包而言,其中包含了表示相对湿度以及摄氏度的信息字段。这些值是以大端序排列的小数部分和整数部分组合而成的大于零的无符号短整形变量。因此,在解析之前有必要按照官方文档给出的比例因子将其转换成易于理解的实际物理量单位[^3]。 最后一步就是周期性的重复上述流程,比如每两秒执行一次完整的交互动作链路直至应用程序结束运行为止。期间还可以考虑借助串行接口把最终处理完毕后的结果实时传输至上位机界面供用户查看分析之用。 ```python def get_temperature(): # 假设已经完成了必要的初始化设置 while True: # 发送请求以开始新的测量循环... time.sleep(2) # 接收响应中的有效载荷... raw_data = ... # 这里应该是具体的读取逻辑 temperature = (raw_data[3]<<12 | raw_data[4]<<4 | raw_data[5]>>4)/1048576*200-50 yield round(temperature, 2) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值