首先说一下CAN总线技术中为什么要做位填充机制。
上两节我们介绍了CAN总线的同步机制,在一帧完整的CAN数据传输过程中有两种同步,一种是硬同步,只会发生在SOF位;第二种是传输过程中检测到隐性到显性的跳变执行重同步,如果我们假设CAN没有位填充机制,那么假设数据全部是0xFF或者全部是0x00的情况,就会一直没有隐性位到显性位的跳变,所以一直无法重同步。
在CAN总线中,各节点之间的CAN波特率或多或少会存在一定的偏差(比如晶振频率有偏差)。
举一个比较极端的例子,对于波特率250K的设备,Tbit = 1s/250K = 4us, 1Tq=4us/16=0.25us, 假设车身有一台ECU的波特率为235.3K,则Tbit=1s/235.3K=4.25us ,则每个bit比250K的设备多出1个Tq; 同理,如果车身有一台ECU的波特率为266.7K,则Tbit=1s/266.7K=3.75us,则每个bit比250K的设备少出1个Tq;
当然以上情况比较极端,一般来说的实际项目中CAN一致性要求一般会规定CAN波特率在一个很小的误差范围内,比较典型的值是±0.15%,或者±0.1%,所以网络中可能会存在波特率最大偏差0.3%的两台设备,这样每个bit虽然不会偏差出1个TQ但是会有累积的误差,误差多次累积后可能就会累积到一个TQ!
所以位填充技术就是为了防止这种长期没有重同步从而被误差累计到无法恢复的情况!
现在在来理解位填充技术的原理就比较清楚了,就是发送器在发送位流中检测到5个极性相同的位时,它在实际发送时会自动插入一个补码位,从而触发重同步来同步CAN波形。要注意CRC界定符、ACK、帧结束等固定形式是场所以不参加位填充操作。