2. SPI 协议基础:物理层、四线制与全双工通信

SPI(Serial Peripheral Interface,串行外设接口)是一种由 Motorola 公司提出的同步、全双工、主从式串行通信总线。在嵌入式系统中,SPI 因其高速、简单、硬件开销低的特点,被广泛用于传感器、ADC/DAC、显示驱动、存储芯片(如 Flash/SD 卡)等外设。理解 SPI 的物理层信号定义、时钟极性与相位配置,是后续在 Zephyr OS 中正确配置 SPI 驱动并优化通信性能的基础。

学习提示:SPI 协议虽然简单,但时钟极性与相位的组合(4 种模式)是初学者最容易出错的地方。请务必结合本章的时序图与表格,理解 CPOL 与 CPHA 对数据采样边沿的影响。

2.1 SPI 总线物理层与四线制信号

标准的 SPI 总线使用 四根信号线 实现主从设备之间的全双工通信。这四根线分别是:

信号线名称 缩写 方向(主设备视角) 功能描述
串行时钟 SCLK / SCK 输出 → 从设备 由主设备产生,决定数据传输的速率与同步节拍
主出从入 MOSI 输出 → 从设备 主设备发送数据给从设备的数据线
主入从出 MISO 输入 ← 从设备 从设备发送数据给主设备的数据线
片选信号 CS / SS 输出 → 从设备 主设备选择并激活特定从设备,低电平有效

SPI 总线采用 主从架构:主设备(通常是 MCU)负责产生时钟信号并控制片选线;从设备(外设芯片)在片选信号有效时,根据时钟信号同步收发数据。由于 MOSI 和 MISO 是独立的物理线路,SPI 能够在每个时钟周期内同时完成一位数据的发送和接收,从而实现真正的 全双工通信。

关键概念:SPI 的“全双工”意味着主设备在向从设备发送数据(通过 MOSI)的同时,也能从从设备接收数据(通过 MISO)。这两个方向的数据传输在同一个时钟边沿完成,互不干扰。
SPI 四线制主从连接拓扑 主设备 (MCU / 主机) 从设备 (外设芯片) SCLK MOSI MISO CS (片选) SPI 四线制:SCLK 提供同步时钟,MOSI/MISO 实现全双工数据通道,CS 选择从设备。 主设备必须同时驱动 SCLK 和 CS,从设备在 CS 有效时响应时钟。

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

SPI 协议定义了 4 种通信模式,由时钟极性(CPOL)和时钟相位(CPHA)两个参数组合决定。这两个参数决定了数据在 SCLK 的哪个边沿被采样、哪个边沿被切换。

  • CPOL(Clock Polarity,时钟极性):定义 SCLK 在空闲状态(CS 有效但无数据传输时)的电平。
    • CPOL = 0:空闲时 SCLK 为低电平。
    • CPOL = 1:空闲时 SCLK 为高电平。
  • CPHA(Clock Phase,时钟相位):定义数据采样发生在 SCLK 的第一个边沿还是第二个边沿。
    • CPHA = 0:数据在 SCLK 的第一个边沿(上升沿或下降沿,取决于 CPOL)被采样。
    • CPHA = 1:数据在 SCLK 的第二个边沿被采样。

下表总结了 4 种 SPI 模式的详细配置:

SPI 模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据切换边沿
模式 0 0 0 低电平 上升沿(第一个边沿) 下降沿
模式 1 0 1 低电平 下降沿(第二个边沿) 上升沿
模式 2 1 0 高电平 下降沿(第一个边沿) 上升沿
模式 3 1 1 高电平 上升沿(第二个边沿) 下降沿
常见错误:在 Zephyr OS 中配置 SPI 时,如果主设备与从设备的 SPI 模式不匹配(例如主设备配置为模式 0,而从设备要求模式 3),会导致数据采样错位,通信完全失败。务必查阅外设数据手册确认其支持的 SPI 模式。
SPI 模式 0 与模式 3 时序对比 SPI 模式 0 (CPOL=0, CPHA=0) SCLK MOSI ↑ 上升沿采样 SPI 模式 3 (CPOL=1, CPHA=1) SCLK MOSI ↑ 上升沿采样(第二个边沿) 模式 0 与模式 3 的 SCLK 空闲电平相反,但数据都在上升沿采样(模式 0 为第一个边沿,模式 3 为第二个边沿)。

2.3 全双工通信原理

SPI 的全双工特性源于其独立的发送和接收数据路径。在每一个 SCLK 时钟周期内,主设备和从设备同时执行以下操作:

  1. 主设备 将一位数据从发送移位寄存器输出到 MOSI 线。
  2. 从设备 将一位数据从发送移位寄存器输出到 MISO 线。
  3. 在时钟的采样边沿,主设备采样 MISO 线获取从设备发送的位,从设备采样 MOSI 线获取主设备发送的位。
  4. 移位寄存器移动一位,准备下一个时钟周期的数据传输。

这种机制意味着:要接收 N 个字节的数据,主设备必须同时发送 N 个字节的数据(通常为 0x00 或 0xFF 等虚拟数据)。反之亦然,主设备发送 N 个字节数据时,也会同时接收到 N 个字节的数据(可能为无效数据)。

性能优化要点:在 Zephyr OS 中,SPI 驱动通常使用 DMA(直接存储器访问)来搬运 MOSI 和 MISO 的数据。合理配置 DMA 缓冲区大小和触发阈值,可以显著降低 CPU 开销,提升全双工通信的吞吐量。我们将在后续章节详细讨论 DMA 与 SPI 的协同配置。
SPI 全双工通信数据流 主设备 发送移位寄存器 接收移位寄存器 从设备 发送移位寄存器 接收移位寄存器 MOSI: 主 → 从 MISO: 从 → 主 SCLK 同步时钟 全双工:每个时钟周期内,主设备通过 MOSI 发送一位,同时通过 MISO 接收一位。 发送和接收操作完全同步,互不阻塞。

2.4 本章小结

本章从物理层信号定义出发,详细介绍了 SPI 总线的四线制结构、时钟极性与相位的 4 种工作模式,以及全双工通信的数据流原理。掌握这些基础知识后,你将能够正确理解外设数据手册中的时序要求,并为后续在 Zephyr OS 中配置 SPI 驱动参数(如 spi_config 结构体中的 operation 字段)打下坚实的理论基础。