SPI 协议
是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口
,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
2.1. SPI物理层
SPI 通讯设备之间的常用连接方式如下:
SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为SS。
① SS(Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS。
当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从备,就有多少条片选信号线。
SPI 通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。
②SCK (Serial Clock):时钟信号线,用于通讯数据同步。
它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
③MOSI (Master Output, Slave Input):):主设备输出/从设备输入引脚。
主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
④MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。
主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
2.2. SPI协议层
SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
SPI 基本通讯过程如下图:
这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。
更多内容请参考 【野火®】零死角玩转STM32—F103-MINI.pdf
提取码:1234
引脚连线如下:
模块引脚 | 对应STM32开发板接线 |
---|---|
GND | GND |
VCC | 3.3V/5V |
D0 | PB13 |
D1 | PB15 |
RES | PB12 |
DC | PB10 |
CS | PB11 |
更多介绍请移步:0.96inch SPI OLED Module
本实验完整工程代码下载详见参考链接。
程序下载链接:
0.96寸SPI_OLED模块配套资料包
打开下载完的资料包,选择Demo,然后使用keil软件打开与自己平台相同的工程实例
我们这里要进行名字+数字显示,由于程序不能显示所有的中文,所以需要将要显示的文字对应的点阵表示添加到程序中
3.1.字模提取
进入汉字字模提取网页版(不用下载字模提取软件):https://www.23bei.com/tool-218.html
输入需要取模的汉字,点击取模进行汉字的点阵表示
3.2. 添加存储代码
本过程显示的中文内容为“小小星”,因此便添加对应的点阵表示代码如下:
"小",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x40,0x05,0x20,0x09,0x10,
0x09,0x08,0x11,0x04,0x21,0x04,0x41,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
"星",0x00,0x08,0x3F,0xFC,0x20,0x08,0x3F,0xF8,0x20,0x08,0x3F,0xF8,0x01,0x00,0x21,0x08,
0x3F,0xFC,0x21,0x00,0x41,0x10,0xBF,0xF8,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00,
在oledfont.h
文件进行存储代码添加:
3.3. 显示代码修改
在test.c
文件中,将显示代码修改成以下代码:
void TEST_MainPage(void)
{
GUI_ShowString(28,0,"stars",16,1); //显示英文字符串
GUI_ShowCHinese(28,20,16,"小小星",1); //显示中文汉字
GUI_ShowString(4,48,"631907030123",16,1); //显示数字
delay_ms(1500);
delay_ms(1500);
}
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
while(1)
{
TEST_MainPage(); //主界面显示测试
}
}
点击左上角的编译按钮进行编译,生成相应的.hex文件
打开mcuisp软件进行.hex文件烧录
本过程主要是理解OLED屏显和汉字点阵编码原理,再通过理解进行使用操作。资料包中除了给出的几个汉字点阵外,其他的汉字显示也都是依据点阵进行存储的。
其实,整个OLED显示屏也是一个点阵,显示过程就是将显示屏中点阵的每个小点进行改变,从而实现显示。
本次实验不难,代码资料都是在已有的基础上进行添加修改的,但了解代码本身的含义更为重要,这样才能更加清楚的明白OLED屏显和汉字点阵编码的原理。
1.https://blog.csdn.net/qq_43279579/article/details/111414037
2.完整工程代码
提取码:1234