嵌入式学习——使用SPI 方式实现OLED屏显

目录

1.SPI协议简介

     SPI物理层

     SPI协议层

2.STM32的SPI架构剖析

     通讯引脚

     时钟控制逻辑

     数据控制逻辑

     整体控制逻辑

3.通讯过程

4.编程实例

     题目要求

     操作步骤

5.运行效果

6.总结

1. SPI协议简介

SPI是窜行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议。

SPI物理层

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

NSS:当有多个 SPI从设备与 SPI主机相连时,设备的其它信号线 SCK、MOSI及MISO同时并联到相同的 SPI总线上,即无论有多少个从设备,都共同只使用这 3条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以 NSS 线置低电平为开始信号,以 NSS线被拉高作为结束信号。

SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为f pclk /2,两个设备之间通讯时,通讯速率受限于低速设备。

MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到机,即在这条线上数据的方向为从机到主机

 

SPI协议层

先说串口:

因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。

如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;

双方还必须事先就传输速率达成共识(设置相同的波特率,例如每秒9600位)。

传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示:

如果您注意到上图中的11001010不等于0x53,这是一个细节。串口协议通常会首先发送最低有效位,因此最小位在最左边LSB。低四位字节实际上是0011 = 0x3,高四位字节是0101 = 0x5

异步串行工作得很好,但是在每个字节发送的时候都需要额外的和起始位和停止位以及在发送和接收数据所需的复杂硬件方面都有很多开销。

不难发现,如果接收端和发送端设置的速度都不一致,那么接收到的数据将是垃圾(乱码)

再说SPI通信协议:

注意,SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;

 

2. STM32 的 SPI 架构剖析

通讯引脚

SPI 的所有硬件架构都从图 中左侧 MOSI、MISO、SCK 及 NSS 线展开的。STM32芯片有多个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚上。

其中 SPI1 是 APB2 上的设备,最高通信速率达 36Mbtis/s,SPI2、SPI3 是 APB1 上的设备,最高通信速率为 18Mbits/s。除了通讯速率,在其它功能上没有差异。 

时钟控制逻辑

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

数据控制逻辑

SPI 的 MOSI 及 MISO 都连接到数据移位寄存器上,数据移位寄存器的数据来源及目标接收、发送缓冲区以及 MISO、MOSI 线。

当向外发送数据的时候,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去;当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到“接收缓冲区”中。

整体控制逻辑

整体控制逻辑负责协调整个 SPI 外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的 SPI 模式、波特率、LSB先行、主从模式、单双向模式等等。

在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生 SPI 中断信号、DMA 请求及控制NSS 信号线。

3. 通讯过程

如下图:

主模式收发流程及事件说明如下:

  1. 控制 NSS 信号线,产生起始信号(图中没有画出);

  2. 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;

  3. 通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中;

  4. 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空;

4. 编程实例

题目要求

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能

  1. 显示自己的学号和姓名;
  2. 显示AHT20的温度和湿度;
  3. 上下或左右的滑动显示长字符,比如一段歌词或诗词(最好使用硬件刷屏模式)

操作步骤及代码

 

 

 

5. 运行效果

 

6. 总结

本次实验有一定难度,特别是最后运行环境,理论和实际总是有很大差别,试了很多次都没有成功,最后也是请教和借鉴了其他同学才勉强完成。但是也有很大收获,通过本次实验加深了我对SPI的理解和应用,相比以前有了很大提升。

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式STM32F103项目实例是通过使用STM32F103C8T6芯片来实现OLED屏幕显示和汉字点阵编码的原理。可以使用STM32F103的SPI或IIC接口来实现显示学号和姓名,显示AHT20的温湿度,并实现滑动显示长字符的功能。\[2\] 在实际操作中,需要在oledfont.h文件中添加文字字模,并在test.c文件中对函数Test_MainPage进行修改,以实现显示梅花香自苦寒来的汉字。\[1\] 在项目实操过程中,可能会遇到一些挑战。例如,姓名与学号的显示可能会比较顺利,滚动字幕的实现也不太难,但显示AHT20的温度和湿度可能会遇到一些问题。这可能是因为电压需要给予5V,并且可能会出现接触不良导致无法采集数据的情况。通过反复调试代码、查阅资料和细心操作,最终可以成功实现功能。\[2\] 嵌入式开发是一个具有挑战性的过程,但当最终成功时,会感到内心的喜悦。这个过程可能会让人热泪盈眶,但也充满了成长的喜悦。\[2\] 在实现嵌入式STM32F103项目实例时,需要学习和理解STM32F103系列芯片的地址映射和寄存器映射原理,以及GPIO端口的初始化设置步骤,包括时钟配置、输入输出模式设置和最大速率设置。可以参考网上的资料来加深理解。\[3\] 希望这个项目实例能够给你带来启发和帮助,祝你在嵌入式开发的道路上取得更多的成就!\[2\] #### 引用[.reference_title] - *1* *2* [【嵌入式系统开发18】理解OLED屏显和汉字点阵编码原理,STM32F103实现OLED屏显实例](https://blog.csdn.net/qq_52199251/article/details/127658793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【嵌入式STM32F103寄存器方式点亮LED流水灯](https://blog.csdn.net/qq_57611233/article/details/120923883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值