一、ACK简介
ACK的作用:确认一帧报文是否正常接收。
以标准数椐帧为例,从结构上看分成7段,分别为起始段、仲裁段、控制段、数椐段、CRC校验段、ACK应答段、帧结束段,如图1所示:
![](https://pic3.zhimg.com/80/v2-330e77c9f7604ebb79cb460e02c6b03e_hd.jpg)
![](https://pic3.zhimg.com/80/v2-8b833b7643cdac36b37708140ccbf982_hd.jpg)
ACK界定符:ACK界定符是ACK场的第二个位,并且是一个必须为“隐性”的位。因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围,也就是CRC界定符(CRC DELIMITER)和ACK界定符(ACK DELIMITER)。
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。 如图3所示:
![](https://pic2.zhimg.com/80/v2-4707bbbf7e68f38c3f6e277978b88775_hd.jpg)
二、CAN总线ACK电平偏高原因分析
以使用ZLG致远电子CANScope测试某电车CAN网络为例,20多个CAN节点采样手牵手方式组网,线两端各接120欧电阻,通讯能够正常,但差分信号波形应答位电平偏高较多,如图4所示,从CANScope的波形图中可以清楚的看到ACK电平突增。
![](https://pic4.zhimg.com/80/v2-781c208df9c547af5cf0bf31c877e047_hd.jpg)
分析如下:
首先,我们看一款CAN收发器的典型内部结构图,CANH、CANL连接总线。
![](https://pic3.zhimg.com/80/v2-ebbc3536609383f5831c638af7460e7e_hd.jpg)
按照标准,在总线输出为显性时,CANH=3.5V,CANL=1.5V,差分分电平:CANH-CANL=2V,总线网络电阻为60欧,流经终端电阻的电流约为33mA(2V/60欧);
然而,CAN收发器在输出显性时,CANH电平并不是标准的3.5V,而是5V(VCC)通过一个二极管降压得到的,二极管的压降由负载电流决定。图6所示的VDH为CANH对应的二极管压降,VDL为CANL对于的二极管压降,流过的电流越大,二极管的压降就越大。可知:
CANH的电压=5V-VDH
CANL的电压=0V+VDL
![](https://pic1.zhimg.com/80/v2-f6788de81d006476e928afc19f34ece0_hd.jpg)
![](https://pic3.zhimg.com/80/v2-01ab5582cea3d8b5beac80e7e42e3006_hd.jpg)
三、ACK的意义
当CAN总线上只有一个节点可收发数据时,总线上因无接收节点在ACK SLOT时间内发送“显性”位填充,而始终保持隐性,发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。因此这个节点会一直重发数据直到发送成功或发送被取消。
当总线上有多个CAN节点组网通信时,由于总线电平线与的原理,只要总线上有一个节点正确接收到数据,则ACK SLOT就会被填入显性电平(此时认为数据帧发送成功),那么,接收错误的节点如何来告知发送者此次发送不成功呢?这就要用到CAN的错误帧,当一个接收节点收到错误数据时,它立即广播发送一个错误帧,其它的节点和发送者也都会收到这个错误帧而丢掉此次报文,发送节点重新发送,这才是ACK 的意义。
来源:致远电子