ARTICLE DETAIL

资讯详情

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

CAN总线错误帧排查指南:从协议机制到物理层实战定位

CAN总线错误帧排查指南:从协议机制到物理层实战定位 做车载总线调试这几年只要听到工程师说“总线上全是错误帧”我的第一反应永远是先别慌。错误帧不是故障本身而是CAN协议在替整个网络“拉警报”。ISO 11898里定义的CAN总线体系本身就带了一套完整的错误检测和恢复机制任何节点只要在收发过程中发现位电平、填充规则、CRC、帧格式或应答环节有问题就会向总线上打出一帧错误帧同时更新自己的错误计数器。这篇作为系列第一篇先把最常见、也最容易被误判的CAN错误帧类型和排查方向掰开揉碎讲清楚适合刚接触CAN通信的工程师也适合被偶发错误帧折磨过一阵子的人对照着定位问题。1. 先理解一件事错误帧到底在“报”什么1.1 不是所有丢帧都叫错误帧我见过不少新手把“接收不到报文”和“出现了错误帧”混为一谈。严格来说错误帧是CAN控制器在物理层和数据链路层发现异常后主动插入总线的一类特殊帧。它没有标准ID也不承载用户数据作用只有一个告诉总线上所有节点“刚才这轮通信有问题我不认可”。所以在CANoe或者示波器上看到Error Frame首先应该意识到这是控制器自己检测到异常后的正常反应而不是控制器坏了。真正需要关注的不是错误帧本身而是它背后的信息是哪一个节点产生的错误帧它检测到了哪一类错误错误是偶发还是持续如果是持续错误要么是物理层信号质量已经差到协议无法容忍要么是波特率或位时序配置不一致要么是有节点在不断破坏总线电平。拿不到这几个信息就急着换芯片、改线束大概率是在碰运气。还有一个常见误区以为错误帧会直接导致“某条报文丢了”。实际上CAN协议有错误恢复机制发现错误的节点会置错误标志其他节点收到后会自动丢弃当前报文发送节点会在总线空闲后尝试重发。所以短时间的偶发错误帧应用层不一定感知得到可一旦错误频繁到一定程度重发占据大量总线时间负载率飙升真正的数据才被挤掉。这也是为什么排查时不要只看“有没有丢报文”而要盯住错误帧的频次、类型和出现时机。1.2 拿到一个有错误帧的总线先看这三个指标拿到一个异常网络我建议先不要动示波器先通过CAN卡或诊断仪抓一下当前网络状态。这里最有用、也最容易被忽略的三个指标是错误帧出现频率、错误帧出现的时机、错误类型如果工具支持。频率是每秒几十帧的持续爆发还是几个小时偶尔闪一下持续爆发基本指向物理层或配置问题偶尔一下要往干扰和端子上想。时机是上电瞬间出现还是某个设备动作时出现还是跑起来才有这能直接缩小排查范围。类型很多上位机工具CANoe、CANalyzer以及部分国产CAN卡工具可以标记错误帧的具体错误类型比如CRC错误、格式错误、位错误等。不同类型背后的根因差异很大后面我会逐个展开。把这三个指标记录下来再去看波形效率会高很多。我最反感的是上来就拿着示波器到处戳戳了半天除了“有点毛刺”什么都说不出来。先让数据说话再让波形作证这个顺序别搞反。2. 错误帧是怎么产生的五类错误检测机制和状态机2.1 CAN协议如何发现“不对劲”CAN的容错设计可以类比成一个宿舍楼里的查寝制度每次发送都在公共区域总线广播所有住户节点都来核对信息谁发现记录对不上谁就有权喊停。具体来说CAN协议定义了五类错误检测机制任何节点只要命中其中一类就会启动错误帧流程位错误发送节点在发送一个位的同时会去监控总线上的实际电平。如果自己发“显性0”却看到总线上是“隐性1”就判定位错误。当然有两个例外仲裁期间发送隐性位时采样到显性位不算错因为这是仲裁机制的正常工作方式应答槽发送隐性位时被其他节点拉成显性也不算错因为这正是应答信号。填充错误CAN使用位填充规则连续发送5个相同电平的位之后必须插入一位反相电平作为填充位。接收节点如果在一段数据里连续看到6个相同电平就认为总线电平异常报告填充错误。这个机制保证了总线上的电平翻转足够频繁也方便接收节点恢复时钟。CRC错误发送节点会为每一帧算出一个15位CRC序列CAN FD里算法和长度会变接收节点收到后按相同算法重新计算比对不上就报CRC错误。CRC错误很能说明链路中数据被改变常见于干扰或信号畸变。格式错误CAN帧里有一些固定格式的位段比如CRC界定符、应答界定符、帧结束这些位段必须保持隐性电平。如果接收节点在这些固定位置采到显性电平就报格式错误。应答错误发送节点在ACK槽会等待接收节点拉一个显性电平作为应答确认。如果整个总线上没有一个节点应答比如目标节点没收到帧或者根本没上线发送节点就会报应答错误。2.2 主动错误帧与被动错误帧的差别错误帧本身不是等长的它有主动和被动两种形式。简单记主动错误帧是强壮节点在“大声抗议”被动错误帧是弱势节点在“小声嘀咕”。主动错误帧由6个显性位组成错误标志后面跟8个隐性位的错误界定符。因为显性位会覆盖总线上的其他电平所以哪怕是另一个节点正在发数据也会被这6个显性位打断。这样就保证了没有人能无视错误。被动错误帧则是6个隐性位加8个隐性位它不会强行打断其他节点的发送只能在总线空闲时表达“我认为刚才那帧不对”。一个节点到底发送主动还是被动错误帧取决于它自己的错误计数器值。这个由硬件自动维护的状态直接决定了节点的“话语权”。理解这一点对后续判断“肇事节点”特别重要如果在总线上看到大量被动错误帧说明那个报错节点的错误计数器已经过了128它已经进入了一种“带病运行”的状态问题往往就出在它自己身上。2.3 从错误主动到总线关闭计数器怎么蹦的经典CAN里每个节点都维护两个错误计数器发送错误计数器TEC和接收错误计数器REC。规则看起来繁琐但核心思想很粗暴成功就减失败就加加多就罚下场。具体来说节点接收一帧如果自己检测到错误REC加1如果自己是发送方检测到错误则TEC加8。成功发送或接收一帧TEC或REC会相应减1。当TEC或REC达到128节点就从错误主动降级为错误被动。此时节点仍能收发数据但发送的错误帧变成被动形式而且发送报文前还要额外等待一段“挂起”时间。当TEC继续累积到256以上节点进入总线关闭状态完全断开与总线的联系不再参与任何通信。总线关闭后节点需要等待协议规定的恢复时间通常是128个总线空闲位或者由软件主动复位恢复。为什么要花篇幅讲这套机制因为很多“某节点掉线”的故障本质就是错误计数器被灌满导致总线关闭而错误帧就是计数器上涨的过程记录。你在示波器上抓到的每一个错误帧都是节点状态变化的一个脚印。所以排查错误帧本质上是在看节点的“病历”而不是简单地把异常帧删掉。3. 常见错误帧触发场景物理层、配置层、逻辑层3.1 终端电阻缺失或阻值异常终端电阻是CAN总线物理层最基本、也最容易被忽略的一环。按照ISO 11898-2规范总线两端各需要一颗120欧姆电阻并联后直流阻抗约60欧姆。终端电阻的作用是吸收总线末端的信号反射防止反射波叠加在正常信号上造成电平畸变。判断方法很简单在断电状态下从任意一个节点接入点测量CAN_H和CAN_L之间的电阻。如果网络正常且只有两个终端测出来应该在60欧姆左右如果测到120欧姆说明只有一端有终端电阻如果测到接近0或者几十欧姆可能有线缆短路或并联了过多阻性负载。缺终端电阻的典型现象是短距离比如台架上1米、2米线通信一切正常一拉到整车上、线长增加错误帧开始偶发甚至频繁出现。因为反射波在长线上更明显叠加在差分信号上就会让采样点采集到错误的电平进而触发位错误或填充错误。我排查过的案例里至少有三分之一最后落在终端电阻上。3.2 波特率标称一致不代表位时序一致波特率不一致会导致错误帧这大家都知道。但很多人不知道的是即使两个节点波特率都写着“500kbps”也可能因为采样点位置不同、SJW同步跳转宽度设置不同在长帧或连续数据传输时产生采样偏差。CAN一个位的时间由同步段、传播段、相位缓冲段1和相位缓冲段2组成采样点就落在相位缓冲段1和2之间。计算公式通常是采样点 1 TSEG1/1 TSEG1 TSEG2其中TSEG1是传播段加相位缓冲段1的时间量子数TSEG2是相位缓冲段2的时间量子数。一般建议经典CAN采样点设置在75%到87.5%之间具体选多少取决于线缆长度和节点时钟偏差。采样点太靠前可能等不到信号稳定太靠后接近位末尾又容易撞上反射或下一位的跳变沿。SJW则决定了节点在收到跳变沿时最多能把采样点向前或向后移动多少个时间量子用来补偿各节点时钟的微小偏差。SJW设置过小抗时钟偏差能力弱设置过大又可能在干扰下误同步。这里没有万能答案但如果你发现错误帧只在某个固定ID的长数据帧上出现并且报的是位错误或填充错误建议优先检查这个ID对应发送节点的位时序配置而不是一上来就怀疑线束。3.3 线缆、连接器、共地问题CAN总线虽然设计成差分传输抗共模干扰能力比单端信号强但它的物理层并不是无懈可击。实际车上最容易出问题的几个地方CAN_H和CAN_L在连接器里接触不良、压接端子氧化、屏蔽层接地处理不当、节点之间地电位差过大。接触不良的典型表现是错误帧毫无规律按压线束时好转抖动线束时恶化。共地问题则更隐蔽如果两个节点各自的电源地电位差太大即使差分信号本身正常CAN收发器的共模输入范围也会被突破导致隐性电平被拉偏接收端采到不该采到的显性位。所以排查物理层时不要只盯着CAN_H和CAN_L两根线。把电源地、屏蔽地、连接器锁扣、端子退针都检查一遍。很多偶发错误帧最后都是“一个端子退了半截”导致的。还有一个容易被忽略的点如果节点通过长线供电大电流在电源线上产生的压降也会间接影响CAN收发器的地电位这种情况要给CAN收发器单独加滤波和去耦电容必要时用隔离收发器。3.4 干扰和EMC问题怎么看出是干扰干扰引起的错误帧和物理层接触不良有一个明显区别干扰通常是突发的、成片的且往往与某个动作相关。比如继电器吸合、电机转动、大功率负载切换的瞬间错误帧数量会明显上升然后恢复平静。从错误帧类型上看干扰导致的错误常以CRC错误和填充错误为主。原因是干扰叠加到差分信号上改变了采样点的电平数据位被读反接收端计算出来的CRC自然对不上。如果能在示波器上把错误帧前后波形抓下来往往能看到信号边缘有明显的振铃或毛刺。应对干扰的思路是标准的三板斧双绞线尽量保持绞合、屏蔽层单端可靠接地、在节点电源入口和CAN收发器附近增加必要的滤波和TVS保护。注意屏蔽层两端都接地在某些场合反而会形成地环路电流引入新的干扰这点要根据实际接地系统决定。3.5 节点软件逻辑导致的总线异常有时候总线上的错误帧并不是物理层问题而是某个节点的软件逻辑把自己“作”进了错误状态。常见的有两种一是某个节点在总线繁忙时没有正确等待总线空闲就试图发送反复触发位错误二是网络管理唤醒逻辑有漏洞节点上电后立即疯狂发送报文、抢占总线导致其他节点应答不过来。这类问题靠示波器很难一眼看出来需要结合CANoe或总线分析仪的“在线统计错误帧记录”功能看每个错误帧后面跟的是哪个ID的报文、错误帧是不是总跟在同一个节点发出的报文后面。如果错误帧和特定ID强相关十有八九是那个节点自身有问题而不是整个网络被干扰。还有一种更隐蔽的情况两个节点配置了相同的报文ID并且都处于发送状态。虽然CAN仲裁机制能保证同一时刻只有一个节点赢得总线但在两个节点都发送同一ID、数据不一致的场景下赢家会不断变化输掉的一方会反复重发导致总线负载异常。这时候错误帧不一定会大量出现但总线利用率会异常高并且同一ID的报文数据“左右横跳”应用层行为极其诡异。遇到这种问题优先检查整车的DBC或CAN矩阵里有没有ID重复的隐患。3.6 CAN FD对错误帧的特殊影响最后提一下CAN FD。如果网络里有节点工作在CAN FD模式数据段的波特率远高于仲裁段常见2Mbps甚至5Mbps这会带来两个额外风险一是数据段位时间更短对采样点精度和时钟偏差更敏感二是如果某个节点仍配置成经典CAN模式或者CAN FD收发器不支持相应速率总线上就会出现明显的不兼容错误。排查CAN FD错误帧时除了常规物理层检查还要额外确认所有支持CAN FD的节点其数据段波特率和采样点配置是否一致混合网络中经典CAN节点是否被正确配置为不干扰CAN FD帧ISO 11898-1规定经典CAN节点收到CAN FD帧时应发送错误帧除非启用了CAN FD容忍模式。很多CAN FD网络初期调试的“错误帧风暴”根本不是信号质量问题而是模式配置打架。4. 错误帧排查的实操方向从现象到根因的五个步骤4.1 让总线分析仪先“记账”别让示波器背锅如果有条件第一步永远是把CANoe、CANalyzer、PCAN或者国产CAN卡接到总线上开Error Frame统计功能跑一段时间拿到数据。注意这里要记录的不只是错误帧数量还要尽量记录错误帧对应的时间戳、总线上当时的最后一个正常帧ID、错误类型以及错误计数器变化趋势。这些数据看着枯燥但在后期对比排查时价值极高。比如你可以凭时间戳确认错误是发生在“发动机启动瞬间”还是“空调压缩机吸合瞬间”从而锁定干扰源也可以凭“错误帧紧跟哪个ID后面”把怀疑对象从整个网络缩小到某个节点。很多看起来玄乎的错误帧问题其实是被工程师用记录日志的方式“磨”出来的。4.2 示波器抓错误帧波形关键看四件事当分析仪确认错误帧存在后再用示波器抓物理层波形。不推荐一上来就抓因为错误帧是偶发的示波器触发条件不好设置抓半天也未必命中。正确做法是把示波器CH1接CAN_H、CH2接CAN_L有条件用差分探头更好触发方式设为CAN错误帧触发如果示波器支持或者边沿触发加足够长的预触发时间。抓到波形后我一般重点看四件事隐性电平CAN_H和CAN_L在隐性位时是否都回到2.5V左右如果某一路被拉偏可能存在共模问题或收发器故障。显性电平显性位时CAN_H是否到3.5V左右、CAN_L是否到1.5V左右差分幅度是否足够。幅度偏低会导致接收端采样裕量不足。位宽度一个显性位的实际时间宽度和理论值差多少是否在容差范围内。位宽偏了基本就是波特率或晶振偏差问题。错误帧形态能看到6个显性位连续出现主动错误帧还是6个隐性位被动错误帧。被动错误帧出现往往说明肇事节点的错误计数器已经过了128节点已经“病得不清”了。4.3 分节点接入法定位肇事者如果总线上节点很多一个高效的物理排查手段是“分节点接入法”先把所有非必要节点断开只保留两个节点和两个终端电阻确认通信干净然后一个一个把其他节点接回去每接一个跑一段时间的总线统计。当错误帧首次出现时最后一次接入的那个节点就是最大的怀疑对象。这个方法看起来笨但非常可靠尤其适合整车级或大型台架的总线。做的时候注意每接入一个节点都要重新确认终端电阻没有被破坏因为有些节点的CAN收发器内部自带分压电阻并联多了会改变总线直流阻抗反而制造出新的错误。另外拔插节点时一定要先断电否则热插拔产生的浪涌可能直接打坏收发器。4.4 从软件配置层面交叉验证物理层和节点都查过之后如果错误帧依然存在就要回头审视软件配置。我最常问软件工程师的几个问题CAN控制器的时钟源选对没有波特率分频是不是按芯片手册的时钟频率算的采样点配置是按多少百分比设的SJW设置为几CAN收发器的唤醒源和总线端子有没有复用错引脚有一类经典问题单片机主频用的内部RC振荡器精度只有±1%左右短帧通信勉强可以一旦传输长帧或者环境温度变化大时钟漂移就会让采样点越过位边界错误帧随之而来。这种场合要么换外部晶振要么在软件里把SJW调大、采样点后移要么降低波特率给系统多留点余量。4.5 排查顺序建议先物理层再配置层后逻辑层综合上面所有手段我一般给团队的排查顺序是电阻和线缆 波形和电平 波特率/位时序 干扰源 节点软件逻辑 应用层逻辑。物理层问题占比最高而且容易连带出配置层和逻辑层的“假象”所以请务必先排除物理层再谈其他。具体到某一天的时间分配我可能会花三分之一的时间做总线统计和现象记录三分之一做物理层测量剩下的时间做分节点和软件配置验证。如果一上来就怀疑某个节点换芯片、换收发器大概率会走弯路因为错误帧本身就是CAN控制器按协议工作的正常产物先搞清楚它为什么触发比急着换硬件重要得多。5. 高频错误帧现象速查表与踩坑笔记5.1 一表对照常见现象与优先排查动作这里整理一份速查表适合在现场快速对照。错误帧现象最可能原因优先排查动作上电瞬间批量错误帧节点初始化顺序不一致、总线竞争抢发调整各节点上电延时检查网络管理启动逻辑线束抖动后偶发错误帧连接器接触不良、端子退针重新插拔所有连接器检查压接质量某一固定ID后总跟错误帧该ID对应节点发送逻辑或硬件异常定位到节点单独测试该节点波形和配置某大功率负载运行时突发错误帧传导干扰或辐射干扰示波器抓干扰时刻波形检查屏蔽和滤波长帧8字节满载才出现错误帧位时序偏差、采样点裕量不足检查发送节点采样点、SJW、晶振精度错误帧频次持续上升直到节点离线错误计数器累积导致总线关闭读取故障节点错误计数器检查其收发流程混合CAN/CAN FD网络出现格式错误CAN FD配置不兼容检查经典CAN节点是否开启CAN FD容忍核对数据段波特率测量终端电阻为120Ω只有一端终端电阻补全另一端120Ω终端电阻5.2 我踩过的几个坑希望你不用再踩第一个坑是采样点。有一回在台架上两个ECU通信两根线短得很怎么看波形都漂亮但长数据帧偶发错误帧。测了两天最后发现是发送节点用默认寄存器值采样点被设到了90%多接收节点是75%两边对长帧尾部位的采样偏差被拉大一旦数据连续几个相同电平填充位稍有不稳就触发错误。把这个节点的采样点调到87.5%问题立刻消失。第二个坑是端子虚接。一辆样车偶发错误帧干扰、晶振、软件配置全查了一遍最后用放大镜看连接器里的CAN_H端子发现压接位置有个0.5毫米的裂纹。这种故障最坑因为静态测量电阻、电平都正常但只要车辆振动一下接触电阻就跳变错误帧就出来。第三个坑是“以为换芯片能救一切”。早期做售后支持时有工程师反复换CAN收发器换一个好两天过两天又复发。后来现场一测CAN_H和CAN_L之间的终端电阻有接近200欧姆因为终端电阻模块被前一个人拆掉后没装回去。换芯片只能解决芯片损坏的问题对于物理层缺失和配置错误换多少芯片都白搭。5.3 给排查者的一个工作习惯建议最后分享一个长期养成的习惯所有错误帧相关的问题排查前先备份当前网络配置和日志排查中每做一步改动就重新记录一次错误帧数量变化。不要凭记忆判断“改了之后好了”因为错误帧本来就是间歇性出现的很容易造成“改好了”的错觉过两天又复发。我在实际项目中会把错误帧问题当成一条探案线来走现象记录、假设、验证、排除每一步都有数据支撑。这个方法虽然听起来平实但比任何高级工具都管用。等这套流程形成肌肉记忆之后再复杂的CAN总线问题也能在几轮内锁定方向。这一篇先写到这里下一篇文章我们再展开CAN FD的波特率配置和采样点计算那是另一个大的坑区。
返回列表