前言

本文介绍CP AUTOSAR 架构下的CanSM组件,基于S32K312芯片、Vector提供的CBD包,使用DaVinci Configurator工具进行配置的经验。
CanSM组件位于Communication Services层,通常被ComM所调用。
CanSM组件负责管理CAN总线的状态。
在这里插入图片描述在这里插入图片描述

上图为CP AUTOSAR CAN网络架构。


一、CanSM功能概述

在这里插入图片描述CanSM是CAN网络状态管理器,ECU可能存在多路CAN,CanSM为ECU的每路CAN进行管理即该CAN网络能不能发送报文、接收报文、BUSOFF处理、ECU的CAN波特率切换、ECU的唤醒功能管理等,通过接收ComM的请求或者接口被调用,然后CanSM再调用CanIf组件,对CAN控制器或CAN收发器进行状态切换,切换完后将状态通知给ComM或BswM组件,ComM或BswM组件依据CanSM传来的当前通信模式来对IPDU组或NM进行开启关闭和切换,如果PN功能有用,也要将该状态通知给CanNM。

二、CanSM与其他组件的依赖关系

在这里插入图片描述从图上看到,CanSM与其他组件的依赖关系:

(一)、EcuM
EcuM组件负责对CanSM进行初始化,并与CanSM组件交互进行CAN的唤醒验证。

(二)、Os(SchM或Rte一部分)
Os任务或其他调度器负责调用CanSM组件的主循环函数,即CanSM_MainFunction()。

(三)、ComM
ComM调用CanSM的接口来请求改变CAN网络的通信模式并且CanSM将CAN网络的当前通信模式通知ComM组件。

(四)、CanIf
CanSM调用CanIf的接口来控制CAN控制器和CAN收发器的工作模式并且CanIf将CAN控制器和CAN收发器的事件通知给CanSM。

(五)、Dem
CanSM向Dem组件报告CAN总线一些特定的产生错误。

(六)、BswM
CanSM需要向BswM组件通知CAN总线特定模式的更改。

(七)、CanNm
CanSM需要向CanNm通知部分网络可用性,并且处理部分网络下的CanNm超时异常通知。

(八)、Det
CanSM组件向Det组件报告开发中和运行中的错误。

三、ECU online active / passive

当调用CanSM_SetEcuPassive()入参CanSM_Passive为TRUE时,CanSM应将模式为CANIF_ONLINE的CAN通道切换为CANIF_TX_OFFLINE_ACTIVE,通过调用CanIf_SetPduMode()来执行。
当调用CanSM_SetEcuPassive()入参CanSM_Passive为FALSE时,CanSM应将模式为CANIF_TX_OFFLINE_ACTIVE的CAN通道切换为CANIF_ONLINE,通过调用CanIf_SetPduMode()来执行。
CanSM_SetEcuPassive()通常被ComM调用,场景为BswM或Dcm需要关闭CAN通信或降低总线负载时调用。

四、CanSM状态机

在这里插入图片描述

如上图,是CanSM维护的单个CAN网络的状态机。

CanSM需要存储每个已配置了的CAN网络模式。

CanSM存储的通信模式有COMM_NO_COMMUNICATION、COMM_SILENT_COMMUNICATION、COMM_FULL_COMMUNICATION。

CanSM状态机应该在主循环里进行切换操作。

如果CanSM状态机处于CANSM_BSM_S_NOT_INITIALIZED下则拒绝ComM的网络请求。

如果CanSM调用CanIf_SetControllerMode()、CanIf_SetTrcvMode()、CanIf_ClearTrcvWufFlag()、CanIf_CheckTrcvWakeFlag()没有返回OK或者它们没有回调CanSM_ControllerModeIndication()、CanSM_TransceiverModeIndication()、CanSM_ClearTrcvWufFlagIndication()、CanSM_CheckTransceiverWakeFlagIndication()这些指示函数,次数超过了CanSMModeRequestReptitionMax那就向Det报告CANSM_E_MODE_REQUEST_TIMEOUT。

如果CanIf通过回调函数CanSM_ConfirmPnAvailability()告诉CanSM已经开启了CAN收发器的PN功能,CanSM需要调用CanNm_ConfirmPnAvailability()通知CanNm。

