摘要
:CAN的BusOff源于错误帧的积累,而错误帧这个东西,是一个接收节点 认为数据有误 故意打断通信,好让发送节点感知到 并重发报文的设计。注意这里边有个“我觉得你有病”的认知陷阱,让CAN的诊断变得近似玄学。本文
分享一种用CAN波形的幅度和脉宽信息来精确定位错误帧来源的方法,
来自知乎的大灯
。

一、CAN物理层
也就是CAN收发器干了啥?

一个典型的双节点CAN网络的物理层等效电路如上图,两颗120Ω终端电阻并联呈现总线电阻60Ω。黑框里是A、B两个节点的 CAN收发器(Transceiver),它只负责电平转换。当总线静默时,收发器内部的2.5V电源经15KΩ电阻把CAN-H和CAN-L都拉到2.5V,总线这个状态称之为隐性 。当节点A想要驱动总线的时候(TX=0),它同时把内部的上下两个MOS管导通,整个网络的电流流向:节点A的5V电源经二极管、24Ω、两颗终端电阻并联、24Ω、二极管回到节点A的地,总线这个状态称之为显性。 CAN总线上的电压实际上就是终端电阻的分压 。从节点B来看,CAN-H就变成3.5V,CAN-L变成1.5V,拉出了总线 H - L = 2V 的差分电压,大于0.7V的判断阈值, 节点B就认为收到了一个显性(RX=0) 。大家可以算一下分压值以增强记忆,后边会用到。
反直觉知识点① : 总线无人驱动时,也就是各个节点都隐性时,CAN标准定义这时的TX/RX逻辑电平为1;总线有节点驱动显性,也就是主动拉开差分电压的时候,对应TX/RX端逻辑电平0 ,这个1/0的反逻辑类似I2C等OC门的驱动逻辑,努力适应一下。这么做我猜有两个原因:一是对地逻辑的抗扰能力强一些,NPN载流能力强&回流路径短;二是为了数学上的严谨性: 1x1x1x1...1x0 = 0 ,任意节点驱动显性0,那总线就是显性0;所有节点隐性1,总线才是隐性1。但这样的反逻辑带来一个问题是, 电路设计时需要尤其注意上下电时序,上电/休眠/唤醒过程中千万不要出现MCU已下电(TX拉低)但CAN收发器还供5V电的情况 。如果实在难以避免,可以试试单3.3V的CAN收发器MAX3051,它不需要5V电源,逻辑电和驱动电共用同一路3.3V,肯定不会出现电源时序问题。
反直觉知识点② :理论上CAN_L短地,或 CAN_H短路12V,因60Ω终端电阻的存在,隐性时CAN-H与CAN-L之间基本还是重合的,显性时也能正常拉开压差,能维持正常通信,只不过丢包率可能会大一点。大家可以算算总线电压,示波器很容易诊断这个问题。另外, 如果你看到CAN的通信电压不是以2.5V为中心对称的,也有可能是多个CAN线交叉错接,比如CAN1_L错接到了CAN2_L上 。
反直觉知识点③ :一个CAN网络里,120Ω终端电阻1~4颗都能工作,少了的话 离终端电阻远的节点 抗扰度会差,多了的话 显性差分电压可能无法触发阈值。
反直觉知识点④ :除了线路的最远端,任何稍长的CAN分支都可以加1K~4.7K的支线电阻,跑点电流来改善抗扰度。只要分支别太长,大致1Mbps以内的任何总线其终端电阻都是跑电流增强抗扰的,不涉及真正的阻抗或者反射抑制,双绞的要求也不是特别严格。
二、CAN链路层
也就是CAN控制器干了啥?
回顾完物理层,咱来看链路层,CAN帧的标准格式。当发送节的MCU将TX由1变0的时候,CAN收发器将CAN-H拉高&CAN-L拉低,接收节点收到了H-L>0.7V的压差后,接收节点的CAN收发器RX输出由1变0。下图是一个节点接收到CAN波形后解码出的RX逻辑。

