在理解CAN报文为什么会发送失落败之前我们先看看一条精确的CAN报文到底该当是怎么样的,表1是一个正常标准数据帧的报文组成。
表 1 标准数据帧报文格式组成

图 1 标准数据帧格式
CAN总线是一种基于广播的通讯办法,为了担保总线上的每一个正常节点都能精确的吸收到报文,报文的发送者哀求每一个吸收节点在报文发送结束前要作出应答,这也是报文里ACK存在的缘故原由。
一帧CAN报文中ACK段长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimter)。在应答场里,发送站发送两个隐性位。当吸收器精确地吸收到有效的报文,吸收器就会在应答间隙(ACK Slot)期间(发送ACK旗子暗记)向发送器发送一“显性”的位以示应答。
应答间隙:所有吸收到匹配CRC序列(CRC SEQUENCE)的站会在应答间隙(ACK Slot)期间用一显性的位写入发送器的隐性位来作出回答。
应答界定符:ACK界定符是ACK场的第二个位,并且是一个必须为隐性的位。因此,应答间隙(ACK Slot)被两个隐性的位所包围,也便是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。
图 2 正常ACK段报文
而如果总线上没有ACK应答(即应答间隙为隐性),发送器就会发送一个缺点标志,并且发送缺点计数器值加8,节点就会对报文进行自动重发,若自动重发依然收不到ACK,则在发送缺点计数器计数满128后(即涌现16帧缺点帧),由缺点主动转为缺点被动状态,如图3所示。
那导致ACK段出错的缘故原由有哪些呢?
总线上只有一个有效节点:发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失落败,须要重发,而由于发送缺点计数器会在发送失落败后累加,直到该节点关闭。以是,当总线上只有一个有效节点时,这个节点是发不出去数据的,由于它所发出的数据帧中的ACK Slot没有其余一个节点来添补,将永久是隐性位,这个节点会一贯重发数据直到发送成功或发送被取消。
波特率不匹配或者节点没有初始化,导致没有ACK;
总线线缆短路,断路,接反;
高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。
图 3 应答界定符缺点帧
图 4 没有ACK的报文
当你在调试CAN总线时涌现节点发送报文失落败的情形时,一定要检讨是不因此上几点疏漏导致你的总线上ACK非常。而借助恰当的仪器,可以在查找CAN总线缺点时势半功倍。图4即采取致远电子的CANScope来对缺点帧进行标记,同时找到缺点帧对应的波形来查找出错误情形。CANScope还可以对CAN总线物理层、数据链路层、运用层做一系列的测试,为CAN工程师办理测试难题。
图 5 CANScope测试项目







