2、屏幕硬件接口详解:SPI与并行接口的区别,屏幕引脚功能解析(CS、DC、RST、BL等),如何根据数据手册确定驱动时序。
好,咱们接着聊屏幕驱动。上一章我们把屏幕的基本概念过了一遍,这一章要动真格的了——直接面对屏幕的物理接口和那些密密麻麻的引脚。
说实话,我第一次拿到一块裸屏的数据手册时,看着那一堆引脚名字,心里是有点发怵的。CS、DC、RST、BL……这些缩写到底代表什么?SPI和并行接口又该怎么选?别急,我一个一个给你拆解。
2.1 SPI接口 vs 并行接口:到底选哪个?
这是你选型时第一个要做的决定。说白了,就是你要用几根线去和屏幕通信。
SPI接口(串行外设接口)
SPI接口,我用的最多。它通常只需要4根线:
- SCLK:时钟线,由主设备(MCU)提供
- MOSI:主出从入,数据从MCU流向屏幕
- MISO:主入从出,数据从屏幕流向MCU(很多屏幕不需要这根线)
- CS:片选信号,选中你要通信的设备
SPI的好处很明显:引脚占用少。一个普通的MCU,随便找几个GPIO就能模拟出来。我早期做项目时,经常用STM32的硬件SPI,速度能跑到几十MHz,刷个简单的UI界面完全够用。
但SPI也有短板——速度上限。虽然理论上SPI可以很快,但实际受限于MCU性能和布线质量,刷大尺寸、高分辨率的屏幕时,你会明显感觉到画面刷新跟不上。我在一个项目中用过SPI驱动320x240的屏幕,刷全屏图片时,肉眼可见的撕裂感。嗯,那时候我就知道,该换接口了。
并行接口(8080/6800)
并行接口,顾名思义,一次传多个bit。常见的有8位、9位、16位甚至18位。以8位并行为例,它需要:
- D0-D7:8根数据线
- WR:写使能
- RD:读使能
- DC:数据/命令选择
- CS:片选
并行接口的优点是快。一次传8位,同样时钟频率下,速度是SPI的8倍(不考虑协议开销)。你想想看,刷一个480x272的屏幕,并行接口可以轻松做到60fps以上。
但代价也很明显——占用太多引脚。一个8位并行接口至少需要11个GPIO,16位就需要19个。这对于引脚紧张的MCU来说,简直是噩梦。我见过有人为了省引脚,硬是用74HC595扩展IO来驱动并行屏幕,结果时序乱得一塌糊涂。
我的建议:
- 屏幕分辨率低于320x240,刷新率要求不高 → 选SPI
- 屏幕分辨率高于480x320,需要流畅动画 → 选并行
- MCU引脚少于30个 → 老老实实SPI
2.2 屏幕引脚功能解析:CS、DC、RST、BL……
拿到一块屏幕,你首先得认识它的引脚。我整理了一份最常见的引脚清单,你对照着看:
| 引脚名称 | 全称 | 功能说明 |
|---|---|---|
| CS | Chip Select | 片选信号。低电平有效,选中该屏幕。多个设备共用总线时,靠CS区分。 |
| DC | Data/Command | 数据/命令选择。高电平表示传输的是数据,低电平表示传输的是命令。 |
| RST | Reset | 复位信号。低电平复位屏幕,初始化内部寄存器。 |
| BL | Backlight | 背光控制。通常接PWM引脚,调节屏幕亮度。 |
| SCLK | Serial Clock | SPI时钟线。 |
| MOSI | Master Out Slave In | SPI数据输出(主到从)。 |
| MISO | Master In Slave Out | SPI数据输入(从到主)。很多屏幕没有这根线。 |
| VCC/GND | Power/Ground | 电源和地。注意电压范围,常见的有3.3V和5V。 |
这里我要特别强调一下DC引脚。很多新手会搞混DC和CS的作用。CS是选设备,DC是选模式。你想想看,你给屏幕发一串数据,屏幕怎么知道这是命令还是要显示的内容?就是靠DC引脚的电平来区分的。
小技巧:我习惯把DC引脚接到MCU的一个普通GPIO上,这样在代码里可以灵活控制。有些屏幕支持SPI 9位模式,把DC位嵌入到数据流中,可以省一个引脚,但代码会复杂一些。
2.3 如何根据数据手册确定驱动时序?
这是最核心的部分。数据手册里通常会给出时序图,很多人一看就头大。其实没那么复杂,我来教你怎么看。
以SPI接口为例,数据手册里一般会有这样的时序图:
SCLK: ▔▔▁▁▔▔▁▁▔▔▁▁▔▔▁▁
MOSI: ▔▔▁▁▁▁▔▔▔▔▁▁▁▁▔▔
CS: ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
DC: ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
你需要关注几个关键参数:
- 时钟频率:SCLK的最高频率,比如20MHz。别超频,否则数据会出错。
- 时钟极性(CPOL)和相位(CPHA):决定了数据在时钟的上升沿还是下降沿采样。常见的是模式0(CPOL=0, CPHA=0)和模式3(CPOL=1, CPHA=1)。
- 建立时间(tSU)和保持时间(tHD):数据在时钟沿前后需要保持稳定的时间。通常几纳秒,MCU的GPIO速度足够满足。
- CS有效到第一个时钟沿的时间(tCSS):片选拉低后,需要等一会儿才能开始传数据。
我曾经在一个项目中,因为忽略了tCSS这个参数,导致屏幕初始化总是失败。后来用示波器一抓,发现CS拉低后立即发数据,屏幕根本没准备好。加上一个微秒的延时,问题就解决了。
对于并行接口,时序图会更复杂一些,但核心思路是一样的:
- 先拉低CS选中设备
- 根据DC设置命令/数据模式
- 在WR的上升沿或下降沿锁存数据
- 保持足够的建立和保持时间
警告:千万不要完全相信数据手册里的典型值。实际布线、MCU负载、温度都会影响时序。我建议你在调试时,先用示波器抓一下实际波形,和手册对比。如果发现毛刺或信号畸变,先检查电源和地线。
最后,给你一个实战步骤:
- 拿到数据手册,先找到引脚定义表,确认每个引脚的功能和电平
- 找到时序图,确定通信协议(SPI模式、并行时序)
- 用MCU的GPIO模拟时序,先发一个简单的初始化命令(比如复位)
- 用示波器抓波形,确认时序正确
- 逐步增加功能,直到屏幕正常显示
嗯,这一章的内容就到这里。下一章,我们会实际动手,用代码来驱动一块SPI屏幕。到时候,你会看到这些理论知识是如何落地的。