STM32完成基于I2C协议的AHT20温湿度传感器的数据采集

本文详细介绍了STM32如何通过I2C协议与AHT20温湿度传感器交互,包括I2C协议原理、硬件I2C与软件I2C的区别,以及基于软件I2C的电路连接和数据采集过程。通过串口将数据发送到上位机,展示了温湿度变化的实时监测。
摘要由CSDN通过智能技术生成

本文将会解释什么是“软件I2C”和“硬件I2C”, 并且编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win11)。

一、I2C总线通信协议

1.什么是I2C协议

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

在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物理层

IIC一共有只有两个总线: 一条是双向的串行数据线SDA,一条是串行时钟线SCL

  • SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的
  • SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的

所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。

I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart通信为全双工。
I2C 通讯设备常用连接方式(引用野火资料中的图)

在这里插入图片描述

3.I2C协议层

主要是定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

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

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

4.软件IIC和硬件IIC

IIC分为软件IIC硬件IIC

(1)硬件I2C

直接利用 STM32 芯片中的硬件 I2C 外设。

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

(2)软件I2C

直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。

软件I2C的使用
需要在控制产生 I2C 的起始信号时,控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

(3)软件IIC和硬件IIC的差别

硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。对于硬件I2C用法比较复杂,软件I2C的流程更清楚一些。如果要详细了解I2C的协议,使用软件I2C可能更好的理解这个过程。在使用I2C过程,硬件I2C可能通信更加快,更加稳定。
参考文章IIC原理超详细讲解

二、STM32基于I2C协议的AHT20温湿度传感器的数据采集

1.前期准备

(1)了解AHT20芯片的相关信息
具体信息请到官方下载对应产品介绍文档,资料链接如下
http://www.aosong.com/class-36.html
(2)具体代码添加过程
在野火提供的示例代码中,打开一个只包含固件库的空项目。向工程中添加相关代码,添加代码的具体内容请参考下面链接:
https://blog.csdn.net/hhhhhh277523/article/details/111397514

2.编写代码

本文的代码将会在文末给出
主要代码的分析
①AHT20芯片的使用过程read_AHT20_once函数

void  read_AHT20_once(void)
{
   
	delay_ms(10);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于STM32H750VBT6单片机写AHT10湿度传感器程序的步骤: 1. 首先,需要连接STM32H750VBT6单片机和AHT10传感器。将AHT10的VCC引脚连接到STM32H750VBT6的3.3V电源引脚,将GND引脚连接到STM32H750VBT6的GND引脚,将SCL引脚连接到STM32H750VBT6的SCL引脚,将SDA引脚连接到STM32H750VBT6的SDA引脚。 2. 在STM32CubeIDE中创建一个新的工程,然后选择STM32H750VBT6单片机作为目标设备。 3. 在工程中添加I2C库文件和AHT10湿度传感器驱动程序。 4. 配置I2C总线的时钟和GPIO引脚。可以使用STM32CubeIDE提供的配置向导来完成此操作。 5. 初始化AHT10传感器。可以使用以下代码来初始化: ```c void AHT10_Init(void) { uint8_t buf[3]; buf[0] = 0xE1; buf[1] = 0x08; buf[2] = 0x00; HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDR, buf, 3, 1000); } ``` 6. 读取AHT10传感器的度和湿度值。可以使用以下代码来读取: ```c void AHT10_ReadData(float *temperature, float *humidity) { uint8_t buf[6]; buf[0] = 0xAC; buf[1] = 0x33; buf[2] = 0x00; HAL_I2C_Master_Transmit(&hi2c1, AHT10_ADDR, buf, 3, 1000); HAL_Delay(100); HAL_I2C_Master_Receive(&hi2c1, AHT10_ADDR, buf, 6, 1000); *humidity = ((buf[1] << 12) | (buf[2] << 4) | (buf[3] >> 4)) * 100 / 0x100000; *temperature = ((buf[3] & 0x0F) << 16 | (buf[4] << 8) | buf[5]) * 200 / 0x100000 - 50; } ``` 7. 在主函数中调用AHT10_Init函数和AHT10_ReadData函数来获取度和湿度值。 ```c int main(void) { float temperature, humidity; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); AHT10_Init(); while (1) { AHT10_ReadData(&temperature, &humidity); printf("Temperature: %.2f C\r\n", temperature); printf("Humidity: %.2f %%\r\n", humidity); HAL_Delay(1000); } } ``` 这样,就完成了基于STM32H750VBT6单片机写AHT10湿度传感器程序的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值