SPI 协议基础:四线制与工作原理

大家好,我是老张。做嵌入式这些年,调试过不下百种 SPI 设备。说句实在话,SPI 这协议看着简单,但翻车的人真不少。我自己就曾因为时钟极性没配对,白折腾了三天。咱们今天就把 SPI 的底裤给它扒干净。

什么是 SPI?

SPI 的全称是 Serial Peripheral Interface,摩托罗拉发明的。它是个同步、全双工、主从结构的串行通信协议。

  • 同步:所有数据位都跟着时钟沿走。时钟停了,通信就停了。
  • 全双工:主设备发数据的同时,从设备也在发数据。一个移位寄存器两头发。
  • 主从:整个系统只有一个主设备(通常是单片机或 FPGA),从设备可以有多个,但一次只能跟一个聊。

四线制信号详解

SPI 的“四线”不是随便叫的。每一条线都有自己的脾气。我习惯拿示波器先看波形,对齐信号名,再读数据。

信号名 全称 方向 作用
SCLK Serial Clock 主 → 从 提供同步时钟,由主设备产生;决定了通信速率
MOSI Master Out Slave In 主 → 从 主设备发送数据到从设备的数据线
MISO Master In Slave Out 从 → 主 从设备发送数据到主设备的数据线
CS Chip Select (也称 SS) 主 → 从 片选信号,低电平有效;选中从设备开始通信
个人小贴士: 逻辑分析仪抓线时,我习惯给每根信号线配上不同颜色,SCLK 用黄色、MOSI 用蓝色、MISO 用绿色、CS 用红色。一眼就能看出波形关系,省心。

SPI 工作原理

原理一句话就能说透:主设备通过移位寄存器,在时钟沿把 MOSI 上的数据移给从设备,同时从设备把 MISO 上的数据移给主设备。

比如主设备要发送字节 0xA5,从设备同时返回字节 0x3C。时钟跑 8 个周期,两边各移 8 位。说白了,就是一次时钟脉冲,交换一个比特。

时钟极性和相位

这里是个大坑。SPI 有四种工作模式,由 CPOL (时钟极性) 和 CPHA (时钟相位) 两个参数决定。

  • CPOL:空闲时时钟电平。0 表示空闲低电平,1 表示空闲高电平。
  • CPHA:数据采样沿。0 表示第一个边沿采样,1 表示第二个边沿采样。

我当年第一次接一个温度传感器,手册里没写模式,只给了个时序图。我心里默念:CPOL=0,CPHA=0,结果读出来全是乱码。后来发现它其实用的模式 1(CPOL=0, CPHA=1)。

模式 CPOL CPHA 数据采样边沿
0 0 0 第一个边沿(上升沿)
1 0 1 第二个边沿(下降沿)
2 1 0 第一个边沿(下降沿)
3 1 1 第二个边沿(上升沿)
曾经踩过的坑: 逻辑分析仪抓到的波形看起来“对”,但读出的数据却不对。后来发现是 CS 片选拉低后,时钟还没开始,从设备已经进入了预采样状态。务必检查 CS 到第一个时钟边沿之间的建立时间!

一张图看懂 SPI 通信流程

下面这张 SVB 图是我自己琢磨着画的,把主从设备、四根线、数据流向和时钟关系都放在一起了。你琢磨琢磨,是不是比看一百页手册管用?

SPI 四线制通信示意图 主设备 MCU / FPGA 移位寄存器 从设备 传感器 / Flash 移位寄存器 SCLK (时钟) MOSI (主→从) MISO (从→主) CS (片选, 低有效) 时钟波形 每个时钟脉冲交换 1 bit 数据 说明:同期复位 CS 为低,主设备时钟 SCLK 产生脉冲,MOSI 上的数据在每个时钟沿被从设备采样, 同时 MISO 上的数据被主设备采样。一个字节需要 8 个时钟周期完成。

核心口诀:

CS 拉低选设备,时钟产生交换位。
MOSI 出去不回头,MISO 回来要记对。
CPOL 看空闲,CPHA 看沿位,
四种模式配不对,抓破头皮也没辙。

嗯,到这里,SPI 四线制的底子就算打牢了。后面我们分析具体波形时,你会发现这些基础知识就像地基一样——地基稳了,楼才不会塌。逻辑分析仪也好,示波器也罢,抓回来的波形都是照着这套原理走的。你只要把线认准、把沿看对、把模式搞清,剩下就是数比特了。