本文内容:
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
1) 显示学号和姓名;
2) 显示AHT20的温度和湿度;
3) 上下或左右的滑动显示长字符
用示波器和逻辑分析仪对I2C、SPI、串口的信号进行测量,深入了解这些协议原理,并对照代码进行分析
目录
一、SPI协议
1.SPI简介
- SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
- SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。 SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输)
2.SPI 物理层
- SPI 通讯设备之间的常用连接方式,如下图:
3.SPI 协议层
- SPI 通讯的通讯时序,如下图所示:
4.SPI四种工作模式
SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:
① CPOL=0,串行时钟空闲状态为低电平。
② CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具体的传输协议。
③ CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④ CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
这四种工作模式如下图所示:
5.SPI时序图
以 CPOL=0, CPHA=0 这个工作模式为例, SPI 进行全双工通信的时序如下图所示:
从上图可以看出, SPI 的时序图很简单,不像 I2C 那样还要分为读时序和写时序,因为 SPI 是全双工的,所以读写时序可以一起完成。图中CS 片选信号先拉低,选中要通信的从设备,然后通过 MOSI 和 MISO 这两根数据线进行收发数据, MOSI 数据线发出了0XD2 这个数据给从设备,同时从设备也通过 MISO 线给主设备返回了 0X66 这个数据。这个就是 SPI 时序图。
二、硬件实现
1.实验准备
硬件:
- STM32开发板
- ATH20温湿度传感器
- 0.96寸OLED显示屏
- 杜邦线
软件:
- Keil5 MDK
- 串口调试助手
2.字模获取
文字取模的理论知识可以参考:汉字取模
字模软件下载
链接:https://pan.baidu.com/s/1tIyl4bRt7LKKNQVkNbCkWQ
提取码:1234
打开应用程序后,输入自己想要的汉字,即可。
我这里需要将正向的文字左旋 90 °,然后再向下翻转,这样,OLED 上显示的文字才是正向的。
3.代码编写
具体的工程文件:链接:https://pan.baidu.com/s/1i4FOYWawDklSqSLwPzln7A
提取码:1234
在 gui.c 下有个 oledfont.h 头文件,打开后,将 cfont16[ ] 数组内的内容修改成自己需要的中文文字点阵即可。
这里我添加的汉字字模有:袁、某、人、欢、迎、来、到、重、庆、交、通、大、学、物、联、网、实、训、室、温、度、湿、:、℃、%
然后在test.c文件最后设置自己想要显示的内容。
函数说明:
GUI_ShowChinese() 的参数
参数一:X 坐标
参数二:Y 坐标
参数三:汉字点阵大小(这里使用的是 16×16 的,参数应该是 16)
参数四:要显示的汉字
参数五:显示样式(1:白字黑底;0:黑字白底)
GUI_ShowString() 的参数
参数一:X 坐标
参数二:Y 坐标
参数三:字符串(ASCLL码中的)
参数四:bit (表示字符显示格式,这里我用的 16 ,和汉字一样高)
参数五:显示样式(1:白字黑底;0:黑字白底)
4.连线
打开main.c 对着连线即可
ATH20温湿度传感器的连接如下:
VCC→3V3,GND→GND,SCL→PB6,SDA→PB7
5.成果展示
三、逻辑分析
1.基本介绍
在Analyzers下可选择需要查看的协议。
点击开始仿真,逻辑分析仪可支持无硬件仿真,如果插入了硬件,这个按键会变成START
链接:https://pan.baidu.com/s/1_CASAWFFfdoRgZdAEOWYgQ
提取码:qwer
2.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应答信号的发送。
3.SPI协议
当CH3即SS为低电平时SPI协议开始工作,而当CH2即时钟信号在上升沿则MOSI和MISO同步开始发送和采集信号。
由图中可读出第一个信号的二进制码为MOSI:00010000以及MISO:00010001。
该函数是对SPI协议的一个初始化
该函数是SPI工作时的操作函数。
四、参考网站
基于 SPI 协议在 0.96 寸 OLED上【平滑显示汉字】及【温湿度数据采集显示】_ssj925319的博客-CSDN博客