4. SPI协议基础:SPI四线(SCLK、MOSI、MISO、CS)与三线模式、时钟极性(CPOL)与相位(CPHA)配置

SPI(Serial Peripheral Interface)是一种全双工、同步、主从式串行通信总线,由 Motorola 公司推出。在嵌入式系统中,SPI 因其高速、简单、硬件开销低的特点,被广泛用于 MCU 与 LCD 屏、传感器、ADC/DAC、存储器等外设之间的数据交换。理解 SPI 的线缆定义、工作模式以及时钟配置,是驱动 LCD 屏的基础。

4.1 SPI 四线标准模式

标准 SPI 总线使用 4 根信号线完成主从设备之间的通信,其连接拓扑如下图所示:

SPI 四线标准模式主从连接拓扑 主设备 (MCU Master) SCLK 输出 MOSI 输出 MISO 输入 CS 输出 从设备 (LCD Slave) SCLK 输入 MOSI 输入 MISO 输出 CS 输入 SCLK MOSI MISO CS

四根信号线的功能定义如下:

信号线 全称 方向(主→从) 功能描述
SCLK Serial Clock 主→从 由主设备产生的同步时钟,决定数据传输速率
MOSI Master Out Slave In 主→从 主设备发送数据给从设备
MISO Master In Slave Out 从→主 从设备发送数据给主设备
CS Chip Select 主→从 片选信号,低电平有效,选中对应从设备
调试要点: 在驱动 LCD 屏时,多数 LCD 控制器仅需 SCLK、MOSI、CS 三根线即可完成写操作(MISO 可悬空)。但若需要读取 LCD 寄存器状态(如读 ID、读错误标志),则必须连接 MISO 线。

4.2 SPI 三线模式

三线模式并非指去掉 MISO 或 MOSI 中的一根,而是指在资源受限的场景下,将 MOSI 和 MISO 合并为一条双向数据线(SDA/SIO),配合 SCLK 和 CS 构成三线制。常见于低成本传感器或部分 LCD 驱动 IC。

模式 信号线 数据方向 典型应用
标准四线 SCLK + MOSI + MISO + CS 全双工 高速 LCD、SD 卡、Flash
三线半双工 SCLK + SDA(双向)+ CS 半双工 低引脚数 LCD、温湿度传感器
三线只写 SCLK + MOSI + CS(MISO 悬空) 单向写 仅需写命令/数据的 LCD 屏
常见误区: 部分工程师将“三线 SPI”误解为“去掉 CS 只用三根线”,这是错误的。CS 是 SPI 总线仲裁的关键信号,没有 CS 就无法区分总线上的多个从设备。真正的三线模式是指数据线合并为一条双向线,而非省略 CS。

4.3 时钟极性(CPOL)与相位(CPHA)

SPI 协议通过 CPOL 和 CPHA 两个参数定义时钟空闲电平以及数据采样/切换的边沿,组合出 4 种工作模式(Mode 0 ~ Mode 3)。

  • CPOL(Clock Polarity):定义 SCLK 空闲时的电平。
    • CPOL = 0:空闲时 SCLK 为低电平
    • CPOL = 1:空闲时 SCLK 为高电平
  • CPHA(Clock Phase):定义数据采样和切换的边沿。
    • CPHA = 0:在 SCLK 的第一个边沿采样数据(上升沿或下降沿取决于 CPOL)
    • CPHA = 1:在 SCLK 的第二个边沿采样数据

四种模式的详细时序特征如下表:

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据切换边沿
Mode 0 0 0 低电平 上升沿 下降沿
Mode 1 0 1 低电平 下降沿 上升沿
Mode 2 1 0 高电平 下降沿 上升沿
Mode 3 1 1 高电平 上升沿 下降沿

下图以 Mode 0(CPOL=0, CPHA=0)和 Mode 3(CPOL=1, CPHA=1)为例,展示 SCLK 与 MOSI/MISO 的时序关系:

SPI 时钟模式时序对比(Mode 0 vs Mode 3) Mode 0 (CPOL=0, CPHA=0) SCLK ↑采样 ↑采样 ↑采样 MOSI D7 D6 D5 D4 Mode 3 (CPOL=1, CPHA=1) SCLK ↑采样 ↑采样 ↑采样 MOSI D7 D6 D5 D4 关键区别:Mode 0 空闲时钟为低,在上升沿采样;Mode 3 空闲时钟为高,在上升沿采样。 两种模式采样边沿相同(上升沿),但空闲电平相反,需根据 LCD 数据手册选择。

4.4 模式配置与 LCD 驱动匹配

在驱动 LCD 屏时,必须查阅 LCD 控制器数据手册中的 SPI 时序图,确认其要求的 CPOL 和 CPHA 组合。绝大多数 LCD 驱动 IC 默认支持 Mode 0 或 Mode 3,因为这两种模式都在上升沿采样数据,便于 MCU 的 SPI 外设在时钟上升沿锁存数据。

配置示例(STM32 HAL 库):
// SPI 句柄配置结构体
SPI_HandleTypeDef hspi1;
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;      // 全双工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;        // CPOL = 0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;            // CPHA = 0
hspi1.Init.NSS = SPI_NSS_SOFT;                    // 软件控制 CS
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi1);
调试避坑: 如果 LCD 显示花屏、数据错位或完全不响应,首先检查 SPI 模式是否匹配。使用逻辑分析仪抓取 SCLK 和 MOSI 波形,对比数据手册中的时序图,确认采样边沿和数据建立/保持时间是否满足要求。常见错误是 MCU 配置为 Mode 0 而 LCD 要求 Mode 3,导致数据在错误的边沿被采样。

4.5 多从设备 SPI 总线扩展

当系统中存在多个 SPI 从设备(如 LCD + 触摸屏 + Flash)时,可通过独立的 CS 线实现分时复用 SCLK、MOSI、MISO 总线。每个从设备独占一根 CS 线,主设备在通信前将目标设备的 CS 拉低,其余从设备的 CS 保持高电平,使其数据输出引脚处于高阻态。

从设备 CS 引脚(MCU GPIO) SPI 模式 最大速率
LCD 屏 PB12 Mode 0 20 MHz
触摸屏 PB13 Mode 3 10 MHz
Flash 存储器 PB14 Mode 0 50 MHz
工程建议: 多从设备共享 SPI 总线时,每次切换从设备前,务必先将当前 CS 拉高(释放总线),再拉低目标 CS。如果 CS 释放不彻底,可能导致总线冲突或数据残留。建议在每次 SPI 传输前后加入微秒级延时,确保从设备状态稳定。