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 通信时序。
从图中可以看到,在模式 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 决定,主从必须匹配
- 独立片选比菊花链更可靠,调试更方便