- 如何产生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
本文详细阐述了CAN总线(Controller Area Network)在出现Bus-Off状态时的产生原因,包括短路情况和中断电阻不匹配。在Bus-Off状态下,硬件和软件如何响应并处理这一问题,包括取消挂起的请求,设置控制器为停止模式,以及通过CanSM_timer进行恢复计时。在恢复过程中,涉及多个层级的函数调用和状态切换,确保CAN总线能够重新进入正常通信状态。同时,文章还介绍了Bus-off恢复的具体步骤,包括尝试恢复、定时器管理和确认恢复的阶段。

1万+

被折叠的 条评论
为什么被折叠?



