上图是 ack错误的时候, 示波器的截图
从示波器上面两个箭头直接的是部分是EOF+帧间隔+ passive errror flag + error delimiter.
EOF是7bit
帧间隔是3bit
passive error flag 是6bit(全都是recessive 电平)
error delimiter 是8bit
在EOF之前还有一个bit的ACK delimiter . 所以 1+7+3+6+8=25个bit。 波特率是500k, 一个bit时间是2us ,总共有50us的持续高电平时间。 示波器一个格子20us, 可以看出箭头部分是54us 为什么和理论计算出来的50us 对不上? 还差了4us,就是两个bi。 因为在总线空闲idle的时候,他本事就是高电平。 所以这两个bit就是总线空间的时间。can控制器让总线休息了2个bit。然后才发的下一帧数据。
出现ACK的时候,can控制器的错误计数器会加1,并且会持续发出没有收到ack的那帧报文。
这个持续发出,是不受代码里控制的。 一旦对方把设备连接到can总线的时候,can控制器就会停止发送ack。同时错误计数器的值会不断减少。