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 根信号线完成主从设备之间的通信,其连接拓扑如下图所示:
四根信号线的功能定义如下:
| 信号线 | 全称 | 方向(主→从) | 功能描述 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 由主设备产生的同步时钟,决定数据传输速率 |
| MOSI | Master Out Slave In | 主→从 | 主设备发送数据给从设备 |
| MISO | Master In Slave Out | 从→主 | 从设备发送数据给主设备 |
| CS | Chip Select | 主→从 | 片选信号,低电平有效,选中对应从设备 |
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 屏 |
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 的时序关系:
4.4 模式配置与 LCD 驱动匹配
在驱动 LCD 屏时,必须查阅 LCD 控制器数据手册中的 SPI 时序图,确认其要求的 CPOL 和 CPHA 组合。绝大多数 LCD 驱动 IC 默认支持 Mode 0 或 Mode 3,因为这两种模式都在上升沿采样数据,便于 MCU 的 SPI 外设在时钟上升沿锁存数据。
// 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);
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 |