总线空闲的时候, 他是recessive电平,canH 和canL之间电压差等于0.
bus off的时候, can控制器 会去检查连续11个bit,如果都是recessive,那么内部计数器加1.等加到了127的时候, bus off 就会恢复。
这个条件很好满足:
case 1: 只要空闲的时候,上面没有节点发数据,那么都是recessive电平, 很快就可以恢复。
case 2: can帧的结构: 在EOF帧尾(连续7个recessive bit)之后, 还需要有interframe space 。 这个interframe space iso11898规定它是连续的3个recessive bit.
can帧的最后是ack slot,它有两个bit。 ackSlot[0]是接收bit, ackSlot[1]是ack间隔符。 这个间隔符就是recessive bit.
因此1个位ackSlot[1], 加上 7个位的EOF, 加上3个位的interframe space, 这样就是11bit了。
当总线上有节点发送报文的时候, 那么就会出现11个连续 recessive bit. 只要出现了128帧报文。 那么就可以被 bus off节点接收到。
busoff的时候,mcu该如何去恢复?
有寄存器可以看到busoff, 最简单的,重新初始化can控制器, 这个节省时间, 也不用关心busoff中断。