一、CanSM简介
CanSM全称CAN State Management,CAN状态管理。这里管理的状态其实是对应其总线的通信状态,所以CanSM模块管理的就是CAN总线的通信状态,而这里的通信状态则包含能不能发送报文,能不能接收报文,总线上有没有错误等。
CanSM模块在AUTOSAR架构中的位置:
由上而下,CanSM接收其他模块的总线状态切换请求并通知CanIf模块去执行,如:28服务开关通信;
由下而上,CanSM接收CanIf模块的总线状态切换反馈并汇报给其他模块,如发生CAN总线BUSOFF。
二、CanSM与各模块间的交互![](https://i-blog.csdnimg.cn/blog_migrate/7b18b8d8951305d429909b08e9943ab2.png)
其他模块与CanSM的交互包括:
1、ECuM模块会初始化CanSM模块(接口CanSM_init),并与CanSM模块交互进行CAN总线唤醒的验证;
2、ComM模块使用CanSM模块请求CAN网络的通信模式(接口ComM_BusM_GetCurrentComMode),CanSM模块会将其CAN网络的当前通信模式通知给ComM模块;
3、BSW操作系统调用CanSM模块的主函数(接口CanSM_MainFunction);
4、CanSM模块使用Canlf模块来控制CAN控制器和CAN收发器工作模式(接口CanIf_SetControllerMode),Canlf模块通知CanSM模块CAN总线相关事件(接口CanSM_ControllerBusoff);
5、CanSM模块向Dem模块报告总线特定的故障信息(接口Dem_SetEventStatus);
6、CanSM将总线特定的模式更新通知到BswM模块(接口Bswm_CanSM_CurrentState);
7、CanSM模块将部分网络可用性通知给CanNm模块,并在部分联网的情况下处理已通知的CanNm超时异常(接口CanSM_ConfirmPnAvailability);
8、CanSM模块向Det模块报告开发和运行时错误(接口Det_ReportError)。
三、CanSM功能
1、总线模式管理切换
NOT_INITIALIZED 状态下,只能调用 CanSM_Init。
CHANGE_BAUDRATE、PRE_FULLCOM、PRE_NOCOM、WUVALIDATION、SILENTCOM_BOR 为中间状态,正常情况下,CanSM不会停留在这些状态中,在这些状态下,调用 CanSM_RequestComMode 会被拒绝。
NOCOM、SILENTCOM、FULLCOM为稳定状态,处于这些状态下,可接受新的CanSM_RequestComMode 请求。
2、Busoff
当CanSM模块从CanIf模块收到 Busoff 通知时,将会进入 Busoff 恢复的状态,流程如下:
(1)快恢复,产生 Busoff 后,延时 CanSMBorTimeL1 时间尝试恢复(发送一帧报文);
(2)快恢复次数达到 CanSMBorCounterL1ToL2 后,进行慢恢复;
(3)慢恢复,产生 Busoff 后,延时 CanSMBorTimeL2 时间尝试恢复;
(4)一直处于慢恢复直到成功恢复。
成功恢复标准,我在实际项目中使用方案2:
(1)CanSMBorTxConfirmationPolling 为 false,停留在BUS_OFF_CHECK状态没有超过时间参数CanSMBorTimeTxEnsured,在此时间段内,没有新的 Busoff 事件产生,则认为 Busoff恢复成功。
(2)CanSMBorTxConfirmationPolling 为 true,停留在 BUS_OFF_CHECK状态,直到检测到确实有一帧 Can 报文发送成功并给出了发送确认则认为 Busoff 恢复成功。这种情况下,需要调用 CanIf 的CanIf_GetTxConfirmationState 接口。
BUSOFF可参考下文:
3、切换波特率
勾选CanSMSetBaudrateApi选项,CanSM模块提供接口CanSM_SetBaudrate设置目标波特率,CanSM_ChangeBDProcess可以切换CAN总线通信波特率,但是只有在FULLCOM状态且没有Busoff 时才能调用CanSM_ChangeBDProcess,其他状态调用 CanSM_ChangeBDProcess会被拒绝。
4、CAN唤醒
当系统进入休眠后,CAN控制器也进入休眠状态。当发生CAN通道唤醒事件时,EcuM_StartWakeupSources 调用CanSM_StartWakeupSources()函数会触发CanSm发生CANSM_BSWM_S_NOCOM到CANSM_BSWM_WUVALIDTION的转变。
这个状态改变将会打开CanController和CanTrcv进入normal,此时trcv和controller具备了收发CAN报文的能力,但是CAN报文只能传递到CanIf,因为再往上需要打开相应的PDU组。此时,若收到报文,CanIf层的RxIndication函数会设置一个NewMessageRx的标志,此标志在EcuM_CheckValid会用到。EcuM_CheckValidation会调度CanIf_CheckValidation,在CanIf_CheckValidation函数中如果NewMessageRx标志如果被置位则调度EcuM_ValidateWakeupEvent。在EcuM_ValidateWakeupEvent函数中,判断是否满足唤醒条件,满足条件后会调度ComM_EcuM_WakeUpIndication函数里面做判断是否满足唤醒条件。
若满足条件,会调度Nm_PassiveStartUp,Nm_PassiveStartUp会调度CanNm_PassiveStartup,CanNm_PassiveStartup的调度将会使网络管理的状态由BusSleep模式跳转到RepeatMessage状态,这个状态的转换会调度CanSM_RequestComMode请求COMM_FULL_COMMUNICATION,这个请求会触发CanSM的状态由CANSM_BSWM_WUVALIDTION到CANSM_BSWM_S_PREFULLCOM的转变,之后进入到CANSM_BSWM_S_FULLCOM,同时ComM的状态进入到COMM_FULL_COMMUNICATION.
若不满足条件,会调用 CanSM 模块的CanSM_StopWakeupSource()函数,由CanSM将CAN收发器硬件重新设置为休眠状态。
详细调度可参看Autosar Can网络远程唤醒