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) | 主 → 从 | 片选信号,低电平有效;选中从设备开始通信 |
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 | 第二个边沿(上升沿) |
一张图看懂 SPI 通信流程
下面这张 SVB 图是我自己琢磨着画的,把主从设备、四根线、数据流向和时钟关系都放在一起了。你琢磨琢磨,是不是比看一百页手册管用?
核心口诀:
CS 拉低选设备,时钟产生交换位。
MOSI 出去不回头,MISO 回来要记对。
CPOL 看空闲,CPHA 看沿位,
四种模式配不对,抓破头皮也没辙。
嗯,到这里,SPI 四线制的底子就算打牢了。后面我们分析具体波形时,你会发现这些基础知识就像地基一样——地基稳了,楼才不会塌。逻辑分析仪也好,示波器也罢,抓回来的波形都是照着这套原理走的。你只要把线认准、把沿看对、把模式搞清,剩下就是数比特了。