如果CanIf通过回调函数CanSM_ConfirmCtrlPnAvailability()告诉CanSM已经开启了CAN收发器的PN功能,CanSM需要调用CanNm_ConfirmPnAvailability()通知CanNm。

如果没有用到CanTrcv,则CanSM应该不调用CanIf_SetTrcvMode()。

CanSM应该存储每个CAN网络的请求配置,如果CanSM_RequestComMode()被成功调用。

CanSM应在每次成功更改CAN控制器模式后或触发BUSOFF后更改为CAN_CS_STOPPED后存储每个CAN控制器的内部模式。

(一)、状态机转化说明

1、Trigger
Trigger为每个状态机的触发条件。
(1)、PowerOn
上电后CanSM状态机应该为CANSM_BSM_NOT_INITIALIZED。

(2)、CanSM_Init
调用CanSM_Init()后CanSM状态机从CANSM_BSM_NOT_INITIALIZED切换为CANSM_BSM_S_PRE_NOCOM。

(3)、CanSM_DeInit
调用CanSM_DeInit()后CanSM状态机进入CANSM_BSM_NOT_INITIALIZED,此函数应该在CANSM_BSM_S_NOCOM下调用。

(4)、T_START_WAKEUP_SOURCE
CanSM状态机处于CANSM_BSM_S_PRE_NOCOM或者CANSM_BSM_S_NOCOM下时调用CanSM_StartWakeUpSource()开始唤醒源检测并且返回OK,CanSM状态切换为CANSM_BSM_WUVALIDATION。
该触发通常在ECU唤醒后由EcuM调用CanSM_StartWakeUpSource()进行触发或者进入NO_COM时检测到有唤醒标志则触发该动作。

(5)、T_STOP_WAKEUP_SOURCE
CanSM状态机处于CANSM_BSM_WUVALIDATION状态时,调用CanSM_StopWakeUpSource()停止唤醒源检测并且返回OK,CanSM状态切换为CANSM_BSM_S_PRE_NOCOM。
该触发通常在ECU唤醒后由EcuM调用CanSM_StartWakeUpSource()进行CAN收发器和CAN控制器的唤醒源检测,如果没有唤醒源则调用CanSM_StopWakeUpSource()。

(6)、T_FULL_COM_MODE_REQUEST
CanSM状态机处于CANSM_BSM_WUVALIDATION或CANSM_BSM_S_NOCOM下时调用CanSM_RequestComMode()并且入参为COMM_FULL_COMMUNICATION模式时,则CanSM状态机切换为CANSM_BSM_S_PRE_FULLCOM,或者CanSM状态机处于CANSM_BSM_S_SILENTCOM时使用COMM_FULL_COMMUNICATION模式切换为CANSM_BSM_S_FULLCOM。
该触发通常为应用层调用ComM_RequestComMode()请求进入FULL_COM模式,ComM再调用CanSM_RequestComMode()。

(7)、T_SILENT_COM_MODE_REQUEST
CanSM状态机处于CANSM_BSM_S_FULLCOM时,调用CanSM_RequestComMode()并且入参为COMM_SILENT_COMMUNICATION,则CanSM状态机切换为CANSM_BSM_S_SILENTCOM。

(8)、T_NO_COM_MODE_REQUEST
CanSM状态机处于CANSM_BSM_S_FULLCOM、CANSM_BSM_S_SILENTCOM、CANSM_BSM_S_SILENTCOM_BOR时,调用CanSM_RequestComMode()并且入参为COMM_NO_COMMUNICATION,则CanSM状态机切换为CANSM_BSM_S_PRE_NOCOM。
通常由应用层执行休眠流程时调用ComM_RequestComMode()进行触发。

(9)、T_BUS_OFF
CanSM状态机处于CANSM_BSM_S_SILENTCOM时,如果发生BUSOFF,在CAN BUSOFF中断里会调用CanSM_ControllerBusOff()就触发了T_BUS_OFF,状态机就切换到了CANSM_BSM_S_SILENTCOM_BOR。

2、Guarding condition
Guarding condition为每个状态机转化时的前置条件。
(1)、G_FULL_COM_MODE_REQUESTED
调用CanSM_RequestComMode()的模式请求是否为COMM_FULL_COMMUNICATION。

