【嵌入式】STM32基于SPI通信协议OLED屏显示

您所在的位置:网站首页 在oled中显示波形程序 【嵌入式】STM32基于SPI通信协议OLED屏显示

【嵌入式】STM32基于SPI通信协议OLED屏显示

2024-07-13 19:45| 来源: 网络整理| 查看: 265

STM32基于SPI通信协议OLED屏显示 一、SPI协议和OLED介绍1.SPI协议介绍物理层协议层 2.OLED显示屏介绍 二、显示个人学号姓名实验1.题目要求2.代码部分1.完整代码2.文字取模 3.运行结果 三、显示AHT20采集的温湿度1.完整代码2.代码修改3.结果展示 四、上下或左右滑动显示长字符1.完整代码2.主要代码3.运行结果 五、总结参考博客

一、SPI协议和OLED介绍 1.SPI协议介绍

SPI(Serial peripheral interface)即串行外围设备接口,是由Motorola首先在其MC68HCxx系列单片机上定义的,基于高速全双工总线的通讯协议。(又是高速,而且全双工,确实强大)被广泛应用于ADC、LCD等设备与MCU之间。

跟前面学习I2C、USART一样,学习一种协议,还是从两个层面分析:物理层和协议层。

物理层

SPI通讯需要使用4条线:3条总线和1条片选 在这里插入图片描述  SPI还是遵循主从模式,3条总线分别是SCK、MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景:  在这里插入图片描述 (1) nSS(Slave Select):片选信号线,用于选中SPI从设备。每个从设备独立拥有这条nSS信号线,占据主机的一个引脚。设备的其他总线是并联到SPI主机的,即无论多少个从设备,都共同使用这3条总线。当从设备上的nSS引脚被置拉低时表明该从设备被主机选中。 (2) SCK(Serial Clock):时钟信号线,通讯数据同步用。时钟信号由通讯主机产生,它决定了SPI的通讯速率。 (3) MOSI(Master Ouput Slave Input):主机(数据)输出/从设备(数据)输入引脚,即这条信号线上传输从主机到从机的数据。 (4) MISO(Master Input Slave Ouput):主机(数据)输入/从设备(数据)输出引脚,即这条信号线上传输从机从到主机的数据主从机通过两条信号线来传输数据,那么自然是全双工通讯的了。之前的I2C通讯,数据只在一条SDA线上传输,主从机数据交互只能采用半双工。

协议层

在这里插入图片描述 如上为SPI通讯时序图,nSS、SCK、MOSI信号均由主机产生,MISO信号由从机产生。在nSS为低电平的前提下,MOSI和MISO信号才有效,在每个时钟周期MOSI和MISO传输一位数据。 跟I2C通讯类似,SPI通讯也需要通讯的起始/结束信号,有效数据和同步时钟。

通讯的起始/结束信号

图中的nSS信号由高电平变为低电平即为SPI通讯的起始信号,反过来,nSS信号由低电平变为高电平即为SPI通讯的结束信号。这个可比I2C简单得多吧。当从机检测到自身的nSS引脚被拉低时就知道自己被主机选中,准备和主机进行通讯。

有效数据的采集

SPI通讯的数据采集是个相对复杂的环节,先不说其他,以上图为例: 图中红色框框即为有效数据被采集的时间点,"CPOL = 0"所在的脉冲信号表示的是用于进行数据同步的SCK,MOSI和MISO线上的数据在每个SCK时钟周期传输一位数据,注意,数据的输入/输出是可以同时进行的。   由图可见,在SCK为奇数(更正:这里应该是偶数)边沿(在这里该边沿为下降沿)时,数据得到有效采样,也就是说,在这个时刻,MISO和MOSI的数据有效,高电平表示数据1,低电平表示数据0,在其它时刻数据并无效,可以理解为为下一次MISO和MOSI的数据传输做准备。   数据在传输中,高位在先还是低位在先,SPI协议并无明确规定,但是数据要在主从机中正确传输,自然双方要先约定好,一般会采用高位在先(MSB)方式传输。

完整的时序图如下: 在这里插入图片描述

2.OLED显示屏介绍

OLED即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。 在这里插入图片描述 LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。

我们使用的是 ALINETEK 的 OLED 显示模块,该模块有以下特点: 1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。 2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mmx26mm 大小。 3)高分辨率,该模块的分辨率为128x64。 4)多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的穿行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了)。 5)不需要高压,直接接 3.3V 就可以工作了。 0.96寸OLED显示屏相关介绍可参考链接:

http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module OLED引脚接法 在这里插入图片描述

二、显示个人学号姓名实验 1.题目要求

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能: 显示自己的学号和姓名;

2.代码部分 1.完整代码

链接:https://pan.baidu.com/s/1vawtPaudZmzuWdMjImrF3Q 提取码:qwer

2.文字取模

字模软件下载 提取码:qwer 1.打开软件,选择选项,配置字模选项 在这里插入图片描述 2.输入要显示的数据,点击生成字模 在这里插入图片描述 3.修改程序 内容显示 TEST_MainPage函数->test.c文件

void TEST_MainPage(void) { // GUI_ShowString(28,0,"yao",16,1);//英文姓名 GUI_ShowCHinese(28,20,16,"姚思彤",1);//中文姓名 GUI_ShowString(4,48,"631907030429",16,1);//数字详细 delay_ms(1500); delay_ms(1500); }

将字模 添加到oledfont.h 在这里插入图片描述 主函数修改

int main(void) { delay_init(); //延时函数初始化 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑) while(1) { TEST_MainPage(); //界面显示 } }

4.编译烧录 编译结果 在这里插入图片描述 烧录 在这里插入图片描述

3.运行结果

在这里插入图片描述

三、显示AHT20采集的温湿度 1.完整代码

https://pan.baidu.com/s/1fwpkkrHpujE57SGZBOXlmQ 提取码:qwer

2.代码修改

main.c

#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); } }

温湿度显示read_AHT20函数->bsp_i2c.c文件

void read_AHT20(void) { uint8_t i; for(i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3