1. SPI 总线概述

1.1 SPI 总线历史

SPI(Serial Peripheral Interface,串行外设接口)由 Motorola 公司在 20 世纪 80 年代中期提出,最初用于 MC68000 系列微控制器与外围芯片之间的短距离、高速同步通信。与同期流行的 I²C 总线相比,SPI 采用全双工、主从架构,没有标准化的地址寻址机制,而是通过片选(Chip Select, CS)信号直接选择从设备。这种设计使得 SPI 在吞吐量、信号延迟和协议开销方面具有明显优势,迅速成为嵌入式系统中传感器、ADC/DAC、存储器(Flash/SRAM)、显示驱动、无线收发器等外设的首选接口。

SPI 从未被标准化为 IEEE 或 ISO 国际标准,但因其简单、高效、硬件实现成本低,事实已成为业界最广泛使用的板级同步串行总线之一。Linux 内核自 2.6 版本起引入 SPI 子系统框架,设备树(Device Tree)在 PowerPC 和 ARM 架构普及后成为描述 SPI 控制器与从设备拓扑关系的主要手段。

关键时间节点:
  • 1985 年 — Motorola 首次定义 SPI 协议,用于 MC68HC11 系列。
  • 2000 年代初 — SPI 成为嵌入式 Linux 标准外设接口。
  • 2007 年 — 设备树规范 v1 发布,SPI 节点绑定正式纳入 ePAPR 标准。
  • 2010 年后 — 多线 SPI(Dual/Quad SPI)在 NOR Flash 领域广泛应用。

1.2 SPI 总线物理层特性

SPI 总线在物理层使用 4 条基本信号线(全双工模式),外加每个从设备独立的片选线。下表总结了标准 SPI 物理层的关键参数:

信号线 名称 方向(主→从) 功能描述
SCLK 串行时钟 主→从 由主设备产生,决定数据传输速率和时序
MOSI 主出从入 主→从 主设备发送数据到从设备
MISO 主入从出 从→主 从设备发送数据到主设备
CS/SS 片选/从选择 主→从 低电平有效,选中特定从设备进行通信
物理层注意事项: SPI 没有定义最大传输距离和总线电容负载标准。实际工程中,板级 SPI 通常工作在 1–50 MHz,走线长度控制在 10 cm 以内;超过 20 cm 需考虑信号完整性,建议加串联电阻或使用差分 SPI(如 TI 的 LVDS SPI)。

SPI 物理层还支持以下变体:

  • 3 线 SPI — 将 MOSI 和 MISO 合并为一条双向数据线(SDA),适用于引脚受限场景。
  • Dual/Quad SPI — 使用 2 条或 4 条数据线并行传输,常见于高速 SPI NOR Flash。
  • 多从设备共享总线 — 所有从设备共享 SCLK、MOSI、MISO,通过独立 CS 线分时选通。
SPI 总线物理连接拓扑(单主多从) SPI 主设备 (SoC / MCU) 从设备 1 (传感器) 从设备 2 (ADC) 从设备 3 (Flash) SCLK MOSI MISO CS1 CS2 CS3 信号说明 • SCLK:时钟,主设备驱动 • MOSI:主出从入数据线 • MISO:主入从出数据线 • CSx:片选,低电平有效

1.3 SPI 总线协议基础

SPI 协议是一种同步、全双工、主从通信协议。每次数据传输由主设备驱动 SCLK 时钟并同时通过 MOSI 发送数据,从设备则在同一时钟沿通过 MISO 返回数据。协议的核心参数包括时钟极性(CPOL)和时钟相位(CPHA),两者组合定义 4 种 SPI 模式:

SPI 模式 CPOL CPHA 时钟空闲电平 数据采样沿 典型应用
模式 0 0 0 低电平 上升沿采样 大多数 SPI 传感器、ADC
模式 1 0 1 低电平 下降沿采样 部分 Microchip 外设
模式 2 1 0 高电平 下降沿采样 某些 NXP 器件
模式 3 1 1 高电平 上升沿采样 SPI Flash、SD 卡
常见配置陷阱: 主设备和从设备的 SPI 模式必须一致,否则数据采样沿错位会导致通信失败。在设备树中通过 spi-cpol 和 spi-cpha 属性指定模式,默认值为模式 0。

SPI 协议的数据传输流程遵循以下步骤:

  1. 片选拉低 — 主设备将目标从设备的 CS 线置为低电平,激活从设备。
  2. 时钟启动 — 主设备按设定频率输出 SCLK 时钟信号。
  3. 数据收发 — 每个时钟周期,主设备通过 MOSI 发送 1 bit,同时从设备通过 MISO 返回 1 bit。数据通常以 MSB 优先传输。
  4. 传输结束 — 主设备停止 SCLK,将 CS 拉高,释放从设备。
SPI 模式 0 时序图(CPOL=0, CPHA=0) CS CS 拉低 CS 拉高 SCLK ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ 采样 采样 采样 采样 采样 采样 采样 采样 MOSI bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 MISO bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 模式 0:空闲时钟为低电平,数据在上升沿采样,下降沿切换
协议要点总结:
  • SPI 是全双工协议,每时钟周期同时收发 1 bit。
  • 没有内置应答(ACK)机制,可靠性由上层协议保证。
  • 从设备数量仅受主设备 GPIO 片选引脚数量限制。
  • 传输速率通常为 1–50 MHz,高速器件可达 100 MHz 以上。
  • 数据帧长度通常为 8 位,但硬件支持任意长度(如 16 位、32 位)。