为什么 SPI 需要端接电阻:高速 SPI(≥10MHz)的信号质量问题

先问一个问题:你的 SPI 总线在 1MHz 跑得好好的,一提到 10MHz 以上就开始丢数据、错位、甚至死机?

我早年做过一个 12MHz 的 SPI 项目,板子回来之后,回读 Flash ID 每次都随机错。折腾了两天,最后拿示波器一看——波形简直没法看。这就是典型的 高速 SPI 信号完整性问题。

说白了,端接电阻不是玄学,而是给信号线装上「减震器」。下面我带你看看,不加端接到底会出什么妖蛾子。

高速 SPI 信号的三类典型畸变

当 SPI 时钟频率 ≥10MHz 时,信号波长已经可以和 PCB 走线长度相比。我习惯把波形畸变分成三种:

  • 过冲与下冲 —— 电压冲过头,超过芯片耐受范围,轻则误触发,重则烧 I/O 口。
  • 振铃 —— 信号上升/下降沿后来回震荡,像被拨动的琴弦。
  • 台阶(非单调性) —— 逻辑电平跳变中间卡顿一下,造成采样点误判。

关键数据指标:

  • 过冲幅度:超过 VIH + 0.5V 就算危险。
  • 振铃持续时间:超过 1/10 时钟周期就可能导致误采样。
  • 非单调区域宽度:必须小于 10% 的时钟周期。

为什么会这样?根源是阻抗不连续。驱动端 output impedance(约 20–50Ω)匹配不上 PCB 走线的 characteristic impedance(通常 50Ω 或 90Ω),更匹配不上接收端的输入阻抗(很高,≈ MΩ)。信号每经过一个阻抗突变点,就会反射一部分能量回来,叠加在原波形上。

典型波形畸变分析:一个 12MHz 案例

我曾接手过一个客户的 RMA 板子,SPI Flash 读数据偶尔出错。用示波器抓 SCLK 和 MISO,你猜看到了什么?

测量点理想波形实际波形后果
SCLK 驱动端方波,上升沿干净过冲 1.2V(3.3V 系统突到 4.5V)接收端误判额外时钟边沿
MISO 接收端每个 bit 稳定采样振铃 200mV,持续 15ns采样点落在振铃波谷,数据错位
CS 片选信号低电平平稳下冲至 -0.7VFlash 进入测试模式,状态机跑飞

我试着把示波器的波形截图下来,用肉眼就能看出:传输线效应已经彻底破坏了信号时序裕量。加了 33Ω 串联端接电阻后,过冲降到了 0.3V 以内,振铃几乎消失。

我个人的端接选择口诀:

  • 走线长度 < 1/10 信号波长 → 不需端接(低速短距)。
  • 走线长度 > 1/6 信号波长 → 必须端接。
  • 10MHz 时,在 FR4 上波长 ≈ 15 米,1/6 波长 ≈ 2.5 米。实际板内很少超过 0.5 米,所以 10MHz 还算安全?——不!上升沿谐波频率是时钟的 3–5 倍,实际谐波能到 50MHz,波长就缩到 4 米,1/6 波长 ≈ 0.7 米。很多板子走线 10cm 以上已经需要端接了。

端接电阻的角色:消除反射

下面这张图是我手绘的反射路径示意,帮你直观理解:

SPI 信号反射路径与端接电阻原理 驱动端 Zout ≈ 25Ω Rs 33Ω PCB 走线 Z₀ = 50Ω 接收端 Zin ≈ 10kΩ 未加端接:反射叠加 • 红色箭头:第一次反射(接收端高阻 → 全反射) • 青色箭头:二次反射(驱动端低阻 → 部分反射) • 来回多次,形成振铃和台阶 加入 Rs 后:阻抗匹配 • Rs + Zout ≈ Z₀(25Ω+33Ω ≈ 58Ω,接近 50Ω) • 接收端反射回驱动端的能量被 Rs 吸收 • 一次反射后即稳定,振铃大幅衰减 分压点

再补充一些我踩过的坑:

  • 串联端接(Rs) 最常用,放在靠近驱动端的位置,RS = Z₀ – Zout。一般取 22Ω ~ 33Ω。我之前用 33Ω 配合 50Ω 走线,效果不错。
  • 并联端接(RT) 在接收端对地或对电源接电阻,功耗大,SPI 多从机时很麻烦。我一般不推荐 SPI 上用。
  • RC 端接 可以兼顾功耗和波形,但要多加电容,占空间。

特别注意:

  • 端接电阻不能随便放!串联电阻一定要靠近驱动端引脚,越近越好。我曾见过设计把 Rs 放在 PCB 中间,结果反射从两端回来,波形更糟糕。
  • 多从机 SPI 总线(每个从机 CS 独立)——端接电阻只加在主机驱动端(SCLK/MOSI)和每个从机接收端(MISO)适当处理,不要给每个支路都乱加并联电阻,否则总线阻抗会压垮驱动能力。
  • 端接后信号幅度会降低(串联分压),所以 CMOS 输入阈值要预留裕量。我一般保证 VOH 仍大于 0.8×VCC。

最后说一句:10MHz 以上 SPI,端接不是可选项,是必选项。先拿示波器看波形,有振铃就加 Rs,没有也可以不加 (但如果走线长度超过 5cm,我建议你还是老老实实加上)。省掉一个电阻省两分钱,返工一次烧掉两天,这笔账你自己算。