3. CPOL=0, CPHA=0 模式详解:空闲时 SCLK 为低电平,数据在第一个时钟边沿(上升沿)采样

CPOL=0, CPHA=0 是 SPI 通信中最常用的模式之一,也被称为 模式 0。理解该模式的时序细节是掌握 SPI 调试的基础。本节将从波形图、数据采样点、数据有效性以及驱动适配要点四个方面进行深入分析。

3.1 模式 0 的时序特征

在 CPOL=0, CPHA=0 模式下,SPI 总线的时钟极性和相位具有以下明确特征:

  • 时钟极性 (CPOL) = 0:总线空闲时,SCLK 信号线保持为 低电平。
  • 时钟相位 (CPHA) = 0:数据在 第一个时钟边沿 被采样。由于 CPOL=0,第一个边沿是从低电平跳变到高电平的 上升沿。
  • 数据输出:数据在第一个时钟边沿之前的半个周期(即 SCLK 的第一个跳变沿之前)由主机或从机驱动到 MOSI/MISO 线上,并在随后的每个时钟边沿更新。
关键记忆点: 模式 0 下,数据在 SCLK 的 上升沿 被采样,在 下降沿 被移位输出。空闲时 SCLK 为低电平。

3.2 波形图与数据采样点分析

下图展示了 CPOL=0, CPHA=0 模式下,一个 8 位数据帧(例如 0xA5)的传输波形。图中清晰标注了采样点、数据变化点以及数据有效窗口。

CPOL=0, CPHA=0 模式 SPI 时序波形图 SCLK CS MOSI MSB 1 0 1 0 0 1 0 1 0 1 0 1 0 1 LSB 采样点 说明: • 数据在 SCLK 上升沿被采样(橙色圆点标记)。 • 数据在 SCLK 下降沿被移位输出。

3.3 数据有效性分析

在 CPOL=0, CPHA=0 模式下,数据的采样和输出时序决定了其有效性窗口。理解这一窗口对于确保数据正确传输至关重要。

时序事件 SCLK 状态 数据线 (MOSI/MISO) 行为 数据有效性
CS 拉低(传输开始) 低电平(空闲) 主机/从机准备输出第一个数据位 数据尚未稳定,处于建立阶段
第一个上升沿(采样点) 低 → 高 数据线已被驱动至有效电平 数据有效,被采样锁存
第一个下降沿 高 → 低 发送方更新数据,准备下一个数据位 上一个数据位已锁存,当前数据线进入过渡期
第二个上升沿(采样点) 低 → 高 下一个数据位已稳定 数据有效,被采样锁存
CS 拉高(传输结束) 低电平(空闲) 数据线进入高阻或空闲状态 传输完成,数据无效
调试提示: 使用逻辑分析仪观察模式 0 波形时,应重点检查 SCLK 上升沿时刻数据线的电平是否稳定。如果发现数据在上升沿附近发生跳变,通常表明存在建立时间 (tSU) 或保持时间 (tH) 违例,需要调整 SPI 时钟频率或检查 PCB 走线长度。

3.4 驱动适配要点

在 Linux 内核或 RTOS 中配置 SPI 控制器为模式 0,通常涉及以下步骤:

  1. 设置 SPI 模式标志位:在 SPI 设备结构体中,将 mode 字段设置为 SPI_MODE_0(通常定义为 0)。
  2. 配置时钟极性 (CPOL):设置控制器的时钟极性寄存器位为 0,确保空闲时 SCLK 为低电平。
  3. 配置时钟相位 (CPHA):设置控制器的时钟相位寄存器位为 0,确保数据在第一个边沿(上升沿)采样。
  4. 验证数据格式:确认 MSB 优先或 LSB 优先设置与从设备匹配。

以下是一个典型的 Linux SPI 设备驱动初始化代码片段:

#include <linux/spi/spi.h>

static int spi_device_probe(struct spi_device *spi)
{
    int ret;

    /* 设置 SPI 模式为模式 0:CPOL=0, CPHA=0 */
    spi->mode = SPI_MODE_0;

    /* 设置数据位宽为 8 位 */
    spi->bits_per_word = 8;

    /* 设置最大时钟频率,例如 1 MHz */
    spi->max_speed_hz = 1000000;

    /* 将配置写入 SPI 控制器 */
    ret = spi_setup(spi);
    if (ret < 0) {
        dev_err(&spi->dev, "SPI setup failed\n");
        return ret;
    }

    dev_info(&spi->dev, "SPI device configured in Mode 0\n");
    return 0;
}

3.5 常见问题与避坑指南

  • 时钟极性不匹配:如果从设备要求空闲时 SCLK 为高电平(CPOL=1),而主机配置为模式 0(CPOL=0),则第一个采样边沿会错误地出现在下降沿,导致数据错位。
  • 相位理解错误:CPHA=0 并不意味着数据在第一个边沿“输出”,而是“采样”。数据输出实际上发生在第一个边沿之前的半个周期。
  • 高速通信时的建立/保持时间:在较高时钟频率下(如 > 10 MHz),SCLK 上升沿与数据变化点之间的时间窗口会变窄。必须确保从设备的建立时间和保持时间满足要求,否则会出现随机误码。
重要警告: 切勿仅凭“感觉”猜测 SPI 模式。在连接一个新的 SPI 从设备前,务必查阅其数据手册中关于“SPI Timing Diagram”或“SPI Mode”的章节,确认其要求的 CPOL 和 CPHA 组合。错误的模式配置可能导致设备无响应或数据损坏。