一帧报文里边有比较关键的几段: 仲裁段、控制段 、 数据段、CRC段、ACK段 。
仲裁段 中的大部分是CAN报文的ID,起名为“仲裁”其实是因为这一段有优先级仲裁的功能:假设A、B两个节点在同一时刻抢发报文,节点A要发二进制ID为001的报文,B要发010。当A、B节点都在发第一位的显性0的时候,总线会同时被两个节点驱动显性,A、B节点回读总线也都是显性,相互之间还意识不到对方的存在。当节点A发到第二位的0,节点B发到第二位的1的时候,总线只有节点A驱动显性0,节点B不驱动 却发现总线被别人驱动了,此时节点B会认为CAN线上有比自己这帧010优先级更高的数据,节点B就会主动停发,让节点A独占总线发完。之后节点B怀揣着这帧数据再次参与总线优先级的仲裁。
反直觉知识点① :CAN作为一个对等网络,没有主从关系,报文全部广播,节点本身也没有优先级概念,只有报文ID的优先级。可以这么理解:CAN节点是“由事件驱动的”,比如刹车制动器,它能发高优先级的“刹车被踩下”的报文,也会发低优先级的“刹车油位正常”的报文,这些报文根据ID的大小在总线上自由竞争优先级,而不是刹车制动器这个节点的话语权一定高。这个特性就要求设计人员提前规划好所有报文优先级和周期(即“通信矩阵”)才能保证整个CAN网络如期运转。如果你的CAN网络有大量雷同节点,节点又只有一帧报文,那么ID数大(优先级低)的节点一定会在总线繁忙或干扰重发的时候"插不上话",可以试试把时间戳融合到ID里边,确保各节点的新数据优先级最高,旧数据自然会被仲裁掉。
反直觉知识点② :在A、B节点同时驱动第一个显性0的时候,总线被两个节点同时驱动,电压会显著高于2V。示波器上会看到在仲裁段的头部有明显的电平凸台,后续节点A抢占总线之后电压会回归正常的2V。
反直觉知识点③ :各个节点的时钟同步是把每个bit做16~20份的数字切片来实现的,这个切的份数不建议太多或太少。详细机制请参阅 ZLG致远电子的这篇:CAN同步机制,你真的了解吗?
控制段 中有几个控制位,这里拿几个常用的举例。IDE位为扩展ID的指示。如果IDE位为隐性1,就会在后边再续上18位的ID,共11+18=29位长度。比如0x9E就是个11位长度的ID,0x0151就是个29位的ID。R0位是CAN里边的预留位,在CAN-FD里被用作FD帧格式的标志位FDF,这一位为隐性1就会按FD的帧格式解码后续报文。DLC指示了后边的数据段的长度,例如1000表示后续会有8个Byte长度的数据。CAN-FD协议只在数据段会切换成高速率,比如2Mbps/8Mbps,前后其他段的速率保持500kbps不变。
反直觉知识点 ①:CAN与CAN-FD除了数据段波特率的不同,帧格式也有区别,CAN-FD多了一些控制位。比如FDF(也叫EDL)位用来指示是否按FD帧格式解码,BRS位用来指示是否需要切换高波特率,也就是说,一个FD帧可以全程500kbps不切速率的。
反直觉知识点 ②:CAN控制器的标准ISO11898-1里要求接收方不解读R0位的显隐性,所以CAN的控制器无法过滤FD帧。标准CAN网络里边一旦出现FD帧会因为多了BRS、ESI等控制位被认为是格式错误。同样的,因为CAN 2.0时代R0/FDF帧无意义,也有一些设备把发送出去的CAN帧的R0位错误地置了隐性1,这样的设备在CAN网络里一切正常,但若进入CAN-FD网络就会被解读成FD帧,进而因为缺少BRS、ESI等控制位被认为是格式错误。所以,CAN-FD并不是真的向下兼容CAN,因为旧时代的CAN设备并没有判别R0/FDF位的能力,一旦它进入FD网络就会疯狂地打断通信。
反直觉知识点③ :DLC的长度,在CAN标准里DLC可以是0000~1000之间的二进制值,可以用8421的算法直接计算出数据长度。而在CAN-FD中,1001~1111之间的值则被解读为离散的12,16,20,24,32,48,64byte。
CRC段对于从帧头到Data结束之间的数据,CAN协议使用了CRC15这个比较特别的多项式计算校验,有兴趣的可以手算CRC试试。CAN-FD根据数据长度的不同使用了CRC17和CRC21,这里暂不做展开。
ACK段是由收到该帧的CAN节点回复的确认(Acknowledge)。注意 发送节点在ACK位一定发的是隐性1,由接收节点回应显性0,双方无缝衔接才在总线上呈现出一个完整的CAN报文。
反直觉知识点① :总线上任何节点 只要认为这个帧的结构正确,都会在ACK位回显性0,不管需不需要这一帧的ID和数据。为什么不需要的节点也会回ACK?因为等MCU算完会造成这一位的延迟,搅乱总线时序,不如只保障链路层本身的格式正确,纯芯片数字逻辑实现无延迟。嗯,90年代的总线要求不要太高。
反直觉知识点② :发送节点若发现自己这一帧没有ACK回应,它也会认为总线出错,重发16次后进入Passive error状态,有兴趣的自行研究一下,这里不做展开。
三、真实CAN波形
来看一个两节点案例:若节点A发送0x9E报文到总线,从节点B收到的总线波形和逻辑侧波形如下:

