基于SPI通信方式的OLED显示

基于SPI通信方式的OLED显示

1、SPI简介

SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设 备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间, 要求通讯速率较高的场合。

SPI 通讯设备之间的常用连接方式

在这里插入图片描述

SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为 S S ,它们的作用介绍如下

在这里插入图片描述

SPI 基本通讯过程

在这里插入图片描述

这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信 号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低 电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据

CPOL/CPHA 及通讯模式

SPI 一共有四种通讯模 式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻

“时钟极性 CPOL”和“时钟相位 CPHA”

时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通 讯开始前、 NSS 线为高电平时 SCK 的状态)。CPOL=0 时, SCK 在空闲状态时为低电平, CPOL=1 时,则相反。

时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的 信号将会在 SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数 边沿”采样。

在这里插入图片描述

当 CPHA=0 的时序图。首先,根据 SCK 在空闲状态时的电平,分为两种 情况。SCK 信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。 无论 CPOL=0 还是=1,因为我们配置的时钟相位 CPHA=0,在图中可以看到,采样时 刻都是在 SCK 的奇数边沿。注意当 CPOL=0 的时候,时钟的奇数边沿是上升沿,而 CPOL=1 的时候,时钟的奇数边沿是下降沿。所以 SPI 的采样时刻不是由上升/下降沿决定 的。MOSI 和 MISO 数据线的有效信号在 SCK 的奇数边沿保持不变,数据信号将在 SCK 奇 数边沿时被采样,在非采样时刻,MOSI 和 MISO 的有效信号才发生切换。

当 CPHA=1 时,不受 CPOL 的影响,数据信号在 SCK 的偶数边沿被采样

在这里插入图片描述

由 CPOL 及 CPHA 的不同状态,SPI 分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。

在这里插入图片描述

2、OLED屏幕介绍

OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。

OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。

常用的OLED屏幕有蓝色、黄色、白色等几种。屏的大小为0.96寸,像素点为
128*64,所以我们称为0.96oled屏或者12864屏。

OLED模块显存
OLED本身是没有显存的,它的显存是依赖于SSD1306提供的

SSD1306的显存总共为12864bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是12864的点阵大小。

在这里插入图片描述

SSD1306芯片
SSD13

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,你需要准备好以下材料: - STM32F1开发板 - OLED屏幕模块 - TDC测距模块 - 杜邦线若干 接下来,按照以下步骤进行操作: 1. 确认你的OLED屏幕模块支持SPI通讯方式,如果不支持,需要更换为支持SPI通讯方式的OLED屏幕模块。 2. 连接OLED屏幕模块和STM32F1开发板。具体连接方式可以参考OLED屏幕模块和STM32F1开发板的引脚连接图,使用杜邦线连接。 3. 连接TDC测距模块和STM32F1开发板。具体连接方式可以参考TDC测距模块和STM32F1开发板的引脚连接图,使用杜邦线连接。 4. 配置STM32F1开发板的SPI接口。在STM32F1开发板上,SPI接口有多个,你需要选择其中一个进行配置。具体配置方法可以参考STM32F1的官方文档。 5. 编写代码,读取TDC测距模块的数据,并将数据显示OLED屏幕上。具体代码可以参考以下示例代码: ```c #include "stm32f10x.h" #include "oled.h" #include "tdc.h" int main(void) { // 初始化OLED屏幕模块 OLED_Init(); // 初始化TDC测距模块 TDC_Init(); // 读取TDC测距模块的数据,并显示OLED屏幕上 while(1) { uint16_t distance = TDC_ReadDistance(); OLED_ShowNum(0, 0, distance, 4); } } ``` 在上面的示例代码中,我们使用了OLED和TDC两个模块的初始化函数,然后在一个死循环中不断读取TDC测距模块的数据,并将数据显示OLED屏幕上。 最后,编译并下载代码到STM32F1开发板,即可看到TDC测距数据在OLED屏幕上的显示

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值