文章目录
- 错误类型
- 1、位错误-Bit Check Error
- 2、填充错误-Stuff Error
- 3、格式错误-Form Error
- 4、ACK错误-ACK Error 和 CRC错误-CRC Error
- 5、错误示例
- 错误处理
- 1、主动错误 - error active
- 2、被动错误 - error passive
- 3、总线关闭 - bus off
- 4、错误计数值的变动条件
- 参考
错误类型
- 位错误-Bit Check Error
- 填充错误-Stuff Error
- 格式错误-Form Error
- ACK错误-ACK Error
- CRC错误-CRC Error
1、位错误-Bit Check Error
位错误-即 节点回读检测到的位与自身送出的位数值不同
位错误的检测范围为 SOF -> EOF
以下情况不判断为 位错误:
- 对于仲裁区,如果节点发送为“隐性”位,而检测到“显性”位不导致位错误,表示该节点仲裁失败
- 对于ACK槽,如果节点发送为“隐性”位,而检测到“显性”位不导致位错误,表示该节点发送的报文未被其他节点正确接收
- 节点在发送被动错误标志时检测到显性位不认为是位错误,如果某个节点发送了被动错误标志,然后回读的不是6位连续的隐性位,这种情况是由于CAN总线的 线与 机制,被动错误标志别其他节点发送的显性位给覆盖掉了。
2、填充错误-Stuff Error
填充错误即 在使用位填充编码的帧场(SOF -> CRC)中,不允许出现六个或更多连续相同的电平位
3、格式错误-Form Error
格式错误即 在固定格式位场(CRC界定符、ACK界定符、帧结束)检测到一个或更多显性位
以下情况不判断为 格式错误:
- 接收节点在EOF最后一位检测到显性位,不认为是格式错误,而认为是超载帧的开始,而发送节点会认为是格式错误
4、ACK错误-ACK Error 和 CRC错误-CRC Error
CRC错误即 接收节点计算的CRC序列与接收到的CRC序列不同
ACK错误即 发送节点在ACK槽时间内未检测到“显性”位
5、错误示例
1、位错误和填充错误
错误处理
为了由于自身某些原因导致无法正常接收的节点一直发送错误帧干扰其他节点通信,CAN BUS规定了节点的三种状态:
- 主动错误 - error active
- 被动错误 - error passive
- 总线关闭 - bus off
MCU编程实现总线关闭“快恢复”和“慢恢复”的一般过程可用以下流程图描述:
1、主动错误 - error active
-
节点能正常参与总线通信的收发
-
错误帧结束之后,总线回到正常状态,被中断的节点会尝试重新发送刚才的消息
在主动错误状态下,当节点检测到一个错误,就会发送带有主动错误标志的错误帧,主动错误标志是连续6个显性位,所以此时将会覆盖总线上其他节点的发送 ,而之前在CAN总线上传输的报文就会被这6个连续显性位破坏掉
2、被动错误 - error passive
- 节点可以参与总线通信的收发
- SuspendTransmission之后,总线回到空闲状态,如果这个节点能够竞争成功,那么它就能接着发送,如果竞争不能成功,那么就接着等待下一次竞争。 目的是为了让其他正常节点优先使用总线
在被动错误状态下,当节点检测到一个错误,就会发送带有被动错误标志的错误帧,被动错误标志是连续6个隐性位,所以此时总线上其他节点的发送不会受到影响
3、总线关闭 - bus off
- 节点的所有总线活动停止
- 节点暂时不能参与到总线通信中。处于这种状态中的节点既不可接收也不可发送消息
4、错误计数值的变动条件
参考
- CAN总线的错误检测机制:https://www.bilibili.com/video/BV1Su41187x8/?spm_id_from=333.788&vd_source=1acb50d9fb0b001f6955382b5acbc993