一、SPI协议概述

1.1 SPI总线的起源

SPI,全称Serial Peripheral Interface,是摩托罗拉公司在80年代推出的。说实话,那时候的芯片间通信方式还很原始,要么用并行总线占一堆引脚,要么用UART这种速度上不去的串口。我刚开始做设计时,看到老工程师们用SPI连接各种外设,就觉得这玩意儿真巧妙——简单、高效、够用。

SPI的设计初衷其实很朴素:用最少的引脚,实现最快的片间通信。它不像I2C那样需要复杂的地址仲裁,也不像UART那样依赖波特率匹配。说白了,SPI就是一根时钟线带着数据线跑,谁主谁从清清楚楚。

核心特点:

  • 全双工通信——收发可以同时进行
  • 主从模式——只有一个主设备控制时钟
  • 同步传输——数据与时钟严格对齐
  • 硬件简单——不需要复杂的协议栈

1.2 四线制信号定义

SPI总线通常由四根线组成,我习惯把它们记成「三控一选」:

信号名称 缩写 方向 作用
串行时钟 SCLK 主→从 由主设备产生,控制数据传输节奏
主出从入 MOSI 主→从 主设备发送数据给从设备
主入从出 MISO 从→主 从设备回复数据给主设备
片选信号 CS/SS 主→从 低电平有效,选中某个从设备

嗯,这里要注意:片选信号是SPI通信的「开关」。我在项目中遇到过好几次,因为CS信号没处理好,导致数据错位或者从设备根本没响应。你想想看,CS拉低之前,从设备根本不知道你在跟它说话。

个人经验:设计SPI控制器时,我建议把CS信号的建立时间和保持时间留足余量。有些从设备对CS的时序要求很苛刻,差个几纳秒就可能采样失败。

1.3 单主多从拓扑结构

SPI最常见的拓扑就是一个主设备带多个从设备。主设备通常是MCU或者FPGA,从设备可能是传感器、存储器、显示器等。

连接方式有两种:

  • 独立片选方式——每个从设备独占一根CS线,主设备通过拉低对应的CS来选择通信对象。这种方式最常用,也最可靠。
  • 菊花链方式——所有从设备共用一根CS线,数据像链条一样从一个从设备传到下一个。这种方式省引脚,但延迟大,调试起来也麻烦。

我个人更推荐独立片选方式。为什么?因为调试方便啊!我曾经在一个项目里用了菊花链,结果某个从设备出了问题,排查了半天才发现是中间某个节点的数据没传过去。从那以后,除非引脚实在不够用,否则我坚决不用菊花链。

避坑指南:多从设备共用一个MISO线时,一定要确保未被选中的从设备输出为高阻态。我曾经见过有人忘记加三态门,结果两个从设备同时驱动MISO,直接把信号拉成了不定态。

1.4 典型应用场景

SPI的应用场景非常广泛,我挑几个最常见的说说:

传感器

像加速度计、陀螺仪、温度传感器这类芯片,很多都支持SPI接口。原因很简单——SPI速度快,能满足传感器数据实时采集的需求。我记得有个项目用SPI读取IMU数据,时钟跑到20MHz,一秒钟能读几万组数据,完全够用。

存储器

Flash、EEPROM、SD卡这些存储器件,SPI几乎是标配。尤其是NOR Flash,SPI接口的读写速度可以轻松达到几十MB/s。我在做存储控制器时,发现SPI Flash的页编程和扇区擦除时序很有讲究,稍不注意就会写坏数据。

显示器

很多小尺寸LCD和OLED屏幕也用SPI。虽然SPI的带宽比不上RGB并行接口,但对于分辨率不高的屏幕来说,SPI完全够用。而且SPI的引脚少,布线方便,特别适合做便携设备。

总结一下:SPI之所以能活到现在,靠的就是「简单、快速、灵活」这六个字。不管你是做嵌入式还是做IC设计,SPI都是你绕不开的接口。

1.5 SPI协议知识体系

下面这张图是我自己画的,把SPI协议的核心知识点串了起来。你看一眼就能明白,SPI其实就围绕「时钟极性、时钟相位、数据采样、片选控制」这四个维度展开。

SPI协议核心 时钟极性 CPOL 时钟相位 CPHA 数据采样边沿 片选控制 CS 模式0 (0,0) 模式1 (0,1) 模式2 (1,0) 模式3 (1,1) SPI协议知识体系

从这张图你能看到,SPI的四种工作模式其实就是CPOL和CPHA的组合。CPOL决定时钟空闲时的电平,CPHA决定数据在哪个边沿采样。这两个参数一旦配错,数据就全乱了。我刚开始学的时候,经常搞混模式0和模式3,后来干脆记了个口诀:「CPOL=0空闲低,CPHA=0前沿采」,这才算彻底搞明白。

小技巧:如果你不确定从设备支持哪种模式,可以先把CS拉低,然后看从设备在时钟空闲时有没有输出数据。这个方法我在调试时用过无数次,屡试不爽。

可可精品资料库