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 线分时选通。
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 协议的数据传输流程遵循以下步骤:
- 片选拉低 — 主设备将目标从设备的 CS 线置为低电平,激活从设备。
- 时钟启动 — 主设备按设定频率输出 SCLK 时钟信号。
- 数据收发 — 每个时钟周期,主设备通过 MOSI 发送 1 bit,同时从设备通过 MISO 返回 1 bit。数据通常以 MSB 优先传输。
- 传输结束 — 主设备停止 SCLK,将 CS 拉高,释放从设备。
协议要点总结:
- SPI 是全双工协议,每时钟周期同时收发 1 bit。
- 没有内置应答(ACK)机制,可靠性由上层协议保证。
- 从设备数量仅受主设备 GPIO 片选引脚数量限制。
- 传输速率通常为 1–50 MHz,高速器件可达 100 MHz 以上。
- 数据帧长度通常为 8 位,但硬件支持任意长度(如 16 位、32 位)。