第5篇:《高速SPI走线:等长控制+阻抗匹配+串扰抑制三板斧》
大家好,我是老张。
上篇讲了覆铜的正确姿势,今天聊一个嵌入式画板最常碰到的高速信号问题:SPI走线。
SPI在低速的时候(几MHz以下),杜邦线随便飞、走线随便画,都能跑得好好的。但一上到10MHz、20MHz甚至更高,各种妖蛾子就来了——数据偶尔出错、某些板子正常某些不正常、温度一高就不行。这些问题用万用表量不通断根本发现不了,因为它们不是“通不通”的问题,是“信号质量”的问题。
今天这篇,老张用三个板斧把高速SPI走线讲清楚:等长控制、阻抗匹配、串扰抑制。文末附SPI Layout检查清单。
目录
一、为什么SPI跑高速就出问题?
二、第一板斧:等长控制
为什么需要等长?
等长要控制到什么程度?
怎么做等长?
三、第二板斧:阻抗匹配
什么是阻抗匹配问题?
什么时候需要做阻抗匹配?
怎么做:源端串联电阻
四、第三板斧:串扰抑制
串扰是什么?
串扰抑制三板斧
五、测量与验证:别用万用表,用示波器
六、翻车实录:10MHz SPI的“偶发误码”
七、SPI Layout检查清单
八、本篇总结
一、为什么SPI跑高速就出问题?
低速时,信号波长远远大于走线长度,整条走线上电压几乎同时变化,走线看作一根理想导线就行。但当频率升高,信号边沿变陡,走线就不能再看成简单的导线了——它是一根传输线。
传输线有两个关键特性:
信号传播有延迟:电信号在FR-4板材上传播速度约15cm/ns。如果两根走线长度不同,同一时钟沿发出的数据到达接收端的时间就不同。
阻抗不连续会反射:走线的特性阻抗如果和源端或负载端不匹配,信号会在端点之间来回反射,产生振铃。
SPI的问题,本质就是这两个因素叠加:时序偏移导致建立/保持时间不够,反射振铃导致误触发。
二、第一板斧:等长控制
为什么需要等长?
SPI通信中,主设备在SCK的某个边沿(通常是上升沿)发出数据,从设备在下一个边沿(通常是下降沿)采样数据。数据线MOSI上的信号必须在采样沿之前稳定下来,并且保持到采样沿之后。
如果SCK走线和MOSI走线长度相差很大,时钟沿到达从设备时,数据可能还在路上飞。从设备采到的就是错误的数据。
等长要控制到什么程度?
电信号在FR-4外层走线上传播速度约140~160mm/ns。保守取150mm/ns。1mm走线长度差对应的时间偏移约6.7ps。
SPI时钟周期和最大长度差的关系:
10MHz(周期100ns):长度差带来的时序偏移控制在周期的1/10以内比较安全,即10ns,对应约1.5mm长度差。放宽到1/5(20ns)约3mm。
20MHz(周期50ns):安全偏移5ns,对应约0.75mm。放宽到10ns约1.5mm。
50MHz(周期20ns):安全偏移2ns,对应约0.3mm。基本上要求严格等长。
老张的实战经验:
10MHz以下:SCK和MOSI/MISO长度差控制在5mm以内即可,大部分板子天然满足。
10~30MHz:控制在2mm以内。Layout时注意一下走线长度,必要时做蛇形绕线。
30MHz以上:控制在1mm以内,最好做严格等长。同时MISO和MOSI都要分别和SCK做等长。
怎么做等长?
第一步:在EDA软件里打开走线长度显示。立创EDA和KiCad都支持实时显示走线长度。
第二步:以SCK走线长度为基准。先走完SCK,记住它的长度。再走MOSI和MISO,让长度尽量接近SCK。
第三步:如果空间不够做等长,走蛇形线。蛇形线就是走线绕几个弯来增加长度。注意蛇形线的拐弯间距至少为线宽的3倍以上,避免相邻弯道之间的耦合影响阻抗。
注意:等长指的是从芯片焊盘到芯片焊盘的总长度,包括过孔。一个过孔大约等效0.5~1mm走线长度。如果你的数据线打了两个过孔而时钟线没打,长度差可能就超标了。
三、第二板斧:阻抗匹配
什么是阻抗匹配问题?
SPI信号在走线上传输,如果走线的特性阻抗和源端输出阻抗不匹配,信号会在两端之间来回反射,在波形上叠加振铃。
振铃如果幅度够大,可能在采样沿附近产生一个毛刺。从设备看到这个毛刺,可能把它当作一个额外的时钟脉冲,导致数据移位。
什么时候需要做阻抗匹配?
走线长度远小于信号上升沿对应的传播长度时(比如走线5cm,上升沿1ns对应空间长度约15cm),反射影响小,可以不做。
走线长度和上升沿空间长度可比时,反射就不可忽略。
SPI在10MHz以上,上升沿通常在1~3ns。15cm/ns对应上升沿空间长度15~45mm。如果SPI走线超过5cm,反射问题就要考虑了。
怎么做:源端串联电阻
最简单有效的方法:在驱动端(SCK和MOSI的发送端)各串联一个22Ω~100Ω的小电阻。
这个电阻的作用是吸收反射能量。信号从驱动端发出,经过串联电阻到达走线。如果远端有反射回来,反射能量到达源端时会被这个电阻消耗掉,不会再次反射。
电阻怎么取值?
典型走线特性阻抗约50~80Ω(取决于线宽和距地平面距离)。MCU输出阻抗通常十几到几十Ω。串联电阻加上MCU输出阻抗应该接近走线特性阻抗。
如果MCU输出阻抗约20Ω,走线特性阻抗约50Ω,串30Ω。
不确定的时候,用33Ω或47Ω作为起始值,测眼图看效果调整。
注意:串联电阻放在驱动端,紧贴驱动芯片引脚。不要放在接收端,也不要在走线中间。
四、第三板斧:串扰抑制
串扰是什么?
SPI通常有4根信号线:SCK、MOSI、MISO、CS。它们并排走线时,一根线上的高速跳变会通过寄生电容和互感耦合到旁边的线上。
SCK是频率最高的信号,每个时钟周期翻转两次。它对MOSI、MISO和CS的串扰是最强的。如果CS被SCK串扰出一个毛刺,从设备就可能误触发。
串扰抑制三板斧
第一斧:拉大间距
SPI信号线之间的间距,至少为线宽的2~3倍。如果线宽10mil,间距至少20~30mil。比普通信号线的间距大得多。
第二斧:地线隔离
在SCK和MOSI之间、MOSI和MISO之间,插入一根接地走线。这根地线两端打过孔到地平面,有效吸收电场耦合。地线隔离能减少60%~80%的串扰。
如果空间充裕,在SPI总线两侧各放一根地线,效果更好。
第三斧:避免长距离并行
如果SPI走线必须穿越整块板子,不要让四根线并排从头走到尾。SCK和MOSI可以走在不同层,或者在不同区域换层分散走。长距离并行是串扰的重灾区。
五、测量与验证:别用万用表,用示波器
SPI信号质量不能用万用表量。万用表只能告诉你电压平均值对不对,看不到振铃、看不到时序偏移、看不到串扰毛刺。
正确工具:示波器,带宽至少100MHz,最好200MHz以上。
探头选择:x10探头,配合接地弹簧针。
x1探头输入电容大,接到信号线上直接改变信号特性。x10探头输入电容小,对信号影响小。接地弹簧针把探头的接地回路缩到最短,避免地线夹子的长引线引入振铃——你测出来的振铃是探头引入的,不是真实信号,排查方向就被误导了。
看什么:
先看SCK波形,有没有振铃、过冲、上升沿是否陡峭。
再看MOSI和SCK的时序关系,用双通道同时看,确认数据在采样沿之前已经稳定。
如果示波器支持眼图功能,直接开眼图看眼宽和眼高。眼图分析的具体方法,老张在面试题专栏的第7篇详细写过,需要的话可以翻过去对照看。
六、翻车实录:10MHz SPI的“偶发误码”
早年老张画过一块数据采集板,MCU通过SPI以10MHz读取外部ADC。样板回来测试,大部分时间正常,但每几万次读取会出一个错误数据。降速到5MHz就完全正常。
用示波器看SCK波形,发现上升沿有一小段振铃,幅度约0.8V。这个振铃在SCK的半个周期后刚好落在ADC的采样窗口附近,如果振铃的毛刺正好被ADC当成时钟沿,数据就多移了一位。
查Layout,SCK走线8cm长,源端没串阻尼电阻。在MCU的SCK引脚处串了一个33Ω电阻,再测波形,振铃消失。10MHz下再也没出过误码。
教训:SPI上了10MHz,走线超过5cm,老老实实在源端串阻尼电阻。一颗几分钱的电阻,能省你几天的调试时间。
七、SPI Layout检查清单
等长检查
SCK和MOSI长度差是否在允许范围内?
SCK和MISO长度差是否在允许范围内?
过孔数量是否计入长度计算?
阻抗匹配检查
走线长度超过5cm且速率10MHz以上时,是否在驱动端串联了阻尼电阻?
阻尼电阻是否紧贴驱动芯片引脚?
串扰抑制检查
SPI信号线间距是否达到2~3倍线宽?
是否用地线隔离了SCK和MOSI/MISO?
是否避免了四根线长距离并行?
测量验证检查
是否用示波器看过SCK波形,确认无严重振铃?
是否用双通道看过SCK和MOSI的时序关系?
测量时是否用了x10探头和接地弹簧针?
速率-长度参考表
| SPI速率 | 最大走线长度差 | 建议串阻 | 是否需要地线隔离 |
|---|---|---|---|
| <5MHz | 10mm | 可不加 | 建议 |
| 5~15MHz | 5mm | 33~47Ω | 建议 |
| 15~30MHz | 2mm | 22~33Ω | 强烈建议 |
| >30MHz | 1mm | 22~33Ω | 必须 |
八、本篇总结
高速SPI走线三板斧:
等长控制:SCK、MOSI、MISO走线长度尽量一致。10MHz以下差5mm,20MHz差2mm,30MHz以上差1mm以内。
阻抗匹配:走线超过5cm就在驱动端串22~100Ω电阻,吸收反射振铃。
串扰抑制:线间距拉大到2~3倍线宽,地线隔离SCK,避免长距离并行。
下篇预告:《DC-DC Layout核心:输入回路面积最小化,远离模拟区》——讲解开关电源Layout的黄金法则。
有用的话,收藏一下。下次画SPI走线时翻出检查清单逐条对照。评论区说说你的SPI最高跑过多少MHz,出过什么奇怪问题,老张帮你分析。
