CAN总线调试过程中呈现报文发送失利,许多工程师都对此只知其一不知其二,这儿就CAN报文发送失利的问题咱们来做一次讨论。
在了解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测验项目