(2)、G_SILENT_COM_MODE_REQUESTED
调用CanSM_RequestComMode()的模式请求是否为COMM_SILENT_COMMUNICATION。

3、Effect
Effect为状态转换或特定事件发生时执行的动作或操作。
(1)、E_PRE_NOCOM
CanSM状态机处于CANSM_BSM_S_FULLCOM、CANSM_BSM_S_SILENTCOM、CANSM_BSM_S_SILENTCOM_BOR时,满足T_NO_COM_MODE_REQUEST则切换到CANSM_BSM_S_PRE_NOCOM状态机并且BswM_CanSM_CurrentState()被调用,入参CurrentState为CANSM_BSWM_NO_COMMUNICATION。

(2)、E_NOCOM
CanSM状态机处于CANSM_BSM_S_PRE_NOCOM状态切换到CANSM_BSM_S_NOCOM状态时,E_NOCOM作用是将所寻址的CAN网络的内部存储网络模式更改为COMM_NO_COMMUNICATION,如果该请求模式已存在,则调用ComM_BusSM_ModeIndication(),入参为E_NOCOM。

(3)、E_FULL_COM
CanSM状态机处于CANSM_BSM_S_PRE_FULLCOM状态切换到CANSM_BSM_S_FULLCOM状态时,有以下Effect:
1、如果ECU passive为FALSE,则CanIf_SetPduMode()被调用,入参PduModeRequest为CANIF_TX_OFFLINE_ACTIVE。

2、如果ECU passive为TRUE,则CanIf_SetPduMode()被调用,入参PduModeRequest为CANIF_ONLINE。

3、CanSM将调用ComM_BusSM_ModeIndication()入参ComMode为COMM_FULL_COMMUNICATION。

4、CanSM将调用BswM_CanSM_CurrentState()入参CurrentState为CANSM_BSWM_FULL_COMMUNICATION。

(4)、E_FULL_TO_SILENT_COM
CanSM状态机处于CANSM_BSM_S_FULLCOM状态切换到CANSM_BSM_S_SILENTCOM状态时,有以下Effect:
1、CanSM将调用BswM_CanSM_CurrentState()入参CurrentState为CANSM_BSWM_SILENT_COMMUNICATION。

2、CanSM将调用CanIf_SetPduMode()入参PduModeRequest为CANIF_TX_OFFLINE。

3、CanSM将调用ComM_BusSM_ModeIndication()入参ComMode为COMM_SILENT_COMMUNICATION。

(5)、E_BR_END_FULL_COM
CanSM状态机处于CANSM_BSM_S_CHANGE_BAUDRATE状态切换到CANSM_BSM_S_FULLCOM状态时,产生的效果与E_FULL_COM一样。

(6)、E_BR_END_SILENT_COM
CanSM状态机处于CANSM_BSM_S_CHANGE_BAUDRATE状态切换到CANSM_BSM_S_SILENTCOM状态时,产生的效果与E_FULL_TO_SILENT_COM一样。

(7)、E_SILENT_TO_FULL_COM
CanSM状态机处于CANSM_BSM_S_SILENTCOM状态切换到CANSM_BSM_S_FULLCOM状态时,产生的效果与E_FULL_COM一样。

(二)、Sub state machine CANSM_BSM_WUVALIDATION

在这里插入图片描述
CanSM状态机处于CANSM_BSM_S_PRE_NOCOM或者CANSM_BSM_S_NOCOM下时EcuM调用CanSM_StartWakeUpSource()进入CANSM_BSM_WUVALIDATION状态机进行开启CAN控制器和CAN收发器(通常是ECU唤醒后EcuM调用触发),开启后EcuM如果没有检测到CAN的唤醒源或者超时则调用CanSM_StopWakeUpSource()后切换到CANSM_BSM_S_PRE_NOCOM状态机。该状态下需要设置CAN控制器和CAN收发器的状态。

CANSM_BSM_WUVALIDATION状态下CanSM先调用CanIf_SetTrcvMode()将CanTrcv设置为NORMAL模式,如果在等待期间超时后(CANSM_MODEREQ_REPEAT_TIME)继续设置,通常还会有个重复设置次数,如果超过该次数则退出该模式,设置成功后收到CanIf调用CanSM_TransceiverModeIndication()通知CanSM收发器模式设置成功。

