- 如何产生CAN Bus-Off
- Can Tx-Rx短接
- Can Tx对地短路
- Can Rx对电源短路
- 中断电阻不匹配
- CAN Busoff 产生及处理
- Tx-Rx 短接,报文无法成功发送,每次发送失败,都会使得Can Controller TEC计数+8,发送成功TEC计数-1,当TEC计数大于255时,硬件置位Busoff中断标志位,软件进入Busoff中断。
- 在CAN_BusoffHandler中,进行了如下操作:
- 取消所有pending request(pending Tx/Rx request)
- 将CAN Controller 设置为stopped模式
- 调用CanIf_ControllerBusOff()通知上层
- 清除Busoff中断标志位
- 函数CanIf_ControllerBusOff()中,进行了如下操作
- 将Tx Pdu模式设置为Offline,停止发送报文
- 调用busoff manage函数通知上层,一般是CanSM_ControllerBusOff();
- 函数CanSM_ControllerBusOff()中,进行了如下操作
- 通知BswM模块,Can controller状态发生变化,即:
BswM_CanSM_CurrentState(network, CANSM_BSWM_NO_COMMUNICATION),如有需要,可以通过BswM模块配置达到此模块时相应的Action。
- 通知ComM模块,Can Controller模式变化,即:
ComM_BusSM_ModeIndication(network, COMM_SILENT_COMMUNICATION)
- 向Dem模块报告Can Busoff 发生用于相关DTC的存储
- 将CanSM的模式切换为CANSM_S_RESTART_CC
- 启动CanSM timer,该timer用于bus-off recovery时间计数,tx-ensured时间计数等
- Can busoff recovery处理
- CanSM_Mainfunction()中,会周期性的check是否有Bus-off发生,通过函数CanSM_BusOffTransitions(network)进行处理,当CAN BOR state为CANSM_S_RESTART_CC时,进行CanSM_BOR_CtrlsStart(network)
- 在CtrlsStart()函数中,会通过CanIf_SetControllerMode()函数将将发生bus-off的Controller状态设置为START,如果恢复成功,将CanSM状态设置为CANSM_S_BUS_OFF_RECOVERY_L1或CANSM_S_BUS_OFF_RECOVERY_L2;如果恢复失败,则CanSM_Num_Unsuccessful_ModeReq_au8++,当CanSM_Num_Unsuccessful_ModeReq_au8超过配置的最大数值时,请求COMM_NO_COMMUNICATION,使该路Controller下线,此后不再进行Bus-off recovery
- 当达到Bus-off配置的时间后,停止CANSM timer计算,将Pdu模式设置为Online,并通知BusM模块,CANSM已进入CANSM_BSWM_FULL_COMMUNICATION。
- 将CANSM bor state 切换为CANSM_S_BUS_OFF_CHECK,启动CANSM timer,开始进行Bus off recovery 确认,在这段时间内如果没有发生bus off,将CANSM BOR state置位CANSM_S_NO_BUS_OFF,清除Busoff_Indication数组,关闭CANSM timer;如果在此过程中在此发生Bus-off,则重复上述过程,进行新一轮Bus off recovery