CanSM模块学习

一、CanSM简介

        CanSM全称CAN State Management,CAN状态管理。这里管理的状态其实是对应其总线的通信状态,所以CanSM模块管理的就是CAN总线的通信状态,而这里的通信状态则包含能不能发送报文,能不能接收报文,总线上有没有错误等。

        CanSM模块在AUTOSAR架构中的位置:

        由上而下,CanSM接收其他模块的总线状态切换请求并通知CanIf模块去执行,如:28服务开关通信;

        由下而上,CanSM接收CanIf模块的总线状态切换反馈并汇报给其他模块,如发生CAN总线BUSOFF。        

二、CanSM与各模块间的交互

其他模块与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可参考下文:

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网络远程唤醒

  • 28
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值