ack段长度为2个位,包含应答间隙(ack slot)和应答界定符(ack delimiter)。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ack slot)期间(发送ack信号)向发送器发送一“显性”的位以示应答。如图2 (canscope测试的ack段波形图)所示:
应答间隙:所有接收到匹配crc序列(crc sequence)的节点会在应答间隙(ack slot)期间用一“显性”的位写入发送器的“隐性”位来作出回答,由于can总线线与的原理,只要总线上有一个节点正确接收到数据,则ack slot就会被填入显性电平。
ack界定符:ack界定符是ack场的第二个位,并且是一个必须为“隐性”的位。因此,应答间隙(ack slot)被两个“隐性”的位所包围,也就是crc界定符(crc delimiter)和ack界定符(ack delimiter)。
当一个接收节点接收的帧起始到crc段之间的内容没发生错误时,它将在ack段发送一个显性电平。 如图3所示:
二、can总线ack电平偏高原因分析
以使用zlg致远电子canscope测试某电车can网络为例,20多个can节点采样手牵手方式组网,线两端各接120欧电阻,通讯能够正常,但差分信号波形应答位电平偏高较多,如图4所示,从canscope的波形图中可以清楚的看到ack电平突增。
can总线通信存在异常,ack应答有问题?——no
分析如下:
首先,我们看一款can收发器的典型内部结构图,canh、canl连接总线。
总线显性时(逻辑为0),收发器内部q1、q2导通,canh、canl之间产生压差;隐性时(逻辑为1),q1、q2截止,canh、canl处于无源状态,压差为0。
按照标准,在总线输出为显性时,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
在can总线网络中,当一帧报文被各个节点接收时,在ack阶段,多个can节点同时响应(都发显性),流过终端电阻的电流被各个can节点均分,那么平均到每个节点的电流就减小了,如下图所示,vdh、vdl的压降也减小,相应canh-canl的差分电压就增大了,即ack应答电平偏高。
三、ack的意义
当can总线上只有一个节点可收发数据时,总线上因无接收节点在ack slot时间内 发送“显性”位填充,而始终保持隐性,发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。因此这个节点会一直重发数据直到发送成功或发送被取消。
当总线上有多个can节点组网通信时,由于总线电平线与的原理,只要总线上有一个节点正确接收到数据,则ack slot就会被填入显性电平(此时认为数据帧发送成功), 那么,接收错误的节点如何来告知发送者此次发送不成功呢?这就要用到can的错误帧,当一个接收节点收到错误数据时,它立即广播发送一个错误帧,其它的节点和发送者也都会收到这个错误帧而丢掉此次报文,发送节点重新发送,这才是ack的意义。
来源:电子产品世界