目录

一、SPI协议

1、SPI 协议简介

2、SPI 物理层

2、协议层

2.1、 SPI 基本通讯过程

3、STM32 的 SPI 外设简介

通讯引脚

时钟控制逻辑

数据控制逻辑

整体控制逻辑

二、使用OLED显示屏显示数据

实验工具和材料

运行厂家给出的Demo程序

1、显示自己的名字和学号

1.1获取汉字字模

1.2代码实现

结果显示

2、 OLED 显示温湿度

2.1添加汉字字模

2.2代码实现

3、OLED 滑动显示汉字

1、添加字模

2.代码实现

结果显示

三、总结

四、参考资料


一、SPI协议

1、SPI 协议简介

SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率 较高的场合。 学习本章时,可与 I2C 章节对比阅读,体会两种通讯总线的差异以及 EEPROM 存储器与 FLASH 存储器的区别。下面我们分别对 SPI 协议的物理层及协议层进行讲解。

2、SPI 物理层

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

SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为 SS

(1) SS*(* Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。

(2)SCK (Serial Clock):时钟信号线,用于通讯数据同步。

(3) MOSI (Master Output,Slave Input):主设备输出/从设备输入引脚。

(3) MOSI (Master Output,Slave Input):主设备输出/从设备输入引脚。

2、协议层

与 I2C 的类似,SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

2.1、 SPI 基本通讯过程

SPI 通讯的通讯时序,如下图所示

3、STM32 的 SPI 外设简介

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F103 型 号的芯片默认 f:sub:pclk1 为 72MHz,fpclk2 为 36MHz),完全支持 SPI 协议的 4 种模式,数据帧长 度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行。它还支持双线全双工 (前面小节说 明的都是这种模式)、双线单向以及单线模式。其中双线单向模式可以同时使用 MOSI 及 MISO 数 据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这 样速率会受到影响。我们只讲解双线全双工模式。

通讯引脚

SPI 的所有硬件架构都从图 24‑5 中左侧 MOSI、MISO、SCK 及 NSS 线展开的。STM32 芯片有多 个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引 脚,见表 24‑2。关于 GPIO 引脚的复用功能,可查阅《STM32F4xx 规格书》,以它为准。

时钟控制逻辑

SCK 线的时钟信号,由波特率发生器根据“控制寄存器 CR1”中的 BR[0:2] 位控制,该位是对 fpclk 时钟的分频因子,对 fpclk 的分频结果就是 SCK 引脚的输出时钟频率,

数据控制逻辑

SPI 的 MOSI 及 MISO 都连接到数据移位寄存器上,数据移位寄存器的数据来源及目标接收、发 送缓冲区以及 MISO、MOSI 线。当向外发送数据的时候,数据移位寄存器以“发送缓冲区”为 数据源,把数据一位一位地通过数据线发送出去;当从外部接收数据的时候,数据移位寄存器把 数据线采样到的数据一位一位地存储到“接收缓冲区”中。通过写 SPI 的“数据寄存器 DR”把 数据填充到发送 F 缓冲区中,通讯读“数据寄存器 DR”,可以获取接收缓冲区中的内容。其中数 据帧长度可以通过“控制寄存器 CR1”的“DFF 位”配置成 8 位及 16 位模式;配置“LSBFIRST 位”可选择 MSB 先行还是 LSB 先行。

整体控制逻辑

