写在前面:速度与引脚的博弈

前两篇我们聊了 I2C —— 两根线挂几十个设备,优雅但偏慢(标准模式 100kbps,快速模式 400kbps)。如果我想驱动一块 240×240 的彩色显示屏,每秒刷新 30 帧,一帧数据量就是 240×240×2(字节)≈ 115KB,算下来需要约 3.5MB/s 的带宽。I2C 就算跑 400kbps(约 50KB/s)也远远不够。

这时候,就需要请出 SPI(Serial Peripheral Interface,串行外设接口)了。

SPI 由摩托罗拉在 1980 年代发明,是一种同步、全双工、主从式的串行总线。它的口号是:“给我四根线,还你一片高速天地。”


一、物理层:四线定乾坤

SPI 使用 4 根信号线(全双工模式下):

信号名 方向 作用
SCLK 主 → 从 时钟线,由主设备产生
MOSI 主 → 从 Master Out Slave In,主设备数据输出,从设备数据输入
MISO 从 → 主 Master In Slave Out,从设备数据输出,主设备数据输入
CS(或 SS) 主 → 从 Chip Select,片选线(低电平有效),选中某个从设备

关键点:SPI 是全双工的,MOSI 和 MISO 可以同时传输数据,互不干扰。这也是它比 I2C 快的重要原因之一(I2C 的 SDA 线是半双工的)。


二、一主多从的两种连接方式

SPI 总线上只能有一个主设备(通常就是我们的 MCU),但可以挂多个从设备。

方式1:独立片选(常用)

每个从设备有独立的 CS 线,主设备用不同的 GPIO 引脚分别控制。

  • 优点:可以任意选择从设备,互不干扰。
  • 缺点:从设备多了,引脚占用也线性增长。
主设备                   从设备1                   从设备2
SCLK  ───────────────── SCLK   ───────────────── SCLK
MOSI  ───────────────── MOSI   ───────────────── MOSI
MISO  ───────────────── MISO   ───────────────── MISO
CS1   ────────────────────┘
CS2   ─────────────────────────────────────────────┘

方式2:菊花链(较少用)

多个从设备的 MISO 和 MOSI 串联成链,共用一个 CS。

  • 优点:节省引脚。
  • 缺点:数据需要级联传输,延迟增加;且要求从设备支持菊花链。
    嵌入式开发中,独立片选最为常见。

三、四种工作模式(CPOL 和 CPHA)

SPI 有一个让初学者头疼的地方:四种模式。它们由 时钟极性(CPOL)时钟相位(CPHA) 两个参数组合而成。

  • CPOL(Clock Polarity):空闲时 SCLK 的电平。

    • CPOL = 0:空闲为低电平
    • CPOL = 1:空闲为高电平
  • CPHA(Clock Phase):数据采样时刻。

    • CPHA = 0:在 SCLK 的第一个跳变沿采样数据
    • CPHA = 1:在 SCLK 的第二个跳变沿采样数据
模式 CPOL CPHA 空闲时钟 数据采样沿 数据发送沿
0 0 0 上升沿 下降沿
1 0 1 下降沿 上升沿
2 1 0 下降沿 上升沿
3 1 1 上升沿 下降沿

  • CPHA=0:采样沿 = 第一个沿(从空闲电平跳变的那条边)
  • CPHA=1:采样沿 = 第二个沿(与第一个沿相反的那条边)

实际使用:绝大多数 SPI 设备支持 模式 0(CPOL=0, CPHA=0)或 模式 3(CPOL=1, CPHA=1)。具体要看数据手册,配置错误会导致通信失败。


四、数据传输过程

SPI 的数据传输非常简单、高效:

  1. 主设备拉低 CS,选中目标从设备。
  2. 主设备在 SCLK 的每个时钟周期:
    • 通过 MOSI 线发送 1 位数据(从最高位 MSB 或最低位 LSB 开始,看配置)
    • 同时通过 MISO 线接收 1 位数据(从设备发送)
  3. 重复 8 次(或更多,取决于数据长度),完成一个字节/字的交换。
  4. 主设备拉高 CS,结束通信。

核心特性:SPI 的发送和接收是同步进行的。每发送一个位,就会同时接收一个位。所以,即使你只想接收数据(比如读取传感器),你也必须发送一些“虚拟数据”(通常为 0xFF 或 0x00)来提供时钟,从设备才会把数据送出来。


五、速率与优势

SPI 没有像 I2C 那样的标准速率限制,速度取决于:

  • 主设备能产生的最大 SCLK 频率
  • 从设备支持的最高频率
  • 总线电容和布线质量

常见速率:几 MHz 到几十 MHz,甚至上百 MHz(如 QSPI、OCTOSPI)。
STM32 的 SPI 外设通常可以跑到 fPCLK/2,比如系统时钟 72MHz 时,SPI 可达 36MHz。

与 I2C 对比