黄线为CAN-H,绿线为CAN-L,蓝线为节点B的逻辑侧RX,紫线为节点B的逻辑侧TX。可以看到, 作为接收方的节点B,总线拉差分电压拉出显性的时候,收发器将RX拉0给到MCU。在节点B想要回应ACK的时候,MCU将TX拉0,CAN收发器在总线上拉出了一个歪斜的显性(歪斜是因为测量点的寄生电感影响) 。RX在ACK位置的0,是收发器TX=0驱动总线显性之后 回读到的0。
再看一个比较真实的车上波形 ,CAN网络上大于4个节点:

黄色是CAN_H,高电平表示显性0,绿色是我们挂示波器这个节点的逻辑侧TX,低电平表示显性0。箭头A~D是一帧完整的CAN报文,箭头A ~ B这个过程中,我们挂示波器的这个节点和另一个节点正在进行优先级仲裁,根据我们之前讲到的物理层的分压原理, 两个节点同时驱动电压会高一截。在箭头C这个bit 该节点想发隐性1但发现总线是显性0,那就说明有另外的节点在发送更高优先级的报文,我们这个节点会主动退出发送,成为接收节点,并在箭头D点校验成功后回应ACK,等待报文结束后这个节点再次参与总线仲裁,成功抢占总线如E点所示 。
注意波形高度, 在箭头A~B之间,差分电压略高于2V,这是正常现象,说明有两个节点同时驱动总线显性 ,但从逻辑看,因为H-L>0.7V所以都为显性0,纯数字逻辑的CAN控制器在箭头A~B之间还感知不到对方的存在,箭头C点之后才感知得到; 而在箭头D点,因为除了发送节点之外的所有节点都在同时驱动ACK,所以总线电压比箭头A~B之间的双节点驱动 电压更高。
四、错误帧
终于到了错误帧,注意, 错误帧 不是 由哪个节点发出的, 而是 由某个接收节点认为总线错误, 才 故意驱动总线打断发送方,在总线上呈现为一个错误帧 。也就是说错误帧 一定是由 一个发送节点和至少一个 认为发送方有错的节点 共同形成的。
五、位填充
位填充规则是CAN协议的灵魂,简单来讲就几个字:逢五补一。当发送节点想要发连续5个bit的显性0的数据,会故意插入一个无意义的隐性1;当出现连续5个bit的隐性1,会故意插入一个无意义的显性0,如下图的紫色bit。如果发送节点漏填了这个0/1,或者这个0/1被干扰成了1/0,接收节点就会判定为“ 填充错误 ”,向总线上输出“主动错误标志”——连续六个显性0,故意破坏这一帧报文,发送节点感知到总线错误之后停止发送这一报文的后续部分。你说巧妙不巧妙?连续6个显性0本身就是破坏“逢五补一”规则的,被拿来当错误标志回给发送节点。

