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一致。
SPI四种模式时序对比 SPI Mode 0/1/2/3 时序对比 Mode 0 (CPOL=0, CPHA=0) SCLK空闲低,上升沿采样 Mode 1 (CPOL=0, CPHA=1) SCLK空闲低,下降沿采样 Mode 2 (CPOL=1, CPHA=0) SCLK空闲高,下降沿采样 Mode 3 (CPOL=1, CPHA=1) SCLK空闲高,上升沿采样 ⚠ 关键判断: 用示波器测量SCLK空闲电平:低→Mode 0/1;高→Mode 2/3。再观察第一个数据位采样边沿即可确定具体模式。 图例: Mode 0 SCLK Mode 1 SCLK Mode 2 SCLK Mode 3 SCLK 采样点 空闲电平参考线

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)的电平,是排查硬件连接故障最直接的手段。以下为标准化测量流程:

  1. 断电测量通断:万用表蜂鸣档,确认每根线从MCU引脚到LCD模块对应引脚之间导通,阻值<5Ω。
  2. 上电测量静态电平:系统上电但未启动SPI通信时,测量各引脚电平:
    • SCLK:应等于CPOL设定的空闲电平(Mode 0/1为低,Mode 2/3为高)。
    • CS:应为高电平(片选无效状态)。
    • MOSI/MISO:通常为低或弱上拉状态。
  3. 动态波形测量:运行SPI发送测试代码,用示波器捕获:
    • CS下降沿→SCLK第一个有效边沿→数据位输出→CS上升沿。
    • 确认数据位在正确的时钟边沿被采样。
信号线 正常静态电平 异常电平及可能原因 排查工具
SCLK 低(Mode 0/1)或高(Mode 2/3) 浮空/不定态→MCU未配置GPIO模式;电平错误→CPOL配置反了 示波器、万用表
MOSI 低电平或弱上拉 始终高→内部上拉或短路到VCC;无变化→MCU未发送数据或GPIO模式错误 示波器(观察数据帧)
MISO 低电平或弱上拉 始终低→LCD未应答或未使能输出;高电平→上拉电阻过大或LCD损坏 示波器(观察回传数据)
CS 高电平 始终低→片选被强制拉低或GPIO配置为推挽输出低;无跳变→软件未控制CS 万用表、逻辑分析仪
SPI信号测量与故障排查流程 SPI信号测量与故障排查流程 开始SPI故障排查 步骤1:断电测量4线通断(蜂鸣档) 通断正常? 检查焊接/飞线 步骤2:上电测静态电平 步骤3:示波器捕获波形 波形正确? 检查模式/速率配置 OK 💡 提示:动态波形测量时,发送0x55或0xAA(交替位模式)可快速验证数据线是否翻转正常。

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有正确的回传数据 □ 通过 □ 未通过