接着CanSM调用CanIf_SetControllerMode()将控制器设置为STOPPED模式,设置成功后CanIf调用CanSM_ControllerModeIndication()通知CanSM控制器模式设置成功。超时机制同上段同理。

最后将CAN控制器设置为STARTED模式。

有唤醒源后退出CANSM_BSM_WUVALIDATION状态机应用层会调用ComM的接口请求进入FULL_COM模式,ComM会调用CanSM_RequestComMode()模式为FULL_COM请求CanSM进入CANSM_BSM_S_PRE_FULLCOM状态机。

(三)、Sub state machine CANSM_BSM_S_PRE_NOCOM

在这里插入图片描述当ComM调用CanSM_RequestComMode()请求进入NO_COM模式或CanSM_Init执行后进入CANSM_BSM_S_PRE_NOCOM状态机,该状态机下对CAN控制器和CAN收发器设置为不通信模式。

当CanTrcvPnEnabled为FALSE,进入CANSM_BSM_DeinitPnNotSupported子状态,否则进入CANSM_BSM_DeinitPnSupported子状态。

1、CANSM_BSM_DeinitPnSupported
在这里插入图片描述
进入该状态机后CanSM会调用CanIf_ClrTrcvWufFlag()清除CAN收发器的唤醒标志,若清除成功CanIf会调用CanSM_ClearTrcvWufFlagIndication()通知CanSM清除成功。

接着CanSM调用CanIf_SetControllerMode()将CAN控制器设置为STOPPED,若设置成功CanIf会调用CanSM_ControllerModeIndication()通知CanSM设置成功。

接着CanSM调用CanIf_SetTrcvMode()将CAN收发器设置为NORMAL,若设置成功CanIf会调用CanSM_TransceiverModeIndication()通知CanSM设置成功。

接着CanSM调用CanIf_SetTrcvMode()将CAN收发器设置为STANDBY,若设置成功CanIf会调用CanSM_TransceiverModeIndication()通知CanSM设置成功。

接着CanSM调用CanIf_SetControllerMode()将CAN控制器设置为SLEEP,若设置成功CanIf会调用CanSM_ControllerModeIndication()通知CanSM设置成功。

CAN控制器进入SLEEP成功后CanSM调用CanIf_CheckTrcvWufFlag()查询CAN收发器是否有唤醒标志,检测完后CanIf调用CanSM_CheckTrcvWufFlagIndication()通知CanSM,结束本状态机,退出后如果有唤醒标志存在则进入CANSM_BSM_WUVALIDATION状态机。

如果CAN控制器进入SLEEP超时,则调用CanIf_CheckTrcvWufFlag()查询CAN收发器是否有唤醒标志,检测完后CanIf调用CanSM_CheckTrcvWufFlagIndication()通知CanSM,本状态机又回到S_PN_CLEAR_WUF阶段清除收发器的唤醒标志再进入SLEEP流程。

该状态机内的切换都有CANSM_MODEREQ_REPEAT_TIME超时时间,超时后重新执行上一个流程,若超过若干次数则退出本状态机。

2、CANSM_BSM_DeinitPnNotSupported
在这里插入图片描述
该状态机与CANSM_BSM_DeinitPnSupported相比不需要执行CAN收发器的唤醒标志清除动作,其他都一样。

CANSM_BSM_S_PRE_NOCOM状态机执行完后进入CANSM_BSM_S_NOCOM状态机,如果上层没调用CanSM_StartWakeUpSource()的话。

(四)、Sub state machine CANSM_BSM_S_SILENTCOM_BOR

在这里插入图片描述
在处于FULL_COM时如果调用ComM的请求为SILENT_COM,则会切到CANSM_BSM_S_SILENTCOM状态机,在CANSM_BSM_S_SILENTCOM状态机时CAN控制器处于TX_OFFLINE模式,数据禁止由CAN驱动发出去,这时候如果CAN邮箱里有正在要发送的数据可能会产生BUSOFF,就进入了CANSM_BSM_S_SILENTCOM_BOR状态机。

进入该状态机后CanSM需要调用Dem_SetEventStatus()通知Dem,EventId为CANSM_E_BUS_OFF。

