1:先看官方文档对ACK的解释
All nodes that have received the matching CRC sequence (and, in FD Frames the matching stuff count) shall send an ACK within the ACK slot by overwriting the recessive bit of the transmitter by a dominant bit (they send ACK).
所有接收到匹配CRC序列的节点(以及在FD帧中的匹配填充计数)应通过用显性比特覆盖发射机的隐性比特来在ACK时隙内发送ACK(它们发送ACK)。
也就是说ACK是作用于底层的(实际作用于数据链路层)。它对自己能接受到的所有正确帧数据,都要发送ACK应答。
此处“正确”的解释是:指帧结构,CRC校验,不存在问题。假设总线上存在一个节点Node1、它不发送数据,其他节点发送所有正确的帧,Node1都要发送ACK。
2:实验验证我们的结论
1:打开一个CANoe工程,配置好波特率,采样点等参数。连接任意CAN总线(总线上至少存在一个实物节点(Node))使用IG工具,发送以下报文
且这些报文都是该实物节点的DBC文件中没有定义的。也就是说总线上的实物节点,并不会处理这些帧数据。
查看结果:
以上结果证明了我们的猜想。
我们在将真实节点去除,看实验结果
可以看到,总线将报ACK应答错误。
结论如下:总线上的节点将会,总线上所有能接收到的正常帧都进行ACK应答
3:常见的误解
写下这段文字的目的在于,我以前对ACK位,存在误解。我以前认为节点只对其需要接收的帧,才进行ACK应答,实际并非如此。实际情况是ACK只作为底层(实际数据链路层的一种校验方式)。
实际上ACK是来者不拒,对所有正确的帧都进行应答。
而关于节点对那些帧接收,并处理其中的数据,则是更高级别的层来处理的。
4:对于ACK应答的深入思考
**1)如果总线上存在多个节点(假设3个,节点A/B/C),那么节点A发送帧(正确的帧)数据,其余两个节点,B给与ACK应答,C不进行ACK应答。节点A该怎么处理和观察?
答:解决方案:两个接收节点,B和C会对ACK进行回读。
1:B进行ACK应答,回读与发出一致,没有问题。
2:C不进行ACK应答,回读与发出不一致,发现错误(此处也很好理解,不应答就发出隐形电平,但是B发出显性电平,直接将C发出的电平覆盖)
3:发出此帧的节点A,检查发现ACK被应答,没有错误,很开心。
此时将会由节点C发出错误帧