用STM32完成AHT20温湿度传感器的数据采集并将采集的温度-湿度值通过串口输出(1)

学习要求

1.学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:
1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节)
2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
2. 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

  1. 显示自己的学号和姓名;
  2. 显示AHT20的温度和湿度;
  3. 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
    3.用示波器和逻辑分析仪对I2C、SPI、串口的信号进行测量,深入了解这些协议原理,并对照上述作业代码进行分析(时间不够可下次实验完成)。

一、了解I2C总线协议

1.什么是I2C协议

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

2.I2C 协议的物理层和协议层

①物理层
I2C是一个支持设备的总线。可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。对于I2C 总线,只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。
②协议层
主要是定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。

3.I2C的两种方式——硬件I2C和软件I2C

①硬件I2C
直接利用 STM32 芯片中的硬件 I2C 外设。
硬件I2C的使用
只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。
②软件I2C
直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。
软件I2C的使用
需要在控制产生 I2C 的起始信号时,控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。
③两者的差别
硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。对于硬件I2C用法比较复杂,软件I2C的流程更清楚一些。如果要详细了解I2C的协议,使用软件I2C可能更好的理解这个过程。在使用I2C过程,硬件I2C可能通信更加快,更加稳定。

二、进行温度采集

1.连接硬件
AHT20的SCL,GND,SDA,VCC分别对应接stm32f103指南者i2c模块的2.B6,G代码实现
此处在固件库版的空白工程上进行添加代码,并实现以下功能:
每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机
首先主函数如下:
main.c

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"


int main(void)
{	
	delay_init();     //ÑÓʱº¯Êý³õʼ»¯	  
	uart_init(115200);	 //´®¿Ú³õʼ»¯Îª115200
	IIC_Init();
		while(1)
	{
		printf("¿ªÊ¼²âÁ¿£¬ÇëÉԵȣº");
		read_AHT20_once();
		delay_ms(1500);
  }
}

然后把以下代码文件和main.c放到一起
usart.c

这里只展示部分代码,具体的代码请参考这位博主的:https://blog.csdn.net/hhhhhh277523/article/details/111397514

然后把产生的hex文件烧录到stm32中,打开串口调试助手,即可看到实验结果。
效果图如下:
请添加图片描述
对着芯片吹起发现温度湿度均有变化,实验成功。

三、基于SPI通信方式的OLED显示自己的学号姓名

1.SPI简介以及优缺点

https://blog.csdn.net/qq_45237293/article/details/111712565

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是由 Motorola 公司提出的一种高速的,全双工,同步的通信总线,被广泛地使用在 ADC、LCD 等设备与 MCU 间要求通讯速率较高的场合。SPI总线系统可直接与各个厂家生产的多种标准外围器件连接,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线C/S(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
SPI 一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性 CPOL”和“时钟相位 CPHA”的概念。
时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK 的状态)。CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,则相反。
时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿”采样。

2.OLED显示学号姓名

实验连接
在这里插入图片描述
显示姓名学号
在这里插入图片描述
字库取模
由于OLED显示中使用了中文字符,因此需要将中文进行取模得到中文的点阵编码并存到oledfont.h中,方便程序调用并显示到OLED上去。
在这里插入图片描述
在这里插入图片描述
代码部分请参考博客:
基于SPI通信方式的OLED显示
https://blog.csdn.net/qq_45237293/article/details/111712565

四、总结

本次温度传感器的数据收集是为了后面将采集的温度-湿度值通过串口输出,显示学号姓名也是对基于SPI通信方式的OLED显示的一个初级了解,本次实验虽操作简单,但是重点是要了解这些代码,也是对于I2C协议和SPI通信方式进行通信的一个过程理解。

五、参考文献

AHT20温度采集:https://blog.csdn.net/hhhhhh277523/article/details/111397514
基于SPI通信方式的OLED显示:
https://blog.csdn.net/qq_45237293/article/details/111712565

版权声明:本文为CSDN博主「狗都不写系列」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46631196/article/details/121407651

狗都不写系列

我还没有学会写个人说明!

暂无评论

相关推荐

ESP32 micropython 应用填坑(一):数据协议

前言 21国赛中的K210就用了这一套代码,当时在用micropython时发现它的串口只能发送字符串型的数字,但是实际上很不方便,就比如TI的MSP432系列,它的串口接收会把数据强制转

单路USB转单/多路串口方案

单路USB转单/多路串口方案 在日常开发或产品设计时,会遇到不少使用串口通讯或者调试的情况,一个串口时使用USB转单路串口则可优雅解决,但若是多个串口时则可能需要占据多个USB口,颇为麻

常兴串口调试助手

1,支持常用的300-9600波特率,能设置端口参数; 2,能以ASCII码或十六进制收发数据,真正支持中文字符的收发; 3,接收到的16进制数据选中后能以10进制和2进制显示。方便查看数