SPI 硬件基础:四线制与时钟模式详解

SPI(Serial Peripheral Interface,串行外设接口)是一种同步、全双工、主从架构的串行通信总线。在嵌入式 Linux 设备树配置中,理解 SPI 的硬件信号定义和时钟模式是正确编写节点属性的前提。本节从物理层信号线、时钟极性与相位两个核心维度展开。

2.1 SPI 四线制信号定义

标准 SPI 总线使用四条信号线完成主设备与从设备之间的数据交换。下表列出每条信号线的名称、方向与功能:

信号线全称方向(主设备视角)功能描述
SCLKSerial Clock输出由主设备产生的同步时钟信号,决定数据传输速率
MOSIMaster Out Slave In输出主设备发送数据到从设备的数据线
MISOMaster In Slave Out输入从设备发送数据到主设备的数据线
CSChip Select输出片选信号,低电平有效,用于选中特定的从设备
关键概念: SPI 是全双工通信,在每个时钟周期内,主设备通过 MOSI 发送一位数据,同时从设备通过 MISO 返回一位数据。CS 线决定了总线上哪个从设备参与本次通信,未被选中的从设备必须将 MISO 置为高阻态。

下图展示了标准 SPI 四线制连接拓扑:

SPI 四线制连接拓扑图 主设备 (Master) SoC / MCU 从设备 (Slave) 传感器 / ADC / 显示 SCLK MOSI MISO CS (低电平有效) 每个从设备独占一条 CS 线,SCLK/MOSI/MISO 可共享 主设备通过拉低对应 CS 线来选择通信目标

2.2 SPI 时钟极性与相位(CPOL / CPHA)

SPI 协议通过 时钟极性(CPOL) 和 时钟相位(CPHA) 两个参数定义数据采样与切换的时序关系。这两个参数共同决定了 SPI 的四种工作模式。

2.2.1 CPOL:时钟极性

  • CPOL = 0:SCLK 空闲状态为低电平(0)。
  • CPOL = 1:SCLK 空闲状态为高电平(1)。

2.2.2 CPHA:时钟相位

  • CPHA = 0:数据在 SCLK 的第一个边沿(上升沿或下降沿)被采样,第二个边沿切换数据。
  • CPHA = 1:数据在 SCLK 的第二个边沿被采样,第一个边沿切换数据。
记忆口诀: CPOL 决定空闲电平,CPHA 决定采样边沿是第一个还是第二个。CPHA=0 时采样发生在第一个边沿,CPHA=1 时采样发生在第二个边沿。

2.3 SPI 四种模式详解

将 CPOL 与 CPHA 组合,得到 SPI 的四种标准模式。下表列出每种模式的参数组合与典型应用:

模式CPOLCPHA空闲电平采样边沿数据切换边沿常见设备
Mode 000低上升沿(第一个边沿)下降沿多数 SPI Flash、SD 卡
Mode 101低下降沿(第二个边沿)上升沿部分 ADC 芯片
Mode 210高下降沿(第一个边沿)上升沿某些传感器
Mode 311高上升沿(第二个边沿)下降沿部分 EEPROM、LCD 驱动

下图以波形图形式展示四种模式的时序差异:

SPI 四种模式时序波形图 SPI 四种模式 SCLK 与数据时序对比 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 波形 采样点

2.4 设备树中的 SPI 模式配置

在设备树中,SPI 从设备节点的 spi-max-frequency 属性定义通信速率,而模式通过 spi-cpol 和 spi-cpha 属性指定。以下是一个典型的 SPI 从设备节点配置示例:

&spi1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_spi1_default>;

    temperature_sensor: max31865@0 {
        compatible = "maxim,max31865";
        reg = <0>;                 /* CS 线索引,对应硬件片选 0 */
        spi-max-frequency = <5000000>;  /* 5 MHz */
        spi-cpol;                  /* CPOL = 1 */
        spi-cpha;                 /* CPHA = 1 */
        /* 等效于 SPI Mode 3 */
    };
};
常见错误: 如果设备树中未显式声明 spi-cpol 和 spi-cpha,Linux SPI 子系统默认使用 Mode 0(CPOL=0, CPHA=0)。若从设备手册要求其他模式,必须显式添加这两个属性,否则通信将失败。

2.5 模式匹配检查清单

在编写设备树 SPI 节点前,建议按以下步骤确认模式配置:

  1. 查阅从设备数据手册,找到 SPI 时序章节,确认 CPOL 和 CPHA 的推荐值。
  2. 确认主控制器支持:大多数 SPI 控制器支持所有四种模式,但部分老式控制器可能只支持 Mode 0 和 Mode 3。
  3. 在设备树中显式声明:即使默认模式匹配,也建议显式添加 spi-cpol 和 spi-cpha 以提高代码可读性。
  4. 验证时序:使用逻辑分析仪或示波器抓取 SCLK 和 MOSI/MISO 波形,确认采样边沿与设备手册一致。

下图总结了 SPI 模式选择与设备树属性的对应关系:

SPI 模式与设备树属性映射图 SPI 模式 Mode 0 Mode 1 Mode 2 Mode 3 CPOL / CPHA CPOL=0, CPHA=0 CPOL=0, CPHA=1 CPOL=1, CPHA=0 CPOL=1, CPHA=1 设备树属性 (默认,可不写) spi-cpha; spi-cpol; spi-cpol; spi-cpha;

2.6 本节要点总结

  • SPI 四线制包括 SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
  • CPOL 定义时钟空闲电平,CPHA 定义数据采样发生在第一个还是第二个边沿。
  • 四种模式(Mode 0~3)由 CPOL 和 CPHA 组合决定,Mode 0 是最常用的默认模式。
  • 设备树中使用 spi-cpol 和 spi-cpha 属性指定模式,缺失时默认为 Mode 0。
  • 实际开发中务必核对从设备数据手册,并通过逻辑分析仪验证时序。