产生BUSOFF时BUSOFF中断里可能会调用CanIf_SetControllerMode()将控制器设置为STOP模式,然后调用CanIf_ControllerBusOff()通知CanIf,CanIf再调用CanSM_ControllerBusOff()通知CanSM,CanSM再调用CanIf_SetControllerMode()将控制器设置为STARTED模式。

设置成功后CanIf会调用CanSM_ControllerModeIndication()通知CanSM,接着退出该状态机,返回到CANSM_BSM_S_SILENTCOM,如果在CANSM_MODEREQ_REPEAT_TIME内没有收到Indication则重新设置控制器。

退出该状态机后如果ComM的请求为NO_COM则进入CANSM_BSM_S_PRE_NOCOM状态机。

(五)、Sub state machine CANSM_BSM_S_PRE_FULLCOM

在这里插入图片描述CANSM_BSM_S_PRE_FULLCOM状态机由CANSM_BSM_WUVALIDATION或CANSM_BSM_S_NOCOM状态机下经过应用层调用ComM_RequestComMode()请求FULL_COM触发进入,该状态机设置CAN控制器和收发器为正常通信模式。

首先CanSM调用CanIf_SetTrcvMode()将CAN收发器设置为NORMAL模式,成功后收到CanIf的通知,接着再调用CanIf_SetControllerMode()将CAN控制器设置为STOPPED模式,成功后收到CanIf的通知,再将CAN控制器设置为STARTED模式,最后退出该状态机进入到CANSM_BSM_S_FULLCOM状态机并且执行E_FULL_COM动作。

其中任一状态机有超时重试机制。

(六)、Sub state machine CANSM_BSM_S_FULLCOM

在这里插入图片描述在该状态机下CAN能正常收发通信。

如果之前没发生过BUSOFF会进入S_NO_BUS_OFF状态,期间如果上层调用CanSM_ChangeBaudrate()则退出CANSM_BSM_S_FULLCOM进入CANSM_BSM_S_CHANGE_BAUDRATE状态机并且调用BswM_CanSM_CurrentState()通知BswM入参为CANSM_BSWM_CHANGE_BAUDRATE,CanSM_ChangeBaudrate()只有在没有发生BUSOFF和FULLCOM的情况下调用。

期间如果ECU发生BUSOFF,CanIf调用CanSM_ControllerBusOff()通知CanSM进入了BUSOFF,CanSM需要对相应的CAN控制器进行BUSOFF恢复动作,如果ECU有多个CAN控制器在同一个网络内,有一个CAN控制器发生BUSOFF,那么ECU应该对其他CAN控制器也进行恢复动作。BUSOFF发生后CanSM需要调用BswM_CanSM_CurrentState()入参为CANSM_BSWM_BUS_OFF和ComM_BusSM_ModeIndication()入参为COMM_SILENT_COMMUNICATION通知BswM和ComM做相应的处理,并且调用Dem_SetEventStatus()入参为CANSM_E_BUS_OFF。

发生BUSOFF代表ECU不能发出数据了,一般会进入CAN错误中断,在CAN错误中断会调用CanIf_SetControllerMode()入参为CAN_CS_STOP对CAN控制器进行停止。

发生BUSOFF后会进入S_RESTART_CC状态机,调用CanIf_SetControllerMode()入参为CAN_CS_STARTED对CAN控制器进行开启操作(相当于CAN控制器重启),若切换成功CanIf调用CanSM_ControllerModeIndication()通知切换成功,否则超时时间到了后继续尝试开启CAN控制器。

CAN控制器开启成功后应该调用CanIf_SetPduMode()将控制器模式设置为CANIF_TX_OFFLINE,即允许接收不允许发送。

如果CanSMEnableBusOffDelay为FALSE,会在CanSMBorTimeL1或CanSMBorTimeL2时间到了后切换到S_BUS_OFF_CHECK状态机,即快慢恢复,否则该延时时间自定义,可以通过CALLOUT函数CanSMGetBusOffDelayFunction。

延时时间到了后如果之前的模式为Passive,则要调用CanIf_SetPduMode()将控制器设置为CANIF_ONLINE否则为CANIF_TX_OFFLINE_ACTIVE。接着调用BswM_CanSM_CurrentState()入参为CANSM_BSWM_FULL_COMMUNICATION和ComM_BusSM_ModeIndication()入参为COMM_FULL_COMMUNICATION。

