嵌入式从零开始(第四篇):极速先锋 —— SPI 总线精讲
写在前面:速度与引脚的博弈
前两篇我们聊了 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 的数据传输非常简单、高效:
- 主设备拉低 CS,选中目标从设备。
- 主设备在 SCLK 的每个时钟周期:
- 通过 MOSI 线发送 1 位数据(从最高位 MSB 或最低位 LSB 开始,看配置)
- 同时通过 MISO 线接收 1 位数据(从设备发送)
- 重复 8 次(或更多,取决于数据长度),完成一个字节/字的交换。
- 主设备拉高 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。
七、常见问题与注意事项
- 模式不匹配:SPI 设备常用的模式 0 和模式 3 容易混淆。检查数据手册的时序图,确认 CPOL 和 CPHA。
- 片选时序:有些从设备要求 CS 必须在数据传输前后有额外的建立/保持时间,需要微调。
- MISO 浮空:如果总线上只有一个从设备,且其 CS 未选中时 MISO 为高阻,主设备的 MISO 引脚应配置为上拉输入或浮空输入(外部上拉),避免读取到不确定电平。
- 数据位顺序:多数 SPI 设备使用 MSB First,但少数使用 LSB First(如某些音频编解码器)。配置时要核对。
- 全双工与半双工:部分 SPI 设备只支持单向(只读或只写),可以配置为只发送或只接收模式,释放另一根线做其他用途。
- 速度过快:高速 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 | 总结 | 读手册、写可维护代码、回顾 |
更多推荐
所有评论(0)