基于I2C的AHT20温度采集器以及基于SPI协议OLED显示

本文详述了I2C和SPI通讯协议的基本原理,包括起始和停止信号、数据有效性以及硬件与软件实现的区别。同时,介绍了AHT20温湿度传感器的使用以及OLED显示屏的滚动命令。通过实例展示了如何采集温度数据并显示在OLED屏幕上,包括显示个人信息、AHT20数据以及实现滚动显示效果。
摘要由CSDN通过智能技术生成

目录

一、知识点

  1.1 关于I2C协议

  1.2 关于SPI协议

  ​

1.3 了解AHT20芯片的相关信息

  1.4 OLED屏的滚动命令

  1.5 AHT20引脚接法

  1.6 OLED引脚接法

二、采集温度传至上位机

   2.1 打开工程文件

   2.2 编译烧录

   2.3 运行结果

三、基于SPI的OLED显示

   3.1 显示自己的学号姓名

       3.1.1 代码

       3.1.2 汉字取模软件

       3.1.3 编译烧录

       3.1.4 运行结果

   3.2 显示AHT20的温度湿度

       3.2.1 主要代码

       3.2.2 编译烧录

       3.2.3 运行结果

   3.3 左右滑动显示长字符

      3.3.1 代码

      3.3.2 编译烧录

      3.3.3 运行结果

四、总结

五、参考链接            


一、知识点

  1.1 关于I2C协议

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

物理层

 协议层

 主要是定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。

当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。

当 SCL 是高电平时 SDA线由低电平向高电平切换,表示通讯的停止。

可以看出I2C在通讯的时候,只有在SCL处于高电平时,SDA的数据传输才是有效的。SDA 信号线是用于传输数据,SCL 信号线是保证数据同步。

当SDA传输数据后,接收方对接受到的数据进行一个应答。如果希望继续进行传输数据,则回应应答信号(低电平),否则回应非应答信号(高电平)。

软件I2C和硬件I2C

软件I2C和硬件I2C


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

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

②软件I2C

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

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

③两者的差别

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

  1.2 关于SPI协议

SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface) ,即串行外围设
备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC 、 LCD 等设备与 MCU 间,
要求通讯速率较高的场合。

  • SPI物理层
  • SS( Slave Select):从设备选择信号线,常称为片选信号线。
    SCK (Serial Clock):时钟信号线,用于通讯数据同步。
    MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。
    MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。
  • SPI协议层
  • SPI 基本通讯过程

  

MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

通讯的起始和停止信号
在图 25-2 中的标号① 处, NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个
从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选
中了,开始准备与主机通讯。在图中的标号⑥ 处, NSS 信号由低变高,是 SPI 通讯的停止
信号,表示本次通讯结束,从机的选中状态被取消。
数据有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。 MOSI 及
MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据
传输时, MSB 先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同
样的协定,一般都会采用图 25-2 中的 MSB 先行模式。
CPOL/CPHA 及通讯模式

1.3 了解AHT20芯片的相关信息

具体信息请到官方下载对应产品介绍文档,资料链接如下
软件下载-温湿度传感器 温湿度芯片 温湿度变送器模块 气体传感器 流量传感器 广州奥松电子股份有限公司

  1.4 OLED屏的滚动命令

水平左右移动

OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

垂直和水平滚动

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 1
OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

 本OLED屏的芯片类型:SSD1306
详细命令的介绍,请查找SSD1306-OLED驱动中文手册或者参考下面链接进行了解
SSD1306(OLED驱动芯片)指令详解_朝气蓬勃-CSDN博客

  1.5 AHT20引脚接法

SCL-->PB6

SDA-->PB7 

本文代码主要使用PB6,PB7引脚,如果需要使用其它引脚可自行修改。

  1.6 OLED引脚接法

.96寸OLED显示屏相关介绍
参考下面链接:
0.96inch SPI OLED Module - LCD wiki

二、采集温度传至上位机

   2.1 打开工程文件

   2.2 编译烧录

需要找到在output中生成的usart.hex文件

   2.3 运行结果

三、基于SPI的OLED显示

   3.1 显示自己的学号姓名

       3.1.1 代码

       3.1.2 汉字取模软件

  不同的取模方式对应的十六进制码是不一样的

将下面的字模加入代码

       3.1.3 编译烧录

       3.1.4 运行结果

   3.2 显示AHT20的温度湿度

       3.2.1 主要代码

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"
 
#include "oled.h"
#include "gui.h"
#include "test.h"
 
int main(void)
{	
	delay_init();	    	       //延时函数初始化    	  
	uart_init(115200);	 
	IIC_Init();
		  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0); 
	while(1)
	{
		//printf("温度湿度显示");
		read_AHT20_once();
		OLED_Clear(0); 
		delay_ms(1500);
  }
}

       3.2.2 编译烧录

       3.2.3 运行结果

   3.3 左右滑动显示长字符

      3.3.1 代码

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
  OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27
  OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
	OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
	OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
	while(1) 
	{	
		
		
	}
}

      3.3.2 编译烧录

      3.3.3 运行结果

四、总结

 基于对I2C和SPI协议的学习,我明白了这些芯片底层的逻辑,并且通过逻辑分析仪更加深层次的理解了协议的工作原理,此次实验使得自己的动手能力有所提高,也明白了点阵格式转换成十六进制格式。此次项目的代码是比较多的,需要仔细的去理解每一个模块的函数的使用和意义。

五、参考链接            

  (17条消息) 基于I2C的AHT20温度采集器以及基于SPI协议OLED显示_Laul Ken-Yi的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值