假如原始数据是0x00,二进制0000 0000,发送节点发到0000 0的时候发送节点会先插一个1,再发后续的000,成为0000 01000,共9bit长度,接收节点也会在第5bit的0之后预期一个无效的1,解码时抠掉。
假如原始数据是0000 0100,第六位自带1,发送节点发到00000的时候也会先插一个1,再发后续的100,成为0000 01100,共9bit长度 。
六、回读确认
发送节点发送了0或1的时候,会回读确认总线是否和自己的发送相符,比如在仲裁段抢优先级失败就会等下一帧再发;如果发到了数据段,按理说此时总线应该只有自己,发着发着突然发现回读的0/1与自己发的不同,比如受到了干扰,发送节点就会输出“主动错误标志”——连续6bit显性0,来主动抛弃后续报文,同时让接收节点知道我这一帧有误。
“在这时,接收节点收到第6bit显性0的时候,因违背逢五补一的位填充规则,也会往总线上输出“主动错误标志”,所以会在总线上看到连续12bit的显性0,前6个来自发送节点,后6个来自接收节点。
”
正常情况来说,总线上的显性不应该>5bits=10us。那么用示波器设置>11us的脉宽触发模式就很容易定位错误帧的位置,不一定要用解码示波器。
七、升维打击
CAN网络的幅度和电流可以为我们提供更多维度的信息,此所谓升维打击。
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关文章

怎么使用矢量网络分析仪测量驻波比?
馈线和天线的阻抗完全匹配,此时高频能量全部被天线辐射出去,没有能量的反射损耗;驻波比为无穷大时,表示全反射,能量完全没有辐射出去。驻波比一般用网络分析仪进行测量。 二、矢量网络分析仪怎么测量驻波比 要测...

手持折射仪怎么用_手持折射仪使用方法_手持折射仪应用
手持折射仪怎么用_手持折射仪使用方法_手持折射仪应用; 折射仪又称折光仪,是利用光线测试液体浓度的仪器,用来测定折射率、双折率、光性,折射率是物质的重要物理常数之一。产品有手持式折光仪、糖量...

SPI通信协议:单片机spi通信接口什么意思,spi接口干什么用的?
SPI通信协议:单片机spi通信接口什么意思,spi接口干什么用的?;讲真,以前做开发的时候最怕就是调spi和iic。本文引用地址:因为公司没有逻辑分析仪,调起来全凭经验,一出问题找都找不到,只能...

单片机spi通信接口什么意思,spi接口干什么用的?
单片机spi通信接口什么意思,spi接口干什么用的?;讲真,以前做开发的时候最怕就是调spi和iic。 因为公司没有逻辑分析仪,调起来全凭经验,一出问题找都找不到,只能仔细看代码盲调,看是...

直流电阻测试仪怎么测电机 直流电阻测试仪怎么测变压器
直流电阻测试仪怎么测电机 直流电阻测试仪怎么测变压器; 直流电阻测试仪怎么测电机 使用直流电阻测试仪测量电机的方法如下: 1. 准备工作:确保电机处于停止状态,断开电源,并确...

示波器探头怎么用
示波器探头怎么用;示波器是一种用处十分普遍的电子测量仪器,它可以把眼睛看不清的电子信号转换成可以看到的图象。示波器探头对测定效果的准确度及其准确性尤为重要,它是...

频谱仪RBW那些事
仪显示的是中频滤波器的频域响应曲线。 频谱仪扫描LO,把输入信号转换成固定IF的信号,然后通过IF滤波器,这时,IF信号与滤波器的传递函数相乘。 想像一下,你要测量一个1GHz的信号,但是你知道是1GHz,频谱仪不知道。 那频谱仪怎么...

粮食水分测定仪怎么样,它有哪些优势
粮食水分测定仪怎么样,它有哪些优势;在具体了解粮食水分测定仪之前,我们先来了解一下测量粮食水分的意义。 1、霉变:贮藏期间,种子水分过高,呼吸作用旺盛,产生大量呼吸热和水分,会引...

相位检测仪怎么使用_相位检测仪是干什么的
相位检测仪怎么使用_相位检测仪是干什么的; 相位检测仪怎么使用 相位检测仪常用的测量相位差的方法有直接测量法、相位差电压转换法、相位差时间转换法以及零示法等。 数字...

线束测试仪怎么选型号的参数(线束测试仪选型要求)
线束测试仪怎么选型号的参数(线束测试仪选型要求);现在市面上有很多不同品牌的线束测试仪,不同研发商所生产的线束测试仪器不仅在价格上有较大的差异,而且仪器的参数配置,性能要求等也都是完全不同的。安泰...