整体控制逻辑负责协调整个 SPI 外设,控制逻辑的工作模式根据我们配置的“控制寄存器 (CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的 SPI 模式、波特率、LSB 先行、主 从模式、单双向模式等等。在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器 (SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。除此之外,控 制逻辑还根据要求,负责控制产生 SPI 中断信号、DMA 请求及控制 NSS 信号线。 实际应用中,我们一般不使用 STM32 SPI 外设的标准 NSS 信号线,而是更简单地使用普通的 GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。

二、使用OLED显示屏显示数据

实验工具和材料

软件:keil
硬件:PC机,STM32开发板,0.96寸OLED显示屏,AHT20 芯片,下载器

运行厂家给出的Demo程序

程序下载链接:

http://www.lcdwiki.com/res/Program/OLED/0.96inch/SPI_SSD1306_MSP096X_V1.0/0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0.zip

选择与自己平台相同的实例文件。

然后对其中部分代码进行修改,来完成以下任务。

1、显示自己的名字和学号

1.1获取汉字字模

因为OLED 上可以直接显示数字和英文,我们想要在 OLED 上显示汉字,需要对其进行编码成阵获取汉字字模。

取模得软件需要自行下载。

打开软件后我们输入想要的汉字生成字模。注意(将选项中的自定义格式改为c51格式)

因为OLED是竖屏显示所以需要将输入的文字进行左旋90度、垂直翻转。

1.2代码实现

用keil打开厂家的代码进行修改,打开代码后打开user下的gui.c再打开gui.c下面的oledfont.h文件,

将 cfont16[] 数组内的内容修改成自己的中文文字点阵。

接下来再去修改显示函数,将 test.c 里 void TEST_MainPage(void) 函数中的不跟删掉,添加自己的执行语句。

修改之后我们再修改main.c函数,将main.c中的 while函数里除l了 TEST_MainPage()以外的语句全部删掉。

修改完成后,将生成的hex文件烧录进芯片,连接OLED芯片进行显示。

OLED与stm32连接

OLED               stm32

VCC                   3.3V

GND                   GND

D0                       PB13

D1                      PB15

DC                      PB10

CS                       PB11

RES                    PB12

结果显示

2、 OLED 显示温湿度

2.1添加汉字字模

首先还是进行字模获取,之后在代码中修改,具体的流程参考上一步。

2.2代码实现

我们需要先添加4个文件,bsp_i2c.hbsp_i2c.c
sys.h(更改名称为 AHT20_sys.h,不然会重名);
sys.c(更改名称为 AHT20_sys.c,不然会重名);

然后再修改bsp_i2c.c文件如下

void Show_OLED(void)
{/*------------*/GUI_ShowCHinese(28,10,16,"当前温湿度",1);GUI_ShowCHinese(20,32,16,"温度:",1);GUI_ShowString(60,32,strTemp1,16,1);GUI_ShowString(68,32,strTemp2,16,1);GUI_ShowString(76,32,".",16,1);GUI_ShowString(84,32,strTemp3,16,1);GUI_ShowCHinese(92,32,16,"℃",1);GUI_ShowCHinese(20,48,16,"湿度:",1);GUI_ShowString(60,48,strHumi1,16,1);GUI_ShowString(68,48,strHumi2,16,1);GUI_ShowString(76,48,".",16,1);GUI_ShowString(84,48,strHumi3,16,1);GUI_ShowCHinese(92,48,16,"%",1);
}

再修改main.c函数如下

#include "bsp_i2c.h"  //注意添加头文件
int main(void)
{   delay_init();                  //延时函数初始化      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级OLED_Init();                    //初始化OLEDIIC_Init();                //初始化IICOLED_Clear(0);             //清屏(全黑)while(1) {read_AHT20_once();         //读取温度并显示OLED_Clear(0);             //清屏(全黑)       delay_ms(1500);}

将整个程序进行编译生成hex文件,将其烧录进芯片进行显示。

最终结果显示

3、OLED 滑动显示汉字

1、添加字模

获取我们想要的汉字,获取字模,同第一步一样将其换进代码中,这里就不再多加赘述。

2.代码实现

test.c 里 void TEST_MainPage(void) 函数修改如下

void TEST_MainPage(void)
{   GUI_ShowCHinese(10,16,16,"天灰灰会不会让我忘了你是谁",1);//GUI_ShowCHinese(40,16,16,"王石石石",1);//GUI_ShowString(16,32,"631907030523",16,1);delay_ms(1500);        delay_ms(1500);
}

再修改mian.c函数如下

#include "bsp_i2c.h"  //注意添加头文件
int main(void)
{   delay_init();                  //延时函数初始化      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级OLED_Init();                    //初始化OLEDIIC_Init();                //初始化IICOLED_Clear(0);             //清屏(全黑)while(1) {read_AHT20_once();         //读取温度并显示OLED_Clear(0);             //清屏(全黑)       delay_ms(1500);}

然后将整个程序进行编译,再将程序烧录进芯片进行显示

结果显示

三、总结

在本次实验当中,我了解学习了SPI协议,具体的显示实现需要对厂家提供的代码进行修改,在当中参考了不少大佬的文章进行完成,本人也是初学者对于SPI协议并不精通,请各位大佬多多指正。

四、参考资料

https://blog.csdn.net/qq_45237293/article/details/111712565

https://blog.csdn.net/qq_43279579/article/details/111414037

https://blog.csdn.net/m0_58892312/article/details/121410862?spm=1001.2014.3001.5501

https://doc.embedfire.com/mcu/stm32/f407batianhu/hal/pdf/[%E9%87%8E%E7%81%ABEmbedFire]%E3%80%8ASTM32%20HAL%E5%BA%93%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E2%80%94%E2%80%94%E5%9F%BA%E4%BA%8E%E9%87%8E%E7%81%AB%E9%9C%B8%E5%A4%A9%E8%99%8E%E5%BC%80%E5%8F%91%E6%9D%BF%E3%80%8B.pdf

基于STM32的0.96寸OLED显示屏显示数据相关推荐

  1. 基于STM32的0.96寸OLED显示屏显示数据和滚动显示

    文章目录 一.SPI 二.OLED显示屏显示数据 2.1 代码实现 2.2 结果展示 三.0.96寸OLED滚动显示数据 3.1 滚动方式 3.2 对显示文字进行取模 3.3 代码实现 3.4 结果展 ...

  2. 基于STM32F103C8T6的0.96寸OLED显示屏显示数据

    一.了解SPI(串行外设接口) SPI全称是Serial Perripheral Interface,也就是串行外围设备接口.SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工 ...

  3. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

  4. 基于STM32的0.96寸OLED显示屏显示汉字+数字

    文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...

  5. STM32的0.96寸OLED显示屏显示数据

    目录 一.SPI 1.简介 2.工作模式 3.通讯引脚 二.用0.96OLED显示数据 1.OLED原理简介 三.OLED显示实验 (1).实验目的 (2).实验实现 1.显示学号和姓名 2.显示AH ...

  6. 关于基于stm32的0.96寸oled显示屏的学习理解心得。

    关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...

  7. 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示

    文章目录 **一.SPI(串行外设接口)** **二.使用0.96寸OLED显示屏显示学号姓名** **三.0.96寸OLED在STM32f103上实现滚动显示长字符** **四.参考资料** 一.S ...

  8. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  9. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)

    概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...

  10. 【STM32】0.96寸OLED显示屏(7针SPI协议)软件模拟SPI

    Author:AXYZdong 自动化专业 工科男 有一点思考,有一点想法,有一点理性 [自制展示]2020鼠年大吉 文章目录 概述 3.1硬件设计 3.2软件设计 3.2.1编程要点 3.2.2代码 ...

最新文章

  1. 人人都写过的5个Bug!
  2. sql server datetime格式_为什么你SQL Server中SQL日期转换出错了呢?
  3. mysql高效索引之覆盖索引
  4. 逆天的IE7中,诡异的横向滚动条
  5. LeetCode 1533. Find the Index of the Large Integer(二分查找)
  6. mysql触发器调用存储过程出错_mysql 触发器中调用存储过程
  7. 根据已有的WSDL文件进行WebService服务开发和部署
  8. Mac OS X 系统修改Terminal终端配色
  9. wap1.x和wap2.0的区别
  10. 基于扩张卷积神经网络的图像超分辨率
  11. PCB表面贴片元件的手工焊接技巧
  12. poi导出使用HSSFWorkbook行数超出
  13. Python编程案例:中文金额转换并计算
  14. 蒟蒻的第一篇博客(洛谷P1113)
  15. 管理学研究中应用计算机仿真,计算机仿真在企业流程再造中应用研究.doc
  16. 通过同花顺股票程序化交易接口的止损方法有哪些?
  17. 2019 acm-icpc 西安全国邀请赛 J
  18. GB/T 31402塑料--塑料表面抗菌性能试验方法
  19. 反射知识点总结《Lipp学习笔记》
  20. 深度学习之LSTM案例分析(二)

热门文章

  1. 卸载计算机更新程序包,KB4343669更新包无法卸载的解决方案
  2. 彼时彼刻恰似此时此刻
  3. 阿里云云安全理工程师认证 部分题目 ACA
  4. Python 之 类 (Tom猫)
  5. adb工具的安装方法
  6. QQ浏览器网页版微信抓包和IPAD微信抓包 Wireshark
  7. matlab入门教程ppt,[2018年最新整理]matlab入门PPT教程.ppt
  8. Elasticsearch 最佳运维实践总结
  9. 进击的蚂蚁金融云与场景焦虑的银行
  10. mysql5.7卸载服务_Mysql5.7.28安装配置、卸载—CentOS7.6生产环境下的微服务部署(四)...