背景
在学习Busoff的问题排查时,犯了个错误,就是在Busoff的中断处理中,在CanIf_ControllerBusoff()函数打断点,导致没有打出快慢恢复机制,通过重新学习Busoff流程后,自己再梳理下这个流程。
一、Busoff的运行流程
1 硬件检测
硬件端会不断检测发送报文的错误数,一旦TEC > 127就会进入 error passive状态,发送被动错误,当TEC > 255时总线进入Busoff状态
2 软件检测
- OS轮询检测
OS中不断调用Busoff的监测函数,检测函数里面也采用轮询的方式去查询Busoff的状态。一旦协议状态寄存器(Protocol Status Register)满足以下条件就进入busoff中断处理:
(1)BO位 == 1
(2)INIT位 == 1
(3)本路CAN Controller运行在CANIF_CS_STARTED状态 - Busoff中断处理
发送Busoff后,会进入中断处理函数中,处理步骤如下:
(1)取消所有正在pennding状态的请求
(2)将Controller的状态设置为CANIF_CS_STOPPED
(3)获取当前Controller的逻辑ID
(4)调用CanIf_ControllerBusoff()函数,用于通知CanSM有Busoff事件发生。
(5)CanSM检测到busoff事件后会进行快慢恢复机制来尝试恢复通信。
如下是CanSM的交互图