江协科技 CAN总线入门课程(错误处理)
CAN总线规定了5种可能出现的错误类型,这五种错误分别叫做位错误、填充错误、CRC错误、格式错误、应答错误。每种错误的意思可参考下面这张表。
当这些发送单元或者接收单元检测到对应的错误时,它们就会紧跟着主动出击,发出错误帧,破坏当前总线上的数据,发出错误帧的行为就叫做错误通知,意思是不管你们其他设备有没有检测到这个错误,反正我现在检测到了错误,我要破坏这帧数据,大家都别收了,错误帧一旦产生,这帧数据就作废了,数据传输也会终止,等错误帧结束后,总线就回归空闲,大家谁想发数据,谁再开始一个新的帧。
但是这个设计目前有一个风险,就是错误通知赋予了每个设备破坏传输的能力,如果有个设备抽风了,它无论收到啥,都认为是错的,那这样它就会不断破坏数据,总线上正常的数据传输都无法进行了。所以错误通知的设计还要加一些限制措施,这个限制措施就是错误状态。
错误状态有三种:主动错误状态、被动错误状态和总线关闭状态。
每个设备初始都为主动错误状态,主动错误状态发出主动错误帧,可以破坏别的设备的数据,权力是比较大的;如果它频繁报告错误,报告太多了,那说明这个设备不太可靠,就给它转到被动错误状态;被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧,被动错误帧不可以破坏别的设备的数据,因为当前设备不太可靠,虽然还能参与通信,但要收回它破坏数据的能力;如果它在被动错误状态,还在频繁报告错误,就转到总线关闭状态,总线关闭状态的设备不能参与通信。
每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己的状态,TEC(Transmit Error Counter)是发送错误计数器,设备在发送时,每发现一个错误,这个TEC就会增加一次;REC(Receive Error Counter)是接收错误计数器,设备在接收时,每发现一个错误,这个REC就会增加一次。在进行正常发送或接收后,它们的值都会减少一次,所以TEC和REC的值就反应了当前设备检测错误的相对频率。
‘
接下来我们来看一下错误计数器的细节,也就是TEC和REC都是怎么进行加减的
我们以ACK错误为例,看一下错误帧的现象,首先第一个波形为设备处于主动错误状态,发送标准数据帧,正常传输。
设备处于主动错误状态,发送标准数据帧,检测到ACK错误
设备处于被动错误状态,发送标准数据帧,检测到ACK错误