AUTOSAR实战教程 -- 教你解决CANSM导致CanController无法启动看懂CANSM状态机
目录
稳态:
暂态
CANSM_BSM_S_PRE_NOCOM
CANSM_BSM_S_PRE_FULLCOM
CANSM_BSM_S_FULLCOM
Bug现象
编辑
Debug流程
ComM请求有没有问题
CANSM内部有没有问题
错误原因
关键变量与函数
重点排查外围模块
参考文献
愚以为CanSM主要有两个大的作用
1.与CanIf的交互
CanSM 根据来自ComM 模块的模式请求改变CAN 网络的通信模式。
CAN 网络PDU 模式控制(PDU 发送与接收的控制)。
CanSM 使用CanIf 模块的API,设置CAN 控制器和CAN 收发器工作模式。CAN 控制器和CAN
收发器工作模式的变更由CanIf 通知CanSM,用于CanSM 状态切换。
CanSM 为每一个配置的CAN 网络实现一个状态机,并将网络状态的变更通知给ComM 和BswM。
2.CAN 总线BusOff 恢复处理。
网上对第二条作用:CAN 总线BusOff 恢复处理,,已经有非常丰富的讲解了。本文主要探讨第一条,CanSM对CanController的控制,以及遇到CanSM无法打开Controller时的排查、解决思路。
稳态:
模式为稳定的模式,可以接受正常的网络请求.
-
COMM_NO_COMMUNICATION
-
COMM_SILENT_COMMUNICATION
-
COMM_FULL_COMMUNICATION
(CANSM从初始化到FULL COMM的一般跳转路径)
暂态
-
CANSM_BSM_S_PRE_NOCOM ,
-
CANSM_BSM_WUVALIDATION ,
-
CANSM_BSM_S_PRE_FULLCOM ,
-
CANSM_BSM_S_CHANGE_BAUDRATE ,
-
CANSM_BSM_S_SILENTCOM_BOR ,
-
CANSM_BSM_S_NOT_INITIALIZED
我现在遇到的问题是,CAN controller无法打开,而且当前没有用trcv校验和Pn,也没有波特率改变,且不是busoff所以直接不考虑这几个状态:
-
CANSM_BSM_WUVALIDATION ,
-
CANSM_BSM_S_CHANGE_BAUDRATE ,
-
CANSM_BSM_S_SILENTCOM_BOR ,
查看CANSM的全局变量,发现一直待在CANSM_BSM_S_PRE_NOCOM,都没进Full Com ,排除之后重点考虑的是(按状态机先手顺序)这几个进入FULL COM之前的状态。
-
COMM_NO_COMMUNICATION
-
CANSM_BSM_S_PRE_NOCOM
-
CANSM_BSM_S_PRE_FULLCOM
虽然CANSM状态机非常复杂,但我们如果只看跟我们目标相关的状态,撇开无关的状态机,应该还是可以在短时间内Hold住的!我们重点捋一下这几个。
CANSM_BSM_S_PRE_NOCOM
ECU上电后,每一路CanSM状态机默认进入CANSM_BSM_S_NOT_INITIALIZED状态。EcuM 模 块 调 用 CanSM_Init 函 数 , CanSM 状 态 从 CANSM_BSM_S_NOT_INITIALIZED 切 换 到 CANSM_BSM_S_PRE_NOCOM状态。
CanSM 状 态 机 处 于 CANSM_BSM_S_FULLCOM 或 者 CANSM_BSM_S_PRE_FULLCOM 或 者 CANSM_BSM_S_SILENTCOM 状 态 时 , 上 层 模 块 调 用 CanSM_RequestComMo