缘起: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 没有官方限制的最高速率。你能跑多快,取决于三个因素:

  1. 主设备的 SCLK 输出能力。MCU或FPGA的 SPI 模块通常有频率上限,比如 50MHz、100MHz。
  2. 从设备能接受的最高时钟。每个器件的数据手册里都会写 Max SCLK Frequency,比如 W25Q64JV 支持 133MHz,而有些老式 ADC 只能到 20MHz。
  3. 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 总线通信系统 四线制信号定义 主从模式 通信速率 时钟极性与相位 本章核心知识点 协议简介 · 四线定义 · 主从架构 · 速率范围 为后续信号完整性分析打下基础

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 的优缺点,别盲目用。