SPI板内能跑,接根排线就错码,问题可能不在协议

2026.10.17 | 焜财商富 | 32935次围观

SPI板内能跑,接根排线就错码,问题可能不在协议

SPI在板内几厘米走线正常,一接排线、转接板或更长连线就开始偶发错码,这时别只反复改CPOL、CPHA。很多问题出在SCLK边沿太快、回流不好和反射上;哪怕时钟只有几MHz,边沿也可能已经快到要按传输线处理。

SPI有一种很折磨人的故障:短的时候什么都正常,线一加长就开始随机错。

降一点频率可能好一些,再降又不一定彻底消失。

软件把CPOL、CPHA、CS时序检查了很多遍,也没发现明显问题。

这种时候我会先看示波器,不再继续猜协议。

别被“只有几MHz”骗了

数字线会不会产生明显反射,不只看SPI Clock是多少MHz。

更关键的是IO边沿有多快。很多MCU、FPGA的GPIO上升沿只有几百皮秒到几纳秒,即使你把SPI设成1MHz,这个边沿本身仍然包含很高的高频成分。

板内几厘米时,传播延迟还不明显;换成几十厘米排线、转接线甚至更长电缆以后,走线已经不能简单当成一根理想导线。

wKgZO2rR2q-AaOTTAAFIIzYBBJw593.png

图1:实际SPI波形中的过冲和振铃,数字逻辑还能显示0/1,但模拟波形已经不干净。

最值得先盯的是SCLK

数据线上有一点振铃,有时系统还能跑。

SCLK不一样。如果反射造成的过冲、回摆刚好再次跨过输入门限,接收端可能把一个边沿看成两个边沿。

表现出来就是偶发多采一位、少采一位,最后整个字节都错。

所以抓SPI时不要只看逻辑分析仪的0和1。四通道示波器把CS、SCLK、MOSI、MISO一起抓下来,看接收端引脚附近的模拟波形,信息更多。

图2:边沿后的振铃如果再次跨过输入门限,时钟线尤其容易产生误触发。

串联电阻有用,但放错位置效果会差很多

常见做法是在驱动端串一个几十欧姆的小电阻,利用源端终端来把振铃压下来。

重点是“驱动端”。MOSI、SCLK、CS通常由主机驱动,电阻应靠近主机或真正输出这段线的Buffer;MISO由从机驱动,MISO的串联电阻就应该靠近从机。

不要因为四根线都叫SPI,就把四颗电阻整齐摆在MCU旁边。

阻值也不是越大越好。太大会让边沿变得过慢,Setup/Hold余量反而被吃掉。留22Ω、33Ω、47Ω这类可调位置,再结合实测选值通常更实际。

wKgZO2rR2rCAWlksAAEyMYoE9EQ653.png

图3:TI用户实测的高速数字线振铃,线长、负载和探测方式都会影响看到的结果。

图4:SPI经过较长线缆后,边沿会出现明显畸变和反射,时钟频率不高也不能忽略边沿速度。

如果排线已经很长,降频不一定是最彻底的办法

先保证信号旁边有连续GND回流,排线里最好让高速线和地合理交错,不要四根SPI挤在一起、地只放在最边上。

然后把线缩短、降低Drive Strength、加合适的Source Termination,再重新抓接收端波形。

如果距离已经到米级、环境干扰又大,就要承认一个事实:SPI本来就不是为长距离通信设计的。

这时候换成差分传输、隔离器带差分接口,或者把SPI转换成更适合长距离的总线,往往比继续在原线缆上补电阻更可靠。

板内能跑、接线就错,先看物理层。协议没变,信号到对面时的样子可能已经完全变了。

wKgZPGrR2rGANC9hAAFcV0azpR8195.png

图5:长互连的传输线仿真能看到明显的过冲、下冲和多次反射,简单RC并不是所有场景都适合。

声明:

本文由凡亿教育整理,转载请注明来源!