SPI 协议基础:从物理层到模式配置

大家好,我是你们的嵌入式系统讲师。今天咱们正式开始《SPI协议与DMA传输环形缓冲区性能调优实战》的第一章——SPI协议基础。说实话,SPI这玩意儿看起来简单,但我在项目里见过太多人栽在细节上。咱们今天就把它的底裤扒干净。

1.1 SPI 总线架构:主从之间的对话

SPI,全称 Serial Peripheral Interface,串行外设接口。它是由摩托罗拉公司(对,就是那个造手机芯片的摩托罗拉)提出的一种同步串行通信协议。说白了,就是让一个主设备(Master)和多个从设备(Slave)之间交换数据。

它的核心思想是:全双工、同步、主从架构。全双工意味着数据可以同时双向传输;同步意味着所有操作都跟着时钟信号走;主从架构则决定了谁控制时钟、谁响应。

核心要点:SPI 是同步全双工通信,主设备负责产生时钟信号,从设备只能被动响应。这一点和 I2C 完全不同,I2C 的时钟可以由从设备拉低来“拉伸”,但 SPI 不行。

我个人习惯把 SPI 总线想象成一个环形移位寄存器。主设备每发出一个时钟脉冲,就把自己的数据移出一位,同时从设备也移出一位。所以,一次时钟脉冲交换了一位数据。嗯,这个比喻很形象,你想想看。

1.2 四线制详解:SCLK、MOSI、MISO、CS

标准的 SPI 接口有四根线,缺一不可。我见过有人为了省一根线把 CS 接地,结果通信乱得一塌糊涂。咱们一个一个说清楚。

信号线 全称 方向 功能描述
SCLK Serial Clock Master → Slave 时钟信号,由主设备产生,决定数据传输速率
MOSI Master Out Slave In Master → Slave 主设备输出,从设备输入的数据线
MISO Master In Slave Out Slave → Master 从设备输出,主设备输入的数据线
CS Chip Select Master → Slave 片选信号,低电平有效,选中对应的从设备

SCLK:时钟线。它的频率决定了 SPI 的通信速率。比如 10MHz 的 SCLK,意味着每秒可以传输 10M 个比特。注意,SCLK 的极性(CPOL)和相位(CPHA)是可以配置的,这个后面会细说。

MOSI 和 MISO:数据线。MOSI 是主设备发、从设备收;MISO 是从设备发、主设备收。因为 SPI 是全双工的,所以这两根线可以同时传输数据。我在项目中遇到过一个问题:有人把 MOSI 和 MISO 接反了,结果数据全是乱码。排查了半天才发现是硬件连线错了。

CS:片选线。每个从设备都有一根独立的 CS 线。主设备通过拉低某个从设备的 CS 来选中它,其他从设备的 CS 保持高电平,它们就会“闭嘴”,不参与通信。我曾经见过一个设计,多个从设备共用一根 CS 线,结果数据冲突得一塌糊涂。嗯,这里要注意:CS 必须在整个传输过程中保持低电平,不能中途拉高。

避坑指南:我曾经在一个项目中,因为 CS 信号在传输过程中被中断(被更高优先级的中断打断),导致从设备接收到的数据不完整,整个系统直接死机。后来我加了一个临界区保护,才解决了这个问题。

1.3 工作模式:CPOL 和 CPHA 配置

SPI 有四种工作模式,由两个参数决定:CPOL(Clock Polarity,时钟极性)和 CPHA(Clock Phase,时钟相位)。这两个参数决定了数据在时钟的哪个边沿被采样。

CPOL:决定时钟空闲时的电平。

  • CPOL = 0:空闲时 SCLK 为低电平
  • CPOL = 1:空闲时 SCLK 为高电平

CPHA:决定数据在哪个时钟边沿被采样。

  • CPHA = 0:在第一个时钟边沿(上升沿或下降沿)采样数据
  • CPHA = 1:在第二个时钟边沿采样数据

组合起来就是四种模式:

模式 CPOL CPHA 采样边沿 数据变化边沿
模式 0 0 0 上升沿 下降沿
模式 1 0 1 下降沿 上升沿
模式 2 1 0 下降沿 上升沿
模式 3 1 1 上升沿 下降沿

你想想看,为什么会有四种模式?因为不同的从设备厂商可能采用不同的采样策略。比如某些 AD 转换器要求模式 0,某些 Flash 存储器要求模式 3。所以,主设备和从设备的模式必须匹配,否则数据会错位。

个人经验:我建议你在设计电路时,优先选择模式 0 或模式 3。因为这两种模式在时钟的上升沿采样数据,而大多数 MCU 的 SPI 外设在上升沿采样时时序更稳定。当然,具体还是要看从设备的 datasheet。

1.4 SPI 通信时序图解

光说理论不够直观,咱们画个图看看。下面这张 SVG 图展示了模式 0 下的 SPI 通信时序。

SPI 模式 0 通信时序图 SPI 模式 0 (CPOL=0, CPHA=0) 通信时序 SCLK 采样 采样 采样 采样 采样 采样 MOSI D7 D6 D5 D4 D3 D2 D1 D0 MISO D7 D6 D5 D4 D3 D2 D1 D0 CS CS 拉低,选中从设备 CS 拉高,释放从设备 模式 0 关键特征 空闲时 SCLK 为低电平(CPOL=0) 在 SCLK 上升沿采样数据,下降沿数据变化(CPHA=0)

从图中可以看到,在模式 0 下,SCLK 空闲时为低电平。主设备在 SCLK 的上升沿采样 MISO 线上的数据,在下降沿更新 MOSI 线上的数据。这样,一个时钟周期就完成了一位数据的交换。

1.5 多从设备连接方式

当你有多个从设备时,有两种连接方式:独立片选和菊花链。

独立片选:每个从设备都有一根独立的 CS 线,主设备通过拉低对应的 CS 来选中它。这种方式简单直接,但会占用更多的 GPIO 引脚。

菊花链:所有从设备共用一根 CS 线,数据从主设备依次经过每个从设备,最后再回到主设备。这种方式节省引脚,但延迟会累加,而且要求从设备支持菊花链模式。

我的建议:在大多数嵌入式项目中,我推荐使用独立片选方式。虽然多占几个 GPIO,但调试起来方便得多。菊花链模式一旦出问题,定位故障点非常痛苦。我曾经在一个项目中用了菊花链,结果某个从设备时序不达标,整个链都废了。

1.6 SPI 的优缺点

没有完美的协议,SPI 也有它的短板。咱们客观地看一下。

优点 缺点
全双工通信,效率高 需要 4 根线,占用引脚多
传输速率高,可达几十 MHz 没有内置的从设备地址机制,需要额外的 CS 线
协议简单,硬件实现容易 没有应答机制,主设备无法知道从设备是否收到数据
支持多从设备 距离受限,通常不超过几米

说白了,SPI 适合短距离、高速率、点对点或少量从设备的场景。比如传感器数据采集、Flash 存储器读写、LCD 屏幕驱动等。如果你需要长距离通信或者多设备自动寻址,那还是考虑 I2C 或 CAN 吧。

1.7 本章小结

好了,第一章的内容就到这里。咱们把 SPI 的物理层、四线制、工作模式都捋了一遍。记住几个关键点:

  • SPI 是同步全双工通信,主设备控制时钟
  • 四根线各司其职,CS 必须全程拉低
  • 四种工作模式由 CPOL 和 CPHA 决定,主从必须匹配
  • 独立片选比菊花链更可靠,调试更方便