基于I2C的温湿度采集(AHT20)OLED显示

目录

一、SPI的简介

二、OLED显示个人学号姓名

1.文字取模方法 

​ 2.代码编写

三、结果展示

1.硬件连接 

 2.效果展示

四、使用逻辑分析仪深入了解协议

1. I2C协议 

2.SPI协议 

五、参考文献及资料 

1.相关资料 

 2.参考文献


一、SPI的简介

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

 在这里插入图片描述

SPI 通讯设备之间的常用连接方式,如下图: 

SPI数据发送接收
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。

首先拉低对应SS信号线,表示与该设备进行通信
主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
这里要注意,SCLK时钟信号可能是低电平有效,也可能是高电平有效,因为SPI有四种模式,这个我们在下面会介绍
主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

 SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

SPI的通信协议

这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

二、OLED显示个人学号姓名

1.文字取模方法 

由于OLED显示中使用了中文字符,因此需要将中文进行取模得到中文的点阵编码并存到oledfont.h中,方便程序调用并显示到OLED上去。 

 字模软件下载链接:百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1GRe2X3p2ETJJEFwXsnV1sw
提取码:fn8i

打开应用程序,输入自己选取的汉字,注意,这里需要将正向的文字左旋 90 °,然后再向下翻转,这样,OLED 上显示的文字才是正向的。

 2.代码编写

主要程序举例:

main.c

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "bsp_i2c.h"
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	OLED_Init();			         //初始化OLED
	IIC_Init();                //初始化IIC
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{
		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(0x01,OLED_CMD);        //终止页 1
		OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
		OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
		TEST_ShowMyName();                  //显示文本
		read_AHT20_once();                  //读取温度并显示
		OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动		
		delay_ms(1500);
		delay_ms(1350);

内容显示函数test.c

void TEST_ShowMyName(void)
{
	GUI_ShowCHinese(0,0,16,"重庆交通大学",1);
	GUI_ShowString(0,16,"631907123",16,1);
	GUI_ShowCHinese(80,16,16,"张某人",1);
}

其余代码放在文末,读者可以参考

三、结果展示

1.硬件连接 

PA9连到USB模块的RX,PA10连到USB模块的TX,温湿度传感器的SCL连接PB6,SDA连接PB7 

 OLED连线如图

 2.效果展示

四、使用逻辑分析仪深入了解协议

1. I2C协议 

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

对于I2C协议前面有所提到,当SCL为高电平时,SDA才有作用, 每一个上升沿读取一个bit,则第一个波形对应的二进制信号为01000001,而最后一个是I2C协议的一个应答信号,当SDA为低电平时表示ACK希望继续接收信号,当SDA为高电平表示NAK表示不接收信号了。

分析代码: 

首先初始化SCL和SDA都为高电平,那么在SDA从高电平跳变到低电平时表示开始接收。 

 

开始接收,SDA从1到0 

 该函数功能即将SCL为高电平时,存储SDA的电平值。

 这两个函数定义了ACK和NAK应答信号的发送。

2.SPI协议 

 当CH3即SS为低电平时SPI协议开始工作,而当CH2即时钟信号在上升沿则MOSI和MISO同步开始发送和采集信号,由图中可读出第一个信号的二进制码为MOSI:00111000以及MISO:00111001。

分析代码:

该函数是对SPI协议的一个初始化 

 

 该函数是SPI工作时的操作函数。

五、参考文献及资料 

1.相关资料 

代码相关资料:链接:https://pan.baidu.com/s/1CebJFltCz5Jzo8rhY12HuQ 
提取码:2002 

 2.参考文献

 基于SPI通信方式的OLED显示_不#曾&轻听的博客-CSDN博客本文目的是通过SPI的通信方式进行OLED的显示,同时与之前学的I2C通信方式进行对比,在实践中学习SPI通信。目录(一)SPI简介(一)SPI简介https://blog.csdn.net/qq_45237293/article/details/111712565

基于STM32的0.96寸OLED显示屏显示数据_Harriet的博客-CSDN博客_基于stm32的oled显示时间https://blog.csdn.net/qq_43279579/article/details/111414037

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值