在S_BUS_OFF_CHECK状态机下如果还发生BUSOFF即触发CAN错误中断,则又切换到S_RESTART_CC。

如果CANSM_BOR_TX_CONFIRMATION_POLLING为disabled,在CANSM_BOR_TIME_TX_ENSURED时间到了都没发生BUSOFF也就是触发CAN错误中断,那就切换到S_NO_BUS_OFF状态机,否则直到调用CanIf_GetTxConfirmationState()返回CANIF_TX_RX_NOTIFICATION为止。切换回S_NO_BUS_OFF说明BUSOFF恢复成功,调用Dem_SetEventStatus()将CANSM_E_BUS_OFF设置为DEM_EVENT_STATUS_PASSED。

在这里插入图片描述

在S_NO_BUS_OFF状态机下如果发生T_TX_TIMEOUT_EXCEPTION即CanNm的NM发送超时会调用CanSM_TxTimeoutException()通知CanSM,CanSM先调用CanIf_SetControllerMode()设置为CAN_CS_STOP,再设置为CAN_CS_STARTED,设置成功后调用CanIf_SetPduMode()将控制器设置为CANIF_ONLINE,回到S_NO_BUS_OFF。

(七)、Sub state machine CANSM_BSM_S_CHANGE_BAUDRATE

在这里插入图片描述
在FULL_COM下并且没有BUSOFF的话上层调用CanSM_ChangeBaudrate()会进入CANSM_BSM_S_CHANGE_BAUDRATE状态机。

进入该状态机后CanSM会调用CanIf_SetBaudrate()设置CAN控制器波特率,如果返回NOT_OK,会先调用CanIf_SetControllerMode()将CAN控制器设置为STOP,超时则重新设置,若设置成功则调用ComM_BusSM_ModeIndication()入参为COMM_NO_COMMUNICATION通知ComM,再调用CanIf_SetBaudrate()重新设置波特率,接着再调用CanIf_SetControllerMode()将CAN控制器设置为START。

CanSM_ChangeBaudrate()返回OK后如果上一次的ComM_Mode为COMM_NO_COMMUNICATION则退出该状态机进入CANSM_BSM_S_PRE_NOCOM状态机,否则退出进入CANSM_BSM_S_SILENTCOM或CANSM_BSM_S_FULLCOM状态机。

五、BUSOFF快慢恢复

在这里插入图片描述
BUSOFF产生原因一般为CAN总线电平变化有短路或断路或阻抗匹配不对或其他,或ECU本身波特率不对或报文发送失败。

REC或TEC累加一次后会进入主动错误状态,REC是收到总线上其他ECU发的错误帧后会累加,TEC是ECU本身检测到发送错误会累加,REC或TEC累加到大于127个会进入被动错误状态,主动错误状态ECU会发主动错误帧,被动错误状态会发被动错误帧,在被动错误状态下TEC会继续累加而REC不会,若ECU没接收到错误帧或发送成功,REC或TEC会减小。

当TEC累加到大于255后ECU便触发CAN错误中断进入BUSOFF处理流程,BUSOFF处理中进行CAN控制器的重启,若检测到总线上有128此连续的11个BIT的隐形位便认为BUSOFF恢复MCU不会再进入CAN错误中断,TEC和REC清零,如使用500Kbps的经典CAN帧,1 bit = 2µs,故障节点重新参与通信的最快时间 = 128 *11 * 2 = 2816µs = 2.816ms。

触发CAN错误中断后,软件会先关闭CAN控制器,应用层停止收发报文,为了防止影响总线上的其他节点,然后再开启CAN控制器,应用层只允许接收报文不允许发送报文,接着快恢复时间到,允许应用层发送报文,若在Bor Time Tx Ensured时间内没发生CAN错误中断软件里则认为恢复成功,否则BUSOFF次数加1,次数大于Bor Counter L1 To L2后,恢复时间改为慢恢复时间,这是为了防止ECU的CAN控制器重启次数过于频繁影响CAN总线,快恢复和慢恢复参数分别为Bor Time L1和Bor Time L2.

BUSOFF在恢复期间,如果上层不主动请求释放网络,NM状态不会切换到RSS,还会停留在NOS。

产生BUSOFF后ECU应该停止监测其他节点的应用报文,在这期间就算没收到其他节点的应用报文也不应该记录通信丢失DTC。

