在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样的。表1是一个正常标准数据帧的报文组成。
![](https://pic1.zhimg.com/80/v2-6076fe65e5f2232e35f27ec8f8e4a188_hd.jpg)
![](https://pic1.zhimg.com/80/v2-04624a797ed2267464b116e89059cc3c_hd.jpg)
一帧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)。
![](https://pic4.zhimg.com/80/v2-47831daa9ad25e69e5ca7521b1848cdb_hd.jpg)
那导致ACK段出错的原因有哪些呢?下面我总结了一些。
- 总线上只有一个有效节点:发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。所以,当总线上只有一个有效节点时,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK Slot没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。
- 波特率不匹配或者节点没有初始化,导致没有ACK;
- 总线线缆短路,断路,接反;
- 高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。
![](https://pic2.zhimg.com/80/v2-671b3c9b22d2edc499368e38f79fc521_hd.jpg)
![](https://pic4.zhimg.com/80/v2-f8ef6ac0ca1ac66dc43d8c56b7ebc483_hd.jpg)
![](https://pic1.zhimg.com/80/v2-01fc25c3d1e7a7ec2023ecfa66083024_hd.jpg)
来源:致远电子