ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CAN总线错误帧排查实战:从底层逻辑到ZCANPRO抓包定位

CAN总线错误帧排查实战:从底层逻辑到ZCANPRO抓包定位 1. CAN错误帧的底层逻辑与排查思路1.1 错误帧到底是什么为什么它比丢包更值得关注很多刚接触CAN总线的人会把错误帧和丢包混为一谈觉得反正都是数据没收到处理方式差不多。但实际调试下来你会发现丢包往往只是结果错误帧才是原因。CAN控制器在检测到位错误、填充错误、CRC错误、格式错误或应答错误时会主动在总线上发出一个错误帧强制打断当前传输。这个动作的本质是保护总线不被污染让所有节点都知道刚才那帧数据不可信。我见过太多现场问题表面上是“设备偶尔通信中断”抓包一看全是错误帧在刷屏。错误帧本身不是故障它是CAN协议自带的纠错机制。真正要命的是错误帧持续出现导致节点错误计数器不断累加最终把节点推到错误被动甚至总线关闭状态。一旦进入Bus Off这个节点就彻底从总线上消失了直到复位才能恢复。所以排查CAN问题的正确姿势是先看有没有错误帧再看错误帧的类型和分布规律最后反推是物理层、波特率还是协议配置的问题。ZCANPRO这类工具之所以被频繁使用就是因为它能把错误帧单独标出来还能统计错误类型比单纯看报文列表高效得多。1.2 五种错误类型对应的现场场景CAN协议定义了五种错误检测机制每种背后对应的现场问题差别很大。位错误通常是发送方在发送某一位时回读总线电平发现和自己发的不一致。这种情况在波特率不匹配、终端电阻缺失、线缆过长时特别常见。填充错误则是位填充机制被破坏连续5个相同电平后必须插入一个相反电平如果接收方没看到这个填充位就报填充错误。CRC错误说明数据在传输过程中被干扰了大概率是电磁环境恶劣或者屏蔽层没接好。格式错误一般出现在固定格式字段被破坏比如帧起始、仲裁场、控制场这些位置出现了非法电平。应答错误最直接发送方发完一帧后在ACK槽没有收到任何节点的应答说明总线上根本没有其他正常节点在听。实际排查时我习惯先看错误帧集中在哪个阶段。如果错误帧出现在仲裁场附近优先怀疑波特率和终端电阻。如果出现在数据场重点查屏蔽和干扰源。如果ACK错误频繁先确认总线上是不是只有一个节点在发或者接收节点的过滤器配置是不是把所有帧都过滤掉了。1.3 错误计数器与节点状态迁移CAN节点内部有两个错误计数器发送错误计数器TEC和接收错误计数器REC。这两个计数器的变化规则是协议硬性规定的理解它们能帮你判断问题严重程度。正常状态下TEC和REC都小于128节点处于错误主动状态可以正常收发并主动发错误帧。当TEC或REC超过127时节点进入错误被动状态此时它还能通信但发出的错误帧变成被动错误标志影响力减弱。当TEC超过255时节点进入Bus Off状态自动脱离总线。这里有个容易被忽略的细节错误被动的节点虽然还能收发但它的错误帧不再能主动打断总线这意味着如果总线上有一个坏节点持续干扰好节点可能先进入错误被动坏节点反而还在错误主动状态继续破坏。所以看到错误被动告警时不要只盯着这个节点要抓全总线数据看是谁在制造错误。2. 波特率与硬件层错误帧的高发区2.1 波特率不匹配为什么是头号嫌疑CAN总线没有时钟线所有节点靠位定时逻辑同步。每个节点根据自己的晶振和波特率配置来采样总线电平。如果两个节点波特率有偏差采样点就会逐渐漂移最终在某个位采样到错误电平触发位错误或填充错误。这种错误帧的特点是周期性出现而且随着通信时间延长越来越密集。波特率偏差的来源主要有三个晶振精度、分频配置错误、以及总线长度导致的信号延迟。晶振方面陶瓷谐振器便宜但精度差温漂能到0.5%以上而CAN协议要求总偏差控制在0.5%以内。所以工业现场我一般建议用晶体振荡器至少±30ppm那种。分频配置错误更常见特别是用DSP或MCU自带CAN控制器时BRP、TSEG1、TSEG2、SJW这几个参数算错一个波特率就偏了。以28379处理器DSP的CAN波特率设置为例它的CAN模块时钟来自系统时钟分频假设系统时钟150MHzCAN时钟预分频设为10得到15MHz的CAN时钟。要得到500kbps波特率需要每个位时间包含30个CAN时钟周期。然后把这30个周期分配给同步段、传播段、相位缓冲段1和相位缓冲段2。采样点通常设在75%到80%位置所以TSEG1加传播段大约占22到24个周期TSEG2占6到8个周期。SJW一般设2到4个周期用来吸收节点间的时钟偏差。这些参数算完之后最好用示波器实测一下位宽确认实际波特率和理论值一致。2.2 终端电阻与线缆拓扑的隐形影响CAN总线两端各需要一个120欧姆终端电阻这个大家都知道。但实际现场经常遇到的问题是电阻装了但装的位置不对或者阻值偏差太大。终端电阻的作用是吸收信号反射如果缺失或位置不对信号边沿会出现振铃接收节点可能在振铃期间采样到错误电平。我遇到过一个小型网络只有三个节点线缆不到两米有人觉得这么短不需要终端电阻。结果通信时好时坏抓包发现偶发位错误。后来在两端各加了一个120欧姆电阻错误帧立刻消失。原因是即使线缆很短信号在阻抗不连续点仍然会反射只是反射能量小平时不一定触发错误但在温度变化或电源波动时就可能越界。线缆拓扑方面CAN总线要求手拉手菊花链结构支线长度越短越好。如果做成星型拓扑每个分支都会产生反射支线越长反射越严重。一般建议支线长度不超过0.3米在1Mbps波特率下甚至要更短。如果现场必须做分支可以考虑用CAN集线器或者中继器但会增加成本和延迟。2.3 地偏移与共模干扰的排查方法CAN收发器是差分信号理论上对共模干扰有抑制能力但这个能力有上限。如果两个节点的地电位差太大超出了收发器的共模输入范围接收端就会误判电平。地偏移测试最简单的三个步骤是第一步用万用表测量各节点CAN_GND之间的直流电压差正常应该在毫伏级别如果超过1V就要警惕。第二步用示波器差分探头观察CAN_H和CAN_L对各自地的波形看共模电压是否在收发器允许范围内。第三步在通信最恶劣的时候测量因为地偏移可能随负载变化。注意事项方面测量时一定要用差分探头或者两个单端探头做数学运算不要直接用单端探头测CAN_H对地那样看到的是共模加差模的混合波形容易误判。另外如果发现地偏移超标优先检查接地系统不要急着换收发器。很多时候是设备接地不良或者地线环路导致的加一根粗地线或者改用隔离CAN收发器就能解决。3. 用ZCANPRO抓包定位错误帧的完整流程3.1 设备连接与基础配置ZCANPRO是周立功CAN盒常用的上位机软件使用前先确认CAN盒驱动装好设备管理器里能看到对应端口。打开软件后选择正确的设备类型和通道设置波特率。这里有个坑ZCANPRO的波特率设置界面有时候藏得比较深如果找不到加载波特率的地方检查一下是不是选了错误的设备模式。有些CAN盒支持CAN和CAN FD两种模式模式选错的话波特率选项会变。波特率设置建议直接用软件预设的常用值比如500k、250k、125k不要手动填自定义参数除非你非常确定分频计算没问题。如果现场设备波特率是非标的比如某些特殊行业用的特定速率那就需要手动计算并填入。填完之后先不要急着发数据让总线空跑一会儿观察错误计数器是否稳定。3.2 错误帧的捕获与过滤技巧ZCANPRO默认会把错误帧和正常报文混在一起显示看起来比较乱。我一般会先打开错误帧显示选项然后把过滤条件设成只看错误帧这样能快速判断总线上有没有问题。如果错误帧数量很少比如几分钟才一个那可能是偶发干扰先记录时间和环境条件。如果错误帧密集出现直接看错误类型统计ZCANPRO一般会分类显示位错误、填充错误、CRC错误等。抓包时建议同时开启时间戳和通道号方便后续分析错误帧和正常帧的时序关系。有时候错误帧总是跟在某个特定ID的报文后面那说明这个报文的发送节点可能有问题。还有一种情况是错误帧出现在特定时间点比如某个大功率设备启动时那就是电磁干扰导致的。3.3 报文解析与故障节点定位抓到错误帧之后下一步是定位是哪个节点制造的。CAN总线是广播式的错误帧本身不包含节点地址但可以通过错误帧出现的位置反推。如果错误帧紧跟在某个ID的报文之后那这个报文的发送方大概率是问题节点。如果错误帧出现在ACK槽说明接收方没有应答可能是接收节点没配置好过滤器或者接收节点本身故障。ZCANPRO的报文解析功能可以展开每一帧的位信息包括仲裁场、控制场、数据场和CRC场。如果怀疑是波特率问题可以对比发送方和接收方的位时间看采样点是否一致。如果怀疑是干扰可以看错误帧是否集中在某些位。我一般会先把可疑节点的报文单独过滤出来然后对比它和其他节点报文的错误率错误率明显高的那个就是重点排查对象。4. 常见错误帧场景与解决策略速查4.1 典型问题与排查路径对照表错误类型常见原因排查手段解决策略位错误波特率不匹配、终端电阻缺失、线缆过长示波器测位宽、万用表测终端电阻统一波特率、补装120欧姆电阻、缩短线缆填充错误位填充机制被破坏、强干扰抓包看连续相同电平位数检查屏蔽层、远离干扰源、加磁环CRC错误数据传输被干扰、收发器故障对比发送和接收数据、替换收发器改善接地、更换收发器、降低波特率格式错误固定格式字段被破坏、协议配置错误检查帧起始和仲裁场波形核对协议配置、检查节点初始化代码应答错误总线上无其他节点、接收过滤器配置错误确认节点数量、检查过滤器设置增加节点、修正过滤器、检查ACK槽波形这个表是我在实际项目中反复验证过的基本上覆盖了八成以上的错误帧场景。但要注意现场问题往往是复合型的比如波特率偏差加上地偏移可能同时触发位错误和CRC错误。这时候不要只盯着一个错误类型要综合看错误分布和总线环境。4.2 波特率校准的实操心得波特率校准这件事我的经验是不要迷信计算值一定要实测。计算只能保证理论正确但实际电路中晶振有偏差、收发器有延迟、线缆有传输时间这些都会影响最终采样点。我一般会用示波器抓一帧标准报文测量从帧起始到ACK位的时间然后反推实际波特率。如果实测值和理论值偏差超过0.5%就要调整分频参数。还有一个技巧是如果总线上有多个节点可以让每个节点单独发送其他节点只接收然后观察错误计数器。如果某个节点发送时错误率明显高说明这个节点的波特率配置有问题。反过来如果所有节点发送时错误率都高那可能是总线物理层的问题比如终端电阻或线缆。4.3 硬件层面的避坑清单硬件设计阶段有几个坑我踩过多次这里列出来供参考。第一CAN_H和CAN_L一定要走差分对等长、紧耦合不要分开走。第二终端电阻要放在连接器附近不要放在PCB中间否则电阻到连接器之间的走线也会产生反射。第三如果设备需要隔离用隔离CAN收发器不要只隔离电源不隔离信号那样地偏移照样会烧收发器。第四TVS管要选CAN专用的结电容要小否则会影响信号边沿。第五DB9针脚定义要确认清楚不同厂家的CAN盒DB9定义可能不同接反了通信不上还容易烧接口。4.4 软件配置中的隐蔽问题软件层面最常见的错误是过滤器配置。很多CAN控制器支持验收滤波器如果配置不当会把需要的报文过滤掉导致接收节点收不到数据发送节点收不到ACK从而触发应答错误。排查方法是先把过滤器设成全通模式确认通信正常后再逐步收紧。另一个隐蔽问题是中断处理如果CAN接收中断优先级太低或者中断服务程序执行时间太长可能导致接收溢出进而触发错误帧。这种情况在高速通信时特别明显建议把CAN中断优先级设高中断里只做数据搬运复杂处理放到主循环。5. 从错误帧到稳定通信的实战经验5.1 一个典型现场案例的完整复盘之前有个项目客户反馈设备运行几小时后通信中断重启后恢复反复出现。到现场后用ZCANPRO抓包发现错误帧从无到有逐渐增多最后节点Bus Off。错误类型以位错误和填充错误为主偶尔有CRC错误。先测终端电阻两端都是120欧姆正常。再测波特率用示波器看位宽发现实际位宽比理论值大了约2%。查配置发现这个节点的晶振是陶瓷谐振器温漂比较大设备运行一段时间后温度升高波特率偏移超出容限。解决方案是把陶瓷谐振器换成晶体振荡器同时把SJW从1个周期增加到3个周期增加对时钟偏差的容忍度。换完之后连续运行一周错误帧为零。这个案例说明波特率偏差不一定是配置错误也可能是器件选型问题。陶瓷谐振器在温度变化大的场合真的不能用省那几毛钱最后要花几倍代价去现场排查。5.2 错误帧预防的日常检查清单与其等出了问题再排查不如平时做好预防。我一般会在项目交付前做以下几项检查第一用示波器看总线波形确认上升沿和下降沿干净没有明显振铃。第二用ZCANPRO连续抓包至少一小时确认错误帧为零。第三测量各节点地电位差确保在100mV以内。第四检查所有连接器的针脚定义和紧固情况。第五确认所有节点的波特率和采样点配置一致。第六在设备满负载运行时再抓一次包因为负载变化可能引入新的干扰。这些检查看起来繁琐但比起现场故障排查成本低得多。特别是地电位差和波形检查很多问题在实验室就能发现不用等到现场。5.3 工具选型与使用建议CAN分析工具方面ZCANPRO配合周立功CAN盒是性价比比较高的组合适合中小型项目。如果预算充足可以考虑同星TSMaster功能更强大支持脚本和自动化测试。如果只是偶尔调试便宜的USB-CAN分析仪也能用但要注意驱动兼容性和软件稳定性。我试过几款低价分析仪有的在高速通信时会丢帧有的错误帧统计不准所以关键项目还是建议用靠谱的工具。软件方面如果你用Qt写CAN通信软件注意CAN接收线程和UI线程要分离否则UI卡顿会导致接收缓冲区溢出。还有CAN错误处理回调一定要实现不要只处理正常接收。很多闪退问题就是因为错误帧触发异常而代码里没有对应的错误处理逻辑。5.4 关于CAN FD的补充说明现在CAN FD越来越普及错误帧的表现和经典CAN有些差异。CAN FD的波特率分仲裁段和数据段仲裁段用标准波特率数据段用更高的波特率。这意味着错误帧可能出现在仲裁段也可能出现在数据段。排查时要注意区分如果错误帧集中在数据段优先怀疑数据段波特率配置和信号完整性。另外CAN FD的CRC多项式更长对干扰更敏感所以物理层要求更高。如果经典CAN能跑但CAN FD跑不了先检查线缆和终端电阻再检查收发器是否支持CAN FD。我个人在实际操作中的体会是CAN错误帧排查没有捷径就是“先物理层、再波特率、后协议层”的顺序。物理层没问题了波特率对上了剩下的就是软件配置和干扰处理。每次排查都记录错误类型和分布积累多了就能形成直觉看到错误帧模式就能猜到大概原因。最后再分享一个小技巧如果现场没有示波器可以用ZCANPRO的位时间分析功能它能显示每个位的采样点位置帮你判断波特率是否匹配。这个功能在紧急排查时特别有用。
返回列表