第10篇:《SPI高速通信出错排查:三根信号线不等长,建立时间不够》

📅 2026/7/1 2:40:55
第10篇:《SPI高速通信出错排查:三根信号线不等长,建立时间不够》
大家好我是老张。翻车记第十篇今天聊一个低速随便飞、高速要你命的故障SPI通信速率上来后数据随机出错。SPI在几MHz以下时杜邦线随便接、走线随便画几乎不可能出问题。但一上到10MHz、20MHz甚至更高各种妖蛾子就来了——数据偶尔错几个字节、某些板子正常某些不正常、常温正常高温出错。降速就没事提速就翻车。早年我做过一块数据采集板SPI跑20MHz常温老化72小时零误码一到高温测试数据就出错。查了两天才发现是SCK和MOSI走线差导致时序偏移高温下芯片内部延迟变化偏移量超过了采样窗口。今天这篇文章把SPI高速通信的时序问题、等长要求、排查方法一次讲清楚。目录一、翻车现场常温正常高温出错的SPI二、排查过程从怀疑芯片到锁定走线第一步抓波形看时序第二步查时序偏移的来源第三步交叉验证三、根因分析建立时间和保持时间的硬约束四、解决方案等长走线 串阻尼电阻改版Layout源端串联阻尼电阻改版后测试结果五、预防措施高速SPI设计的四条规则六、SPI通信出错排查流程七、SPI通信出错常见原因速查表八、本篇总结九、专栏收官一、翻车现场常温正常高温出错的SPI这块数据采集板的主控是STM32F407通过SPI以20MHz的速率读取外部高速ADC的数据。ADC型号是AD7980是一款16位逐次逼近型ADCSPI接口最大支持50MHz。样板在实验室常温下测试连续采集72小时数据全部正确。做过采样和FFT分析信噪比符合ADC规格书指标。一切都很完美。送去做高低温测试。高温箱设定60℃设备在里面跑数据采集。跑了大约半小时上位机显示数据偶尔出现尖峰——在连续的平滑波形上突然跳出一个离谱的值明显是数据位错误。错误率不高大约每十几万次采样出现一次。低温-20℃测试也出现了类似问题错误率更高大约每几万次采样一次。降速到10MHz高低温全部通过零错误。提回20MHz错误复现。信号质量问题。但问题出在哪二、排查过程从怀疑芯片到锁定走线第一步抓波形看时序示波器双通道同时抓SCK和MOSI的波形触发在SCK的上升沿ADC在SCK上升沿输出数据。常温下MOSI数据在SCK上升沿到来之前已经稳定稳定时间约3ns。ADC的数据手册要求数据在SCK上升沿之前至少2ns稳定建立时间t_setup2ns。3ns 2ns满足要求。所以常温正常。高温60℃下再抓同样的波形。MOSI数据在SCK上升沿之前稳定的时间从3ns缩短到了约1.5ns。1.5ns 2ns违反了ADC的建立时间要求。ADC输出的数据在SCK采样沿到来时还没稳定下来采样结果可能是前一bit的值也可能是中间电平数据出错。第二步查时序偏移的来源为什么高温下时序会变差两个可能来源来源一芯片内部延迟。ADC在高温下内部数字电路的延迟可能发生变化导致数据输出时刻相对于SCK略有偏移。看了ADC数据手册在-40℃到85℃范围内数据输出延迟的温度系数典型值0.1ns/℃从常温25℃到高温60℃变化35℃延迟变化约3.5ns。这个变化量足以把3ns的建立时间裕量吃掉。来源二PCB走线时序偏移。电信号在PCB走线上的传播速度约150mm/ns。如果SCK走线和MOSI走线长度不同时钟沿和数据到达的时间就有固定偏移。打开PCB文件一查——SCK走线长度约42mmMOSI走线长度约28mm相差14mm。14mm对应时序偏移约14/150≈0.093ns。不到0.1ns对20MHz周期50ns来说影响不大不是主要矛盾。但SCK走线是从MCU到ADCMOSI是从ADC回到MCU。两条路径的总长度要考虑双向。把MCU到ADC的SCK走线42mm加上ADC到MCU的MOSI走线28mm总差和单线差同样约14mm。第三步交叉验证在PCB上飞线把MOSI走线用漆包线加长让SCK和MOSI总走线长度一致。高温测试错误率从每十几万次一次降到了零。根因确认SCK和MOSI走线长度差在常温下不是问题但和芯片高温延迟漂移叠加后建立时间突破临界值数据出错。等长走线把PCB侧的时序偏移减小到可忽略全部裕量留给芯片内部的高温漂移系统通过高低温测试。三、根因分析建立时间和保持时间的硬约束SPI通信中数据在两个时钟沿之间传递。以ADC输出数据为例ADC在SCK的某个沿通常是上升沿更新数据到MOSIMCU在SCK的下一个沿通常是下降沿采样MOSI数据必须在采样沿到来之前的一段时间建立时间t_setup就已经稳定并且在采样沿之后的一段时间保持时间t_hold继续维持稳定。建立时间和保持时间加起来就是数据稳定窗口。所有影响数据和时钟到达时间差的因素——PCB走线长度差、过孔数量差、芯片内部延迟、温度漂移——都在蚕食这个稳定窗口。低速时窗口很宽裕随便造。高速时窗口窄任何一点额外偏移都可能让窗口关闭。四、解决方案等长走线 串阻尼电阻改版Layout把SCK和MOSI走线做严格等长长度差控制在1mm以内。1mm对应约6.7ps时序偏移对20MHz通信来说完全可忽略。MISO走线最好也做等长但MISO是MCU发数据给ADC方向不同等长要求相对宽松——不过做等长没坏处。CS片选线对等长要求最低正常走就行。源端串联阻尼电阻在SCK和MOSI的驱动端各串一个33Ω电阻抑制反射振铃。振铃如果出现在采样沿附近会让从设备误判时钟或数据。低速时振铃被淹没高速时振铃周期和时钟周期可比就可能惹事。改版后测试结果改版后SPI跑20MHz高低温箱-40℃到85℃循环测试72小时连续采集数据无错误。建立时间裕量从1.5ns提升到了约3.5ns等长贡献约0.1ns换驱动能力更强的GPIO配置贡献约1ns主要还是原板本身布局杂散电容贡献了时序偏移重新Layout优化了走线环境。五、预防措施高速SPI设计的四条规则规则一SCK和MOSI/MISO走线必须等长。10MHz以下长度差控制在5mm以内10~30MHz控制在2mm以内30MHz以上控制在1mm以内。这个“等长”指的是从芯片焊盘到芯片焊盘的总长度包括过孔的等效长度一个过孔约等效0.5~1mm走线。规则二高速SPI走线源端串阻尼电阻。22~100Ω通常33Ω或47Ω是最常用值。电阻紧贴驱动芯片引脚。规则三高速SPI走线之间用地线隔离间距至少2~3倍线宽。SCK是最强的干扰源它对MOSI和MISO的串扰会进一步恶化时序。规则四高低温测试是高速通信的试金石。常温通过不代表没问题芯片内部延迟的温度漂移会吃掉你的时序裕量。必须过高低温。六、SPI通信出错排查流程降速验证降速后正常、提速后出错说明是信号质量问题不是协议逻辑问题看波形示波器双通道同时抓SCK和MOSI/MISO确认数据和时钟的时序关系量建立/保持时间和芯片数据手册的t_setup/t_hold对比看是否违规查PCB走线长度SCK和数据线长度差是否超规范看振铃SCK边沿有没有严重振铃有就加阻尼电阻高低温复现温度变化是否触发或加重问题交叉验证飞线补偿长度差确认根因七、SPI通信出错常见原因速查表现象可能原因排查要点解决方法低速正常、高速出错时序裕量不足看建立/保持时间等长走线降速或改善驱动常温正常、高温出错芯片内部延迟温漂高低温箱复现测时序增加时序裕量等长/降速偶发单bit错误反射振铃看SCK边沿波形源端串阻尼电阻连续多bit错误串扰或地弹看相邻信号间的串扰拉大间距加地线隔离特定数据模式出错码间干扰发0xFF和0x00交替测改善信号完整性多从机切换时出错CS时序冲突看CS释放和SCK关系增加CS间死区时间八、本篇总结SPI高速通信出错根子在物理层不在协议层。降速能绕开问题但不能解决根本。等长走线、串阻尼电阻、高低温验证——这三板斧是高速SPI调试的标配。三个要点PCB走线长度差和芯片内部延迟漂移都在吃时序裕量高速时必须做等长高温是时序裕量的放大镜常温过不代表高温过示波器双通道同时看SCK和数据量建立/保持时间这是SPI调试的核心动作九、专栏收官到这里《嵌入式硬件翻车记》十篇文章全部写完。从LDO发烫到SPI时序每一篇都是老张亲身踩过的坑、烧过的芯片、加过的班。翻车不可耻同一个坑翻两次才可耻。我把这些翻车经历写出来就是希望能帮你少交一次学费。硬件调试这条路没有捷径但可以少走弯路。评论区永远开放随时来聊你遇到的硬件问题老张帮你分析。