缘起:SPI 总线,其实你没那么陌生
做硬件工程师这么多年,要说哪种接口最常打交道,SPI 排前三。
它太常见了。ADC、DAC、传感器、显示屏控制器、存储器……你随便翻开一块 PCB,大概率能找到 SPI 的踪迹。但正因为它常见,很多人反而不怎么深究——不就是四根线吗?连上就能跑?
嗯,这里我要说一句:跑起来容易,跑稳了难。
尤其当你把时钟推到 20MHz、50MHz,甚至更高的时候,信号反射、串扰、时序违例全都会找上门来。我第一块高速 SPI 板子就吃过这个亏——示波器一看,时钟沿上全是振铃,数据采样直接翻车。
所以,这个课程我们从头聊起。先把基本功打扎实,后面遇到问题你才知道怎么下手。
什么是 SPI?一个字:快
SPI 的全称是 Serial Peripheral Interface,串行外设接口。名字挺长,但核心就三个特点:
- 全双工:发送和接收可以同时进行。不像 I²C,发完还得等回应。
- 同步:数据由主设备产生的时钟沿驱动,收发双方用同一个时钟节拍工作。
- 一主多从:一个主设备可以带多个从设备,通过片选信号切换。
说白了,SPI 就是主设备喊一声“开始”,然后按节拍把数据推出去,同时把从设备的数据接回来。简单、直接、高效。
SPI 的核心理念:主设备控制时钟,所有数据传输都以时钟为基准。时钟停了,通信就停了。
四线制信号定义——你得认清楚每一根
标准的 SPI 通信需要四根线。对的,就是这四根:
| 信号名 | 全称 | 方向 | 功能说明 |
|---|---|---|---|
| SCLK | Serial Clock | 主 → 从 | 由主设备产生,决定通信速率 |
| MOSI | Master Out, Slave In | 主 → 从 | 主设备发送数据给从设备 |
| MISO | Master In, Slave Out | 从 → 主 | 从设备回传数据给主设备 |
| CS (或 SS) | Chip Select / Slave Select | 主 → 从 | 低电平有效,选中目标从设备 |
名字各家厂商叫法可能不一样。比如 CS 也有叫 NSS、SYNC、CE 的。但管脚功能都一样:时钟、发、收、片选。
我个人习惯在原理图上把 MOSI 和 MISO 用颜色区分开,方便布线和排查。你想想看,板子回来之后,Debug 时一眼能看出信号流向,省不少时间。
小技巧:画原理图时,在 MOSI 和 MISO 的网络名后缀加上 _M 和 _S,比如 SPI_MOSI_M、SPI_MISO_S。这样 Layout 工程师和产线测试都很清楚方向。
主从模式——谁说了算?
SPI 总线是典型的“一主多从”结构。主设备控制一切:它产生时钟,它决定什么时候跟谁通信,它拉低哪个从设备的 CS 线。
关键点有两个:
- 同一时刻只有一个 CS 被拉低。主设备通过 CS 来选择当前跟谁对话。其他从设备必须释放 MISO 总线(通常为高阻态),不然会总线冲突。
- 从设备永远是“听命令”的。从设备自己不产时钟,也不主动发起通信。你可以把它想象成电话分机——主设备是总机,它拨号(拉低CS),你接听(响应数据)。
不过,市面上也有少数“多主”SPI 实现,但那属于定制方案,标准 SPI 里不鼓励这么做。我在项目中碰到过有人想用两根 CS 线做“伪双主”,结果时序乱成一团,最后还是老老实实加了一个 MCU。
注意:多个从设备共享 MOSI 和 MISO 线时,一定要确认从设备的 MISO 输出是否支持三态(高阻)。如果不支持,必须加外部门控或分路器,否则数据冲突会烧坏管脚。
通信速率——能跑多快,得看路况
SPI 没有官方限制的最高速率。你能跑多快,取决于三个因素:
- 主设备的 SCLK 输出能力。MCU或FPGA的 SPI 模块通常有频率上限,比如 50MHz、100MHz。
- 从设备能接受的最高时钟。每个器件的数据手册里都会写 Max SCLK Frequency,比如 W25Q64JV 支持 133MHz,而有些老式 ADC 只能到 20MHz。
- PCB 走线的信号完整性。这个最容易被忽略。速率越高,走线越长,反射和串扰越严重。
我做过的项目里,SPI 速率常见范围是这样:
| 应用场景 | 典型速率 | 说明 |
|---|---|---|
| 传感器读取(温度/压力) | 1 ~ 10 MHz | 数据量小,对速率不敏感 |
| ADC/DAC 数据采集 | 10 ~ 50 MHz | 分辨率越高,速率需求越大 |
| Flash/存储器读写 | 50 ~ 133 MHz | DDR 或 QPI 模式下还能更高 |
| 高速视频/图像传输 | 100 MHz+ | 需注意信号完整性,通常加匹配 |
你想想看,在一个 5cm 的板内跑 100MHz 的 SCLK,信号的上升沿可能只有 1ns。这时候 PCB 上的每一毫米走线、每一个过孔、每一个拐角都是重要因素。我们后面会专门花几章讲这个。
一句话总结:SPI 能跑多快,不是芯片说了算,是板子说了算。
SPI 的知识结构——我们先搭个框架
为了让你对本章内容有个整体概念,我画了一张结构图。它展示了 SPI 总线基础中几个核心知识之间的关系。
SPI 的时钟极性与相位——一个小麻烦
SPI 有一个很容易让人懵的概念:时钟极性 (CPOL) 和 时钟相位 (CPHA)。
CPOL 决定空闲时 SCLK 是高电平还是低电平。CPHA 决定数据是在上升沿采样还是下降沿采样。组合起来有四种模式:
| 模式 | CPOL | CPHA | 空闲时钟电平 | 采样沿 |
|---|---|---|---|---|
| 模式 0 | 0 | 0 | 低电平 | 上升沿 |
| 模式 1 | 0 | 1 | 低电平 | 下降沿 |
| 模式 2 | 1 | 0 | 高电平 | 下降沿 |
| 模式 3 | 1 | 1 | 高电平 | 上升沿 |
为什么说这个重要?因为主设备和从设备的模式必须一致。我曾经遇到过一个传感器,数据手册没写清楚默认模式,结果怎么调都读不到正确数据。最后用逻辑分析仪抓出来,才发现从设备工作在模式2,而我配置的是模式0。
避坑指南:同一个总线上如果挂了多个从设备,它们的模式必须相同。如果不同,你只能分时切换主设备的配置,或者加额外的信号转换。我建议在设计初期就确认所有器件的支持模式,尽量统一。
SPI 的优点与局限——没有万能的接口
SPI 不是完美的,但它非常适合很多场景。这里列个对比帮你看清楚:
| 特性 | SPI | I²C | UART |
|---|---|---|---|
| 传输速度 | 高 (100MHz+) | 中 (3.4MHz 最高) | 低 (通常 ≤ 10MHz) |
| 全双工 | 是 | 否 (半双工) | 是 |
| 从设备数量 | 每增加一个设备需额外 CS 线 | 地址寻址,只需两根线 | 点对点 |
| 硬件复杂度 | 中等 | 低 | 低 |
| 抗干扰能力 | 取决于 Layout | 中等 (开漏) | 中等 |
我个人习惯:需要高速率、大数据量时首选 SPI;如果只是偶尔读个传感器、对速率没要求,I²C 更省管脚。没有的好坏,只有合不合适的场景。
小结:这一章你得带走什么?
- SPI 是同步、全双工的接口,四根线各司其职。
- 主设备控制时钟和片选,从设备被动响应。
- 速率不是拍脑袋定的,要看主设备、从设备、PCB 三者配合。
- 时钟极性和相位必须配对,否则通信失败。
- 选型时考虑 SPI 的优缺点,别盲目用。