特性 I2C SPI
引脚数 2(SDA, SCL) 4(至少,一主一从时)
速度 100k/400k/3.4M 几 M 到几十 M
全双工 否(半双工)
多从机 是(地址寻址) 是(片选线)
应答机制 有 ACK/NACK 无(需要上层协议)
通信开销 每字节有起始/停止/应答 无额外开销
典型应用 传感器、EEPROM 显示屏、SD卡、音频、ADC

简单总结

  • I2C 适合低速、多设备、引脚紧张的场景。
  • SPI 适合高速、实时、引脚不太紧张的场景。

六、典型应用场景

1. 驱动 OLED/LCD 显示屏

很多 SPI 接口的显示屏(如 SSD1306、ILI9341)只需要几根线,刷新率远高于 I2C。

2. SD 卡(SPI 模式)

SD 卡支持两种通信协议:原生 SD 协议(4 位并行)和 SPI 模式。嵌入式常用 SPI 模式,只需要 4 根线即可读写文件(配合 FATFS 文件系统)。

3. 外部 ADC / DAC

高速数据采集(如音频、示波器前端)需要 SPI 来传输采样数据。

4. 外部 Flash 存储器(如 W25Q64)

SPI Flash 常用于存储字库、图片、固件升级包,读取速度可达几十 MB/s。

5. 各种传感器(加速度、陀螺仪、磁力计)

许多传感器同时支持 I2C 和 SPI,追求速度时选 SPI。


七、常见问题与注意事项

  1. 模式不匹配:SPI 设备常用的模式 0 和模式 3 容易混淆。检查数据手册的时序图,确认 CPOL 和 CPHA。
  2. 片选时序:有些从设备要求 CS 必须在数据传输前后有额外的建立/保持时间,需要微调。
  3. MISO 浮空:如果总线上只有一个从设备,且其 CS 未选中时 MISO 为高阻,主设备的 MISO 引脚应配置为上拉输入浮空输入(外部上拉),避免读取到不确定电平。
  4. 数据位顺序:多数 SPI 设备使用 MSB First,但少数使用 LSB First(如某些音频编解码器)。配置时要核对。
  5. 全双工与半双工:部分 SPI 设备只支持单向(只读或只写),可以配置为只发送或只接收模式,释放另一根线做其他用途。
  6. 速度过快:高速 SPI 时,注意 PCB 走线长度匹配,避免信号反射;必要时串联电阻(22Ω~33Ω)抑制过冲。

八、SPI 的变种:QSPI、OSPI

为了进一步提高速度,芯片厂商在传统 SPI 基础上发展出多线 SPI

  • Dual SPI:MOSI 和 MISO 都作为双向数据线(2 位并行),速率翻倍。
  • Quad SPI (QSPI):使用 4 条数据线(IO0~IO3),常用于 SPI Flash,可达 100+ MB/s。
  • Octal SPI (OSPI):8 条数据线,更快。

STM32 的一些系列(如 F4、H7)内置了 QSPI 控制器,可以直接以内存映射方式读写外部 Flash。


九、总结

SPI 是嵌入式世界里的“速度担当”:

  • 四线制:SCLK、MOSI、MISO、CS(全双工)。
  • 同步、主从式:主设备产生时钟,片选从设备。
  • 四种模式:由 CPOL 和 CPHA 组合,常用模式 0 和 3。
  • 无应答机制:速度快,但可靠性需要上层协议保证。
  • 一主多从:独立 CS 线。
  • 典型应用:显示屏、SD 卡、外部 Flash、高速传感器。

与 I2C 的取舍

  • 引脚多、速度要求高 → SPI
  • 引脚少、挂多个设备、速度要求不高 → I2C

下一篇,我们将进入 中断与事件驱动 —— 告别 while(1) 轮询,让你的 CPU 学会“按需工作”。

如果你曾被 SPI 模式搞疯过,或者用 SPI 驱动过某个有趣的设备,欢迎评论区分享你的故事!


系列全篇快速索引:

篇目 标题 核心关键词
1 嵌入式到底是什么? LED、时钟、GPIO、ARM vs C51 vs STM32
2 串口江湖 UART、RS-232、RS-485、TTL
番外 波特率解析 波特率、比特率、晶振分频
3 两线走天下 I2C、开漏、上拉、地址、应答
4 极速先锋 SPI、四线、CPOL/CPHA、全双工
5 嵌入式大脑 中断、NVIC、ISR、事件驱动
6 时间管理大师 定时器、PWM、输入捕获、SysTick
7 存储与地址 内存映射、大小端、4GB 寻址
8 从裸机到 RTOS 任务、调度、FreeRTOS、优先级
9 任务间悄悄话 队列、信号量、互斥量、IPC
10 位运算的艺术 &、
11 芯片选型 STM32 vs ESP32、选型框架
12 调试与工具链 printf、调试器、逻辑分析仪
13 总结 读手册、写可维护代码、回顾
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