六、主要代码和参数描述

(一)、Std_ReturnType CanSM_RequestComMode( NetworkHandleType CanSM_NetworkHandle, ComM_ModeType CanSM_RequestedComMMode )
被ComM调用,收到对应的请求模式时CanSM切换状态机改变CAN控制器和CAN收发器的模式。

(二)、Std_ReturnType CanSM_StartWakeupSources( NetworkHandleType CanSM_NetworkHandle )
被EcuM调用,执行唤醒检测流程时被调用,CanSM会将CAN控制器和CAN收发器设置为STARTED和NORMAL。

(三)、void CanSM_ControllerBusOff( uint8 CanSM_ControllerId )
回调函数,当触发BUSOFF中断时被调用,用来通知CanSM有BUSOFF事件。

(四)、
void CanSM_ConfirmPnAvailability( uint8 CanSM_TransceiverId )
void CanSM_ConfirmCtrlPnAvailability( uint8 ControllerId )
回调函数,当CAN收发器和CAN控制器PN功能使能,CanIf会分别调用这两个函数通知CanSM PN功能启用了,这两个函数里CanSM又会调用CanNm_ConfirmPnAvailability()通知CanNm。
这两个函数被调用的场景比如CanTrcv PN功能宏定义开启后,说明ECU本身需要PN功能,收发器通常选的特定帧唤醒的,当ECU休眠后被唤醒,说明是特定帧唤醒的,唤醒后CanSM里会调用CanIf设置收发器模式,在设置的过程中,CanTrcv发现有POR标志即上电唤醒,便调用CanSM_ConfirmPnAvailability()。

(五)、void CanSM_TxTimeoutException( NetworkHandleType Channel )
回调函数,当CanNm发现NM PDU发送超时时,调用该函数进入TX_TIMEOUT_EXCEPTION状态机,对CAN控制器进行重启操作。

七、DaVinci Configurator主要配置

(一)、CanSMGeneral
在这里插入图片描述CanSM的通用配置,这里可以添加BUSOFF开始前后的CALLOUT函数用来自定义处理BUSOFF、是否开启波特率设置函数、是否开启被动模式的设置函数等。
如果有用到J1939Nm需要配合BUSOFF开始前后CALLOUT使用。

(二)、CanSMConfiguration
在这里插入图片描述这里添加控制器模式切换的超时时间和最大次数。

在这里插入图片描述这里设置快慢恢复的参数。
Bor Counter L1 To L2:
如果BUSOFF发生次数小于该数,则BUSOFF恢复参数使用Bor Time L1,否则使用Bor Time L2。

Bor Time L1:
快恢复参数。

Bor Time L2:
慢恢复参数。

Bor Time Tx Ensured:
确认BUSOFF恢复的时间,该时间内都没发生BUSOFF,则退出恢复流程,认为已经恢复了。

Bor Tx Confirmation Polling:
使能后,确认BUSOFF恢复的动作不使用Bor Time Tx Ensured参数而使用CanIf_GetTxConfirmationState()来确认。

在这里插入图片描述
定义发生BUSOFF时向Dem报错的DTC。

八、使用范例

无。

九、参考资料

AUTOSAR_CP_SWS_CANInterface
AUTOSAR_CP_SWS_CANStateManager
AUTOSAR_EXP_LayeredSoftwareArchitecture
AUTOSAR_CP_SWS_CANTransceiverDriver
AUTOSAR_CP_SWS_COMManager
TechnicalReference_CanSM
AUTOSAR_CP_SWS_CANNetworkManagement
AUTOSAR_CP_SWS_BSWModeManager
ISO7498
ISO11898
ISO11519
ISO15765
ISO14229
can2.0
can_fd_spec


总结

CanSM接收来自ComM的请求对CAN控制器和CAN收发器进行模式切换,复杂的状态机切换CanSM都自己实现了,其他组件不需要关心状态机的切换。
CanSM里为什么在切换控制器时都要先切到STOP再切到STARTED或SLEEP,是因为CanDrv里规定了如此流程:
在这里插入图片描述
CanTrcv也一样,有一套自己的状态机流程:
在这里插入图片描述

本文文字描述多点,更像是本人的使用笔记,仅供参考,如有不对地方欢迎指教。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