SPI

目录

SPI

一、 SPI 协议简介

SPI(Serial Peripheral Interface)是由摩托罗拉公司开发的一种全双工、同步、四线制的串行通信总线。它以其简单性和高速度而闻名。

  • 全双工:数据可以同时在主设备和从设备之间双向传输。

  • 同步:通信双方通过统一的时钟信号(SCLK)来同步数据位(MOSI, MISO)的传输节奏。

  • 四线制:通常需要四根信号线(有时可精简为三线)。

  • 高速:相比 I2C,SPI 可以达到很高的速度(几十 Mbps 甚至上百 Mbps),没有标准上限。(推挽输出能力强)

  • 无寻址:通过硬件片选(CS)线选择从设备,不支持软件寻址。

二、 硬件连接与信号线

image-20251125232423129 SPI 通信至少需要四根线:

信号线名称 全称 方向 描述
SCLK / SCK Serial Clock 主 → 从 主设备产生的同步时钟信号。
MOSI / SDO Master Out Slave In 主 → 从 数据从主设备输出,输入到从设备
MISO / SDI Master In Slave Out 从 → 主 数据从从设备输出,输入到主设备
CS / SS Chip Select / Slave Select 主 → 从 主设备用于选择目标从设备的信号(低电平有效)。

Note

输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入。 当从机未被选中时,其输出引脚MISO必须为高阻态(断开)

三、 核心概念

移位示意

SPI移位示意
SPI移位示意

1. 时钟极性(CPOL)与时钟相位(CPHA)

这是 SPI 最核心也最容易混淆的概念,它们共同定义了时钟的稳定电平和数据采样的边沿。有四种可能的模式。

  • 时钟极性 CPOL

    • CPOL = 0: 时钟空闲状态(当 CS 有效但无数据传输时)为低电平

    • CPOL = 1: 时钟空闲状态为高电平

  • 时钟相位 CPHA

    • CPHA = 0: 数据在时钟的第一个边沿(即 SCK 从空闲状态变化的第一个边沿)被采样。

    • CPHA = 1: 数据在时钟的第二个边沿(即 SCK 从空闲状态变化的第二个边沿)被采样。

四种 SPI 模式总结:

模式 CPOL CPHA 时钟空闲状态 数据采样时刻 数据移位/变化时刻
Mode 0 0 0 Low 第一个时钟边沿(上升沿) 在下降沿(第二个边沿)
Mode 1 0 1 Low 第二个时钟边沿(下降沿) 在上升沿(第一个边沿)
Mode 2 1 0 High 第一个时钟边沿(下降沿) 在上升沿(第二个边沿)
Mode 3 1 1 High 第二个时钟边沿(上升沿) 在下降沿(第一个边沿)

关键记忆点Mode 0 和 Mode 3 是最常用的两种模式。主设备和从设备的 CPOL 与 CPHA 设置必须完全一致,否则无法正常通信。

2. 数据顺序(Bit Order)

  • 可以配置为 MSB First(最高位先行)或 LSB First(最低位先行)。MSB First 是默认和最常见的方式。

3. 数据帧大小(Frame Size)

  • 通常为 8位(1个字节),但许多现代控制器支持任意长度的数据帧(如 4位, 12位, 16位等)。

四、 通信流程与帧格式

SPI 的通信流程非常简单,由主设备完全控制。

基本通信流程

  1. 初始化:主设备配置时钟极性(CPOL)和相位(CPHA)。
  2. 片选(开始):主设备将目标从设备的 CS 线拉低(有效),激活该从设备。
SPI起始条件
SPI起始条件
  1. 数据传输:主设备在 SCLK 线上产生时钟脉冲,同时:

    • 通过 MOSI 线将数据一位一位地发送给从设备。

    • 通过 MISO 线从从设备一位一位地接收数据。

    • 这是一个同时进行(全双工) 的过程。

    • 传输结束:主设备将 CS 线拉高(无效),结束通信。

帧格式波形图(以 8 位数据传输为例)

由于 SPI 有四种模式,其波形也不同。下图清晰地展示了四种模式下的数据传输时序。

通用时序概念:

  • 数据采样时刻:接收端读取数据位的时机。
  • 数据变化时刻:发送端改变数据位的时机。

模式0

SPI模式0
SPI模式0

模式1

SPI模式1
SPI模式1

模式2

SPI模式2
SPI模式2

模式3

SPI模式3
SPI模式3

Note

双线交叉表示传输一个Bit。 MISO为置于中间的一条线,表示高阻态,即断开。从此状态变为拉开的状态,表示从机被选中,允许开始通信。 所有数据传完后,MOSI变换电平是为了回到默认电平,如果没有默认电平也可以不变换。

多字节连续传输

SPI 可以非常容易地进行多字节连续传输。主设备只需在 CS 有效期间,持续产生 SCLK 时钟周期即可。每个 SCLK 周期传输一位数据。

image-20251126132030371
image-20251126132030371

五、 SPI 优缺点总结

优点 缺点
全双工通信,效率高 需要4根线,比 I2C 占用更多 GPIO
协议非常简单,硬件实现容易 无硬件应答机制,无法确认数据是否被成功接收
通信速度非常高,没有标准上限 无标准的寻址机制,需要大量独立的 CS 线连接多从机
通信过程由主设备完全控制,无需复杂的仲裁和同步 没有官方的标准协议,不同厂商设备可能有不同要求
数据传输结构灵活,没有固定的数据帧格式

六、 SPI 与 I2C 的快速对比

特性 SPI I2C
线数 4 线(CS, SCLK, MOSI, MISO) 2 线(SDA, SCL)
速度 高(通常 >10 Mbps) 中低速(标准模式 100kbps,快速模式 400kbps)
通信方式 全双工 半双工
拓扑 点对点、独立CS、菊花链 多主从、总线型、软件寻址
协议复杂度 简单 相对复杂(有起始、停止、应答位)
流控/应答 有(ACK/NACK 位)
硬件开销 主设备 CS 线随从设备数量增加 硬件资源固定