为什么 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.7V | Flash 进入测试模式,状态机跑飞 |
我试着把示波器的波形截图下来,用肉眼就能看出:传输线效应已经彻底破坏了信号时序裕量。加了 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 以上已经需要端接了。
端接电阻的角色:消除反射
下面这张图是我手绘的反射路径示意,帮你直观理解:
再补充一些我踩过的坑:
- 串联端接(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,我建议你还是老老实实加上)。省掉一个电阻省两分钱,返工一次烧掉两天,这笔账你自己算。