一、SPI接口简介
SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信总线,广泛应用于嵌入式系统中连接外设与微控制器。以下从核心特性、硬件结构、通信模式等方面进行详细介绍:
一)、核心特性
- 同步串行传输:通过SCK时钟信号同步数据传输,支持全双工通信(同时收发数据)。
- 主从架构:仅支持单主设备控制多个从设备,主设备生成时钟信号(SCK)和片选信号(CS)。
- 高速灵活:传输速率可达数十Mbps,数据长度可自定义,且通过配置时钟极性(CPOL)和相位(CPHA)支持4种传输模式。
二)、硬件接口
SPI仅需4根信号线:
- SCK:时钟信号,由主设备生成。
- MOSI:主设备输出/从设备输入。
- MISO:主设备输入/从设备输出。
- CS:片选信号,低电平有效,用于选择目标从设备。
三)、通信流程
- 初始化:主设备拉低目标从设备的CS信号激活通信。
- 数据传输:SCK的每个上升沿/下降沿触发数据采样(取决于CPOL/CPHA配置)。
- 终止:主设备拉高CS信号结束通信。
四)、优缺点
五)、CH592SPI简介
- 优势:硬件简单、传输速率高、支持多设备(需独立CS引脚)。
- 局限:传输距离短(通常<10米)、无内置错误检测机制

CH582、CH584的SPI接口与CH592差不多,大家可以参考官方提供的规格书及例程。
二、SSD1306驱动OLED屏接口说明
我们以中景园电子的7Pin0.96OLED屏为例。

SSD1306为驱动的OLED屏可以支持多种接口,比如4-wire SPI、3-wire SPI、IIC等,本实例使用的7PinOLED,是4-wire SPI接口,3-wire SPI接口与4-wire SPI接口相比,少了D/C#引脚,所以在发送的数据中也会有所差异,如下图所示:

具体的区别大家可以参考对应产品的规格书,而且一般情况下,厂家都会提供Demo程序,参考Demo程序修改一下,应该就能正常使用。
三、硬件连接
| OLED显示屏 | CH582/CH592/CH584 |
| D0 | PA13 (CLK) |
| D1 | PA14 (MOSI) |
| RES | PA4 |
| DC | PA5 |
| CS | PA7 |
四、代码及简要说明
我们的代码支持硬件SPI协议及软件模拟SPI协议两种方式,大家只需要简单修改下图代码就可以切换两种方式。

#ifndef __OLED_H
#define __OLED_H
#include "HAL.h"
#define PAGE_SIZE 8
#define XLevelL 0x02
#define XLevelH 0x10
#define YLevel 0xB0
#define Brightness 0xFF
#define WIDTH 128
#define HEIGHT 64
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
enum{
OLED_CMD = 0,
OLED_DATA
};
#ifndef OLED_USE_SPI
//#define OLED_USE_SPI
#endif
#define delay_ms(x) DelayMs(x)
#if 1
#define OLED_CS BV(12) //7 Pin OLED屏CS
#define OLED_DC BV(5) //7 Pin OLED屏DC
#define OLED_RST BV(4) //7 Pin OLED屏RST
#define OLED_MOSI BV(14) //7 Pin OLED屏D1/MOSI
#define OLED_CLK BV(13) //7 Pin OLED屏D0/CLK
#define OLED_CS_OUT (R32_PA_OUT) //7 Pin OLED屏CS
#define OLED_DC_OUT (R32_PA_OUT) //7 Pin OLED屏DC
#define OLED_RST_OUT (R32_PA_OUT) //7 Pin OLED屏RST
#define OLED_MOSI_OUT (R32_PA_OUT) //7 Pin OLED屏D1/MOSI
#define OLED_CLK_OUT (R32_PA_OUT) //7 Pin OLED屏D0/CLK
#define OLED_OUT (R32_PA_OUT)
#define OLED_PD_DRV (R32_PA_PD_DRV)
#define OLED_CS_DIR (R32_PA_DIR |= OLED_CS) //7 Pin OLED屏CS
#define OLED_DC_DIR (R32_PA_DIR |= OLED_DC) //7 Pin OLED屏DC
#define OLED_RST_DIR (R32_PA_DIR |= OLED_RST) //7 Pin OLED屏RST
#define OLED_MOSI_DIR (R32_PA_DIR |= OLED_MOSI) //7 Pin OLED屏D1/MOSI
#define OLED_CLK_DIR (R32_PA_DIR |= OLED_CLK) //7 Pin OLED屏D0/CLK
#if 1
#define OLED_CS_Clr() (OLED_CS_OUT &= (~OLED_CS))
#define OLED_CS_Set() (OLED_CS_OUT |= OLED_CS)
#define OLED_DC_Clr() (OLED_DC_OUT &= (~OLED_DC))
#define

最低0.47元/天 解锁文章
966

被折叠的 条评论
为什么被折叠?



