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(数据/命令选择脚)。

个人习惯:我一般把 DC 脚也当作 SPI 控制的一部分。它不参与 SPI 数据线,但决定了当前发送的是命令还是数据。很多新手忘了初始化 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 背光控制,接高电平常亮
我曾经踩过的坑:屏幕的 VCC 和 LEDA 是两个不同的电源脚。VCC 给芯片供电,LEDA 给背光供电。有些模块把 LEDA 和 VCC 连在一起了,但大部分是分开的。如果你发现屏幕有显示但背光不亮,先查 LEDA 有没有接对。

接线完成后,用万用表量一下各引脚电压,确保没有短路。我习惯先不插屏幕,单独测开发板的 SPI 引脚波形——用逻辑分析仪看一眼,确认时钟和数据线都有信号,再插屏幕。

1.4 知识结构总览

下面这张图把本章的核心知识点串起来了。你可以把它当作一个「导航图」,后面写代码时随时回来对照。

SPI LCD 驱动项目知识结构 SPI 协议 硬件接线 规格书解读 开发板选型 VCC/GND SCLK/MOSI 初始化序列 命令集 STM32/ESP32 CS/DC/RST 背光控制 MADCTL 方向 CASET/RASET SPI 模式选择 💡 本章核心:从 SPI 协议出发,串联硬件接线、规格书解读和开发板选型 后续所有代码和调试都建立在这个知识结构之上

这张图里,SPI 协议是顶层入口。往下分三条线:硬件接线、规格书解读、开发板选型。每条线再展开到具体知识点。你写代码时如果卡住了,回来看看这张图,就知道问题出在哪个分支上。

1.5 环境准备清单

动手之前,先把工具备齐。我列个清单,你照着准备就行:

  • 硬件:开发板(STM32F103 或 ESP32)、1.8 寸 ST7735 屏幕、杜邦线若干、面包板、USB 数据线
  • 软件:Keil MDK 或 Arduino IDE、串口调试助手、逻辑分析仪(可选但强烈推荐)
  • 文档:ST7735 数据手册(Datasheet)、开发板原理图
我的建议:第一次做,别急着焊板子。用杜邦线在面包板上搭电路,调试方便。等所有功能都跑通了,再画 PCB 也不迟。