1. 项目概述与环境搭建
做嵌入式显示项目,第一步往往不是写代码,而是把「路」铺好。SPI 接口的 LCD 驱动,说白了就是让单片机通过几根线,把像素数据送到屏幕上。我刚开始接触这类项目时,总觉得 SPI 很简单——不就是 MOSI、MISO、SCLK 嘛?结果第一次点亮屏幕,花了我整整两天。问题出在哪?后面我会讲到。
这一章,我们先搞清楚三件事:SPI 协议到底怎么工作的?LCD 驱动芯片的规格书怎么看?开发板和屏幕怎么接线?
1.1 SPI 协议速览
SPI(Serial Peripheral Interface)是一种同步串行通信协议。它用四根线搞定全双工通信:
| 信号线 | 全称 | 作用 |
|---|---|---|
| SCLK | Serial Clock | 时钟信号,由主机产生 |
| MOSI | Master Out Slave In | 主机输出,从机接收 |
| MISO | Master In Slave Out | 从机输出,主机接收 |
| CS | Chip Select | 片选信号,低电平有效 |
对于 LCD 驱动来说,我们主要用 MOSI 和 SCLK 两条线发送数据。MISO 一般用不到——屏幕不需要往单片机回传数据。嗯,这里要注意:有些 LCD 模块把 MISO 引脚省掉了,只留 5 个脚(VCC、GND、SCLK、MOSI、CS),再加一个 DC(数据/命令选择脚)。
SPI 有四种模式,由时钟极性(CPOL)和时钟相位(CPHA)组合决定。ST7735 驱动芯片通常工作在模式 0(CPOL=0,CPHA=0)或模式 3(CPOL=1,CPHA=1)。
| 模式 | CPOL | CPHA | 特点 |
|---|---|---|---|
| 模式 0 | 0 | 0 | 空闲时时钟低电平,第一个边沿采样 |
| 模式 1 | 0 | 1 | 空闲时时钟低电平,第二个边沿采样 |
| 模式 2 | 1 | 0 | 空闲时时钟高电平,第一个边沿采样 |
| 模式 3 | 1 | 1 | 空闲时时钟高电平,第二个边沿采样 |
为什么会有两种常用模式?我查过不少厂家的规格书,发现 ST7735 内部对 SPI 时序的要求其实比较宽松。模式 0 和模式 3 都能正常工作,但前提是时钟频率别太高。我曾经试过把 SPI 时钟拉到 40 MHz,结果屏幕出现花屏——降回 20 MHz 就没事了。
1.2 ST7735 规格书解读
拿到一份规格书,别从头读到尾。我一般先看这几个关键部分:
- 引脚定义:搞清楚每个脚的功能,尤其是电源脚(VCC、GND)、复位脚(RESET)、背光控制脚(LEDA)。
- 初始化序列:规格书里会给出上电后需要发送的命令列表。这是屏幕能正常显示的前提。
- 显存映射:ST7735 内部有 132×162 像素的显存,但实际显示区域通常是 128×160。多出来的像素怎么处理?规格书里会说明。
- 命令集:比如 CASET(列地址设置)、RASET(行地址设置)、RAMWR(写显存)。
0x11— 退出睡眠模式0x2A— 列地址设置(CASET)0x2B— 行地址设置(RASET)0x2C— 写显存(RAMWR)0x36— 显示方向控制(MADCTL)
举个例子,MADCTL 命令(0x36)控制屏幕的旋转方向。它的参数是一个字节,每一位都有含义:
| 位 | 含义 | 说明 |
|---|---|---|
| D7 | MY | 行地址翻转 |
| D6 | MX | 列地址翻转 |
| D5 | MV | 行列交换 |
| D4 | ML | 垂直刷新方向 |
| D3 | BGR | RGB/BGR 顺序 |
设置 0x36 = 0xA0 就能把屏幕翻转 180 度。我有个项目里,屏幕是倒着装在外壳里的,全靠这个命令把画面正过来。
1.3 开发板选型与接线
选开发板,我主要看三点:SPI 硬件支持、GPIO 数量、调试便利性。常用的方案有:
- STM32F103C8T6(蓝色药丸):便宜、资料多、SPI1 和 SPI2 都支持 DMA。我最早的项目就是用这块板子做的。
- ESP32:自带 Wi-Fi 和蓝牙,适合做无线显示终端。但它的 SPI 时钟最高只能到 80 MHz,实际用 40 MHz 比较稳。
- Raspberry Pi Pico:RP2040 芯片,PIO 可以模拟任意 SPI 时序,灵活性很高。
接线其实很简单。以 STM32F103 和 1.8 寸 ST7735 屏幕为例:
| 屏幕引脚 | STM32 引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 供电,注意不要接 5V |
| GND | GND | 共地 |
| SCLK | PA5 (SPI1_SCK) | 时钟线 |
| MOSI | PA7 (SPI1_MOSI) | 数据线 |
| CS | PA4 | 片选,低电平有效 |
| DC | PA3 | 数据/命令选择 |
| RST | PA2 | 复位,低电平复位 |
| LEDA | 3.3V 或 GPIO | 背光控制,接高电平常亮 |
接线完成后,用万用表量一下各引脚电压,确保没有短路。我习惯先不插屏幕,单独测开发板的 SPI 引脚波形——用逻辑分析仪看一眼,确认时钟和数据线都有信号,再插屏幕。
1.4 知识结构总览
下面这张图把本章的核心知识点串起来了。你可以把它当作一个「导航图」,后面写代码时随时回来对照。
这张图里,SPI 协议是顶层入口。往下分三条线:硬件接线、规格书解读、开发板选型。每条线再展开到具体知识点。你写代码时如果卡住了,回来看看这张图,就知道问题出在哪个分支上。
1.5 环境准备清单
动手之前,先把工具备齐。我列个清单,你照着准备就行:
- 硬件:开发板(STM32F103 或 ESP32)、1.8 寸 ST7735 屏幕、杜邦线若干、面包板、USB 数据线
- 软件:Keil MDK 或 Arduino IDE、串口调试助手、逻辑分析仪(可选但强烈推荐)
- 文档:ST7735 数据手册(Datasheet)、开发板原理图