嵌入式从零开始(第四篇):极速先锋 —— SPI 总线精讲

张开发
2026/5/29 3:21:58 15 分钟阅读
嵌入式从零开始(第四篇):极速先锋 —— SPI 总线精讲
写在前面速度与引脚的博弈前两篇我们聊了 I2C —— 两根线挂几十个设备优雅但偏慢标准模式 100kbps快速模式 400kbps。如果我想驱动一块240×240 的彩色显示屏每秒刷新 30 帧一帧数据量就是240×240×2字节≈ 115KB算下来需要约3.5MB/s的带宽。I2C 就算跑 400kbps约 50KB/s也远远不够。这时候就需要请出SPISerial 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 和 CPHASPI 有一个让初学者头疼的地方四种模式。它们由时钟极性CPOL和时钟相位CPHA两个参数组合而成。CPOLClock Polarity空闲时 SCLK 的电平。CPOL 0空闲为低电平CPOL 1空闲为高电平CPHAClock Phase数据采样时刻。CPHA 0在 SCLK 的第一个跳变沿采样数据CPHA 1在 SCLK 的第二个跳变沿采样数据模式CPOLCPHA空闲时钟数据采样沿数据发送沿000低上升沿下降沿101低下降沿上升沿210高下降沿上升沿311高上升沿下降沿即CPHA0采样沿 第一个沿从空闲电平跳变的那条边CPHA1采样沿 第二个沿与第一个沿相反的那条边实际使用绝大多数 SPI 设备支持模式 0CPOL0, CPHA0或模式 3CPOL1, CPHA1。具体要看数据手册配置错误会导致通信失败。四、数据传输过程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 对比特性I2CSPI引脚数2SDA, SCL4至少一主一从时速度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 存储器如 W25Q64SPI 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 基础上发展出多线 SPIDual SPIMOSI 和 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 驱动过某个有趣的设备欢迎评论区分享你的故事系列导航第一篇嵌入式到底是什么第二篇串口江湖 —— UART、RS-232、RS-485番外篇波特率解析第三篇两线走天下 —— I2C 总线精讲第四篇极速先锋 —— SPI 总线精讲本文

更多文章