3. SPI接口驱动排查:模式选择与电平测量
SPI(Serial Peripheral Interface)是LCD TFT屏驱动中最常用的同步串行接口。实际硬件故障中,超过60%的SPI通信问题源于模式不匹配和信号电平异常。本节将系统讲解SPI四种模式的电气差异、配置方法以及使用万用表/示波器进行电平测量的标准流程。
3.1 SPI模式(Mode 0/1/2/3)核心差异
SPI模式由时钟极性(CPOL)和时钟相位(CPHA)两个参数决定:
- CPOL:决定SCLK空闲时的电平。CPOL=0为空闲低电平,CPOL=1为空闲高电平。
- CPHA:决定数据采样时刻。CPHA=0在第一个时钟边沿采样,CPHA=1在第二个时钟边沿采样。
| SPI模式 | CPOL | CPHA | 空闲SCLK电平 | 数据采样边沿 | 常见LCD驱动IC |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿采样 | ILI9341, ST7789, SSD1306 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿采样 | 部分旧款COG屏 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿采样 | 少数SPI Flash+LCD组合 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿采样 | 部分高速TFT屏 |
实训经验:ILI9341/ST7789等主流TFT驱动IC默认使用Mode 0(CPOL=0, CPHA=0)。如果屏幕初始化后无显示或显示花屏,优先检查MCU的SPI配置是否与屏端Mode 0一致。
3.2 时钟极性与相位配置实战
在STM32/HAL库环境下,SPI模式配置通过结构体成员 CLKPolarity 和 CLKPhase 实现。以下代码展示四种模式的显式配置:
/* SPI模式配置代码片段 */
SPI_HandleTypeDef hspi1;
void SPI_Mode_Config(uint8_t mode)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
switch(mode)
{
case 0: /* Mode 0: CPOL=0, CPHA=0 */
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
break;
case 1: /* Mode 1: CPOL=0, CPHA=1 */
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
break;
case 2: /* Mode 2: CPOL=1, CPHA=0 */
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
break;
case 3: /* Mode 3: CPOL=1, CPHA=1 */
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
break;
default:
return;
}
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler(); /* 初始化失败处理 */
}
}
常见配置陷阱:
- CPHA=0 对应
SPI_PHASE_1EDGE(第一个边沿采样),CPHA=1 对应SPI_PHASE_2EDGE(第二个边沿采样)。部分MCU库的宏定义命名可能相反,务必查阅参考手册。 - 如果LCD数据手册未明确标注SPI模式,可通过SCLK空闲电平反推:空闲低→CPOL=0;空闲高→CPOL=1。
3.3 数据线电平测量与故障定位
使用万用表或示波器测量SPI四根信号线(MOSI、MISO、SCLK、CS)的电平,是排查硬件连接故障最直接的手段。以下为标准化测量流程:
- 断电测量通断:万用表蜂鸣档,确认每根线从MCU引脚到LCD模块对应引脚之间导通,阻值<5Ω。
- 上电测量静态电平:系统上电但未启动SPI通信时,测量各引脚电平:
- SCLK:应等于CPOL设定的空闲电平(Mode 0/1为低,Mode 2/3为高)。
- CS:应为高电平(片选无效状态)。
- MOSI/MISO:通常为低或弱上拉状态。
- 动态波形测量:运行SPI发送测试代码,用示波器捕获:
- CS下降沿→SCLK第一个有效边沿→数据位输出→CS上升沿。
- 确认数据位在正确的时钟边沿被采样。
| 信号线 | 正常静态电平 | 异常电平及可能原因 | 排查工具 |
|---|---|---|---|
| SCLK | 低(Mode 0/1)或高(Mode 2/3) | 浮空/不定态→MCU未配置GPIO模式;电平错误→CPOL配置反了 | 示波器、万用表 |
| MOSI | 低电平或弱上拉 | 始终高→内部上拉或短路到VCC;无变化→MCU未发送数据或GPIO模式错误 | 示波器(观察数据帧) |
| MISO | 低电平或弱上拉 | 始终低→LCD未应答或未使能输出;高电平→上拉电阻过大或LCD损坏 | 示波器(观察回传数据) |
| CS | 高电平 | 始终低→片选被强制拉低或GPIO配置为推挽输出低;无跳变→软件未控制CS | 万用表、逻辑分析仪 |
3.4 电平测量实操要点
示波器测量设置建议:
- 时基:根据SPI速率设置,常用1µs/div~10µs/div。
- 触发:设置CS下降沿触发,捕获整个片选周期内的数据帧。
- 探头:使用10×探头档位,减少负载效应;接地弹簧尽量短。
- 测量内容:SCLK频率、数据建立时间(tSU)、数据保持时间(tHD)、CS无效时间。
快速定位模式不匹配:用示波器同时测量SCLK和MOSI,观察MOSI数据变化是否发生在SCLK的有效边沿上。如果数据在SCLK上升沿变化但LCD期望下降沿采样,则说明CPHA配置反了。此时交换CPHA值(0→1或1→0)即可修复。
3.5 实训自检清单
| 检查项 | 操作 | 合格标准 | 排查结果 |
|---|---|---|---|
| SPI模式匹配 | 核对LCD数据手册与MCU配置 | CPOL/CPHA完全一致 | □ 通过 □ 未通过 |
| SCLK空闲电平 | 万用表直流电压档测量 | Mode 0/1:<0.4V;Mode 2/3:>VCC-0.4V | □ 通过 □ 未通过 |
| CS片选控制 | 示波器观察CS波形 | 每次传输前有下降沿,传输后有上升沿 | □ 通过 □ 未通过 |
| MOSI数据输出 | 发送0x55,示波器观察 | 数据位在SCLK有效边沿稳定,无毛刺 | □ 通过 □ 未通过 |
| MISO回读 | 发送读寄存器指令 | MISO有正确的回传数据 | □ 通过 □ 未通过 |