CANSM
本文最后更新于 153 天前,其中的信息可能已经有所发展或是发生改变。

参考文档:AutoSAR CANSMBUSOFF机制

简介

CAN状态管理器(CAN State Manager,CanSM)。CanSM位于BSW的通信服务层,它与通信硬件抽象层和系统服务层交互。下图所示为CanSM在AUTOSAR BSW中的位置。

下图简要描述了CanSM模块需要其他模块间的交互。

关于模块交互、依赖,在此前的模块介绍中都没做介绍,但CanSM模块与依赖模块的交互我们需要了解一下,因为CanSM作为CAN网络的状态管理器,与其他模块的交互对于我们理解掌握整个CAN通信系统的运行有重要的作用。这里捡出几个重要相关的交互模块:

  • EcuM(ECU State Manager):EcuM模块初始化CanSM,与CanSM交互进行CAN唤醒的验证;
  • SchM(BSW Scheduler):BSW调度程序模块调用CanSM模块的main函数,这是周期处理CanSM模块任务所必需的;
  • ComM(Communication Manager): ComM模块使用CanSM模块的API请求CAN网络的通信模式,不同CAN网络用唯一的network handle 识别,CanSM通知ComM当前CAN网络的通信模式;
  • CanIf(CAN Interface):CanSM使用CanIf的API控制分配到CAN网络的CAN控制器和CAN收发器的运行模式。CanIf将CAN控制器或者收发器的状态通知给CanSM。
  • BswM(Basic Software Mode Manager):CanSM通知BswM模块总线模式的改变。
  • CanNM(CAN Network Manager):CanSM模块需要向CanNm模块通知部分网络可用性,并应在部分网络的情况下处理通知的CanNm超时异常。

在一个ECU上可能存在多个类型的通信网络。每个通信网络都以唯一的网络handle代表,当ComM请求网络通信模式时,根据配置它知道那个handle分配给哪种(个)网络,当网络为CAN网络时,ComM通过CanSM请求CAN网络模式。
CanSM负责CAN网络的控制流抽象,它根据ComM模块的请求更改CAN网络的通信模式。因此CanSM模块使用CanIf的API,CanIf负责所配置的CAN控制器和收发器的控制流抽象(CanIf模块的数据流抽象与CanSM模块无关)。CAN控制器和CAN收发器的模式改变都会被CanIf通知到CanSM,依据该通知和CAN网络状态机的状态,CanSM模块通知ComM和BswM。

CAN网络状态机

下图描述的是CanSM状态机(CANSM_BSM)行为。INDICATED表示验证的意思;WUVALIDATION 表示唤醒验证;BOR表示bus-off recovery;CC表示CAN Controller

CanSM状态机的流转是被上图一系列条件所触发跳转,按类型分为:触发器、防护条件、作用。

触发器

PowerOn

上电后,CanSM状态机处于CANSM_BSM_NOT_INITIALIZED状态。

CanSM_Init

如果CanSM模块被请求执行CanSM_Init,该行为会触发CanSM状态机为所有配置的CAN网络执行CanSM_Init,状态机处于CANSM_BSM_S_PRE_NOCOM状态。

CanSM_DeInit

如果CanSM模块被请求执行CanSM_DeInit,该行为会触发CanSM状态机为所有配置的CAN网络执行CanSM_DeInit,状态机处于CANSM_BSM_NOT_INITIALIZED状态,调用CanSM_DeInit的函数保证CanSM处于CANSM_BSM_NOCOM状态。

T_START_WAKEUP_SOURCE

如果API请求 CanSM_StartWakeUpSource返回E_OK,将会以参数T_START_WAKEUP_SOURCE触发CanSM状态机,跳转进入CANSM_BSM_WUVALDATION状态。

T_STOP_WAKEUP_SOURCE

如果API请求 CanSM_StopWakeUpSource返回E_OK,将会以参数T_STOP_WAKEUP_SOURCE触发CanSM状态机,跳转进入CANSM_BSM_S_PRE_NOCOM状态。

T_FULL_COM_MODE_REQUEST

如果API请求CanSM_RequestComMode,且使用参数ComM_Mode = COMM_FULL_COMMUNICATION ,那么将会以参数T_FULL_COM_MODE_REQUEST触发CanSM状态机跳转,进入CANSM_BSM_S_PRE_FULLCOM。

T_SILENT_COM_MODE_REQUEST

如果API请求CanSM_RequestComMode,且使用参数ComM_Mode = COMM_SILENT_COMMUNICATION ,那么将会以参数T_SILENT_COM_MODE_REQUEST触发CanSM状态机从CANSM_BSM_S_FULLCOM跳转,进入CANSM_BSM_S_SILENTCOM。

通常此过程对应的应用场景是CanNM网络管理中,网络模式从network模式到Prepare bus-sleep模式的切换

T_NO_COM_MODE_REQUEST

如果API请求CanSM_RequestComMode,且使用参数ComM_Mode = COMM_NO_COMMUNICATION ,那么将会以参数T_NO_COM_MODE_REQUEST触发CanSM状态机从跳转,进入CANSM_BSM_S_PRE_NOCOM。

根据ComM的配置,ComM将决定是先请求COMM_SILENT_COMMUNICATION,再请求COMM_NO_COMMUNICATION。或者直接请求COMM_NO_COMMUNICATION(omMNmVariant=LIGHT)

T_BUS_OFF

调用回调函数CanSM_ControllerBusOff将会以参数T_BUS_OFF触发CanSM状态机。

防护条件

G_FULL_COM_MODE_REQUESTED

当上一个通过CanSM_RequestComMode请求接收到的通信模式请求为COMM_FULL_COMMUNICATION时,将评估CanSM_BSM状态机的防护条件G_FULL_COM_MODE_REQUESTED。

G_SILENT_COM_MODE_REQUESTED

当上一个通过CanSM_RequestComMode请求接收到的通信模式请求为COMM_SILENT_COMMUNICATION时,将评估CanSM_BSM状态机的防护条件G_SILENT_COM_MODE_REQUESTED。

作用

E_PRE_NOCOM

CanSM_BSM状态机的作用E_PRE_NOCOM应为相应的CAN网络调用API BswM_CanSM_CurrentState,参数Network:= CanSMComMNetworkHandleRef和current state:= CanSM _BSWM _NO _COMMUNICATION。

E_NOCOM

CanSM_BSM状态机的作用E_NOCOM将对应CAN网络的内部存储网络模式更改为COMM_NO_COMMUNICATION。
如果网络的通信模式请求已经存在,且存储的通信模式请求为COMM_NO_COMMUNICATION,则CanSM_BSM状态机的E_NOCOM应调用API ComM_BusSM_ModeIndication,参数为Channel:= CanSMComMNetworkHandleRef和ComMode := COMM_NO_COMMUNICATION。

E_FULL_COM

如果ECU节点不是被动节点,CanSM_BSM状态机的作用E_FULL_COM应首先为CAN网络的每个已配置CAN控制器调用API CanIf_SetPduMode,使用参数ControllerId := CanSMControllerId 和 PduModeRequest := CANIF_ONLINE。
如果ECU节点为被动节点,CanSM_BSM状态机的作用E_FULL_COM应首先为CAN网络的每个已配置CAN控制器调用API CanIf_SetPduMode,使用参数ControllerId := CanSMControllerId 和 PduModeRequest := CANIF_TX_OFFLINE_ACTIVE。
然后,在CanSM状态机的E_FULL_COM上下文中CanSM为相应CAN网络调用API ComM_BusSM_ModeIndication,使用参数 Channel := CanSMComMNetworkHandleRef 和 ComMode := COMM_FULL_COMMUNICATION。
再然后,在CanSM状态机的E_FULL_COM上下文中CanSM为相应CAN网络调用API BswM_CanSM_CurrentState,使用参数Network := CanSMComMNetworkHandleRef 和 CurrentState := CANSM_BSWM_FULL_COMMUNICATION。

E_FULL_TO_SILENT_COM

CanSM_BSM状态机的作用E_FULL_TO_SILENT_COM应首先为CAN网络的每个已配置CAN控制器调用API BswM_CanSM_CurrentState,使用参数Network := CanSMComMNetworkHandleRef 和 CurrentState := CANSM_BSWM_SILENT_COMMUNICATION。
CanSM_BSM状态机的的作用E_FULL_TO_SILENT_COM应然后调用API CanIf_SetPduMode,参数为controller id:= CanSMControllerId和PduModeRequest:= CanIf _TX _OFFLINE。
CanSM_BSM状态机的作用E_FULL_TO_SILENT_COM应再然后调用ComM_BusSM_ModeIndication,参数为Channel := CanSMComMNetworkHandleRef 和ComMode := COMM_SILENT_COMMUNICATION。

E_BR_END_FULL_COM

CanSM_BSM状态机的效果E_BR_END_FULL_COM的作用与E_FULL_COM相同。

E_BR_END_SILENT_COM

CanSM_BSM状态机的效果E_BR_END_SILENT_COM的作用与E_FULL_TO_SILENT_COM相同

E_SILENT_TO_FULL_COM

CanSM_BSM状态机的效果E_SILENT_TO_FULL_COM的作用与E_FULL_COM相同。

子状态机 CANSM_BSM_S_PRE_NOCOM

在CANSM_BSM_S_PRE_NOCOM状态下,cansm模块会执行以下操作:

  • 在进入该状态机之前,调用BswM_CanSM_CurrentState函数,通知BswM模块当前的网络状态为CANSM_BSWM_PRE_NO_COM。
  • 在该状态机中,调用CanIf_SetControllerMode函数,将CAN控制器的模式设置为CAN_CS_STARTED,以启动CAN控制器。
  • 如果CanIf_SetControllerMode函数返回E_OK,或者收到CanSM_ControllerModeIndication回调函数的通知,表示CAN控制器已经成功启动,那么该状态机将根据最新的通信模式请求,选择进入下一个子状态。如果请求的通信模式是COMM_FULL_COMMUNICATION,那么进入CANSM_BSM_S_PRE_FULLCOM状态机;如果请求的通信模式是COMM_SILENT_COMMUNICATION,那么进入CANSM_BSM_S_SILENTCOM状态机;如果请求的通信模式是COMM_NO_COMMUNICATION,那么进入CANSM_BSM_S_NOCOM状态机。
  • 如果CanIf_SetControllerMode函数返回E_NOT_OK,或者没有收到CanSM_ControllerModeIndication回调函数的通知,那么该状态机将重复尝试调用CanIf_SetControllerMode函数,直到达到配置的最大重试次数T_REPEAT_MAX。如果达到最大重试次数,那么该状态机将调用Dem_SetEventStatus函数,报告事件ID为CANSM_E_MODE_REQUEST_TIMEOUT的故障,并进入CANSM_BSM_S_NOCOM状态机。

防护条件 CANSM_BSM_G_PN_NOT_SUPPORTED

子状态机CANSM_BSM_S_PRE_NO_COM的保护条件CANSM_BSM_G_PN_NOT_SUPPORTED应评估配置参数CanTrcvPnEnabled是否为假(可通过参考CanSMTransceiverId获得)或是否根本未配置CanSMTransceiverId。

防护条件 CANSM_BSM_G_PN_SUPPORTED

子状态机CANSM_BSM_S_PRE_NO_COM的保护条件CANSM_BSM_G_PN_SUPPORTED应评估是否配置了CanSMTransceiverId,以及配置参数CanTrcvPnEnabled是否为真(可通过参考CanSMTransceiverId获得)。

子状态机 CANSM_BSM_DeInitPnSupported

在状态 S_PN_CLEAR_WUF的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_PN_CLEAR_WUF,CANSM模块就执行DO_CLEAR_TRCV_WUF操作,重复API请求CanIf_ClrTrcvWufFlag,并使用配置的收发器作为API函数参数。

防护条件 G_PN_CLEAR_WUF_E_OK

如果状态S_PN_CLEAR_WUF下调用的API返回都为E_OK,应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_PN_CLEAR_WUF_E_OK。

触发器 T_CLEAR_WUF_INDICATED

如果函数CanSM_ClearTrcvWufFlagIndication的参数Transceiver与CAN网络的已配置CAN收发器相匹配,则回调函数CanSM _ ClearTrcvWufFlagIndication应以T_CLEAR_WUF_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。

触发器 T_CLEAR_WUF_TIMEOUT

在回调函数CANSM_ClearTrcvWufFlagIndication超时CANSM_MODEREQ_REPEAT_TIME后,将以T_CLEAR_WUF_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。

在状态 S_CC_STOPPED中的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_CC_STOPPED,CANSM模块就应执行DO_SET_CC_MODE_STOPPED操作,因此,如果当前CAN控制器模式不为CAN_CS_STOPPED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中请求的ControllerMode为CAN_CS_STOPPED。

防护条件 G_CC_STOPPED_E_OK

如果状态S_CC_STOPPED中的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_CC_STOPPED_E_OK。

触发器 T_CC_STOPPED_INDICATED

如果在分别请求停止CAN网络的CAN控制器之后,CanSM模块已经获得CAN网络的已配置CAN控制器的所有模式指示,将以T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。

触发器 T_CC_STOPPED_TIMEOUT

控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,将以T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。

在状态S_TRCV_NORMAL下的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_TRCV_NORMAL,CANSM模块就应执行DO_SET_TRCV_MODE_NORMAL操作,为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中使用参数TransceiverMode等于CANTRCV_TRCVMODE_NORMAL。

防护条件 G_TRCV_NORMAL_E_OK

如果在状态S_TRCV_NORMAL下的API调用返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_TRCV_NORMAL_E_OK。

触发器 T_TRCV_NORMAL_INDICATED

如果CanSM模块在相应的请求后已获得CAN网络中已配置的CAN收发器的CANTRCV_TRCVMODE_NORMAL模式指示,这将以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。

触发器 T_TRCV_NORMAL_TIMEOUT

收发器正常指示超时CANSM_MODEREQ_REPEAT_TIME后,该条件将以T_TRCV_NORMAL_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。

在状态 S_TRCV_STANDBY的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_TRCV_STANDBY,CANSM模块就应执行动作DO_SET_TRCV_STANDBY,并为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中TransceiverMode等于CANTRCV_TRCVMODE_STANDBY。

防护条件 G_TRCV_STANDBY_E_OK

如果在状态S_TRCV_STANDBY下的API调用返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_TRCV_STANDBY_E_OK。

触发器 T_TRCV_STANDBY_INDICATED

如果CanSM模块在相应请求后已获得CAN网络中已配置的CAN收发器的CANTRCV_TRCVMODE_STANDBY模式指示,这将以T_TRCV_STANDBY_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。

触发条件 T_TRCV_STANDBY_TIMEOUT

收发器待机指示超时CANSM_MODEREQ_REPEAT_TIME后,该条件将T_TRCV_STANDBY_TIMEOUT以触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。

在状态 G_CC_SLEEP_E_OK 的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_CC_SLEEP,CANSM模块就应执行动作DO_SET_CC_MODE_SLEEP,如果当前CAN控制器模式不同,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_SLEEP。

防护条件 G_CC_SLEEP_E_OK

如果在状态G_CC_SLEEP_E_OK下的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_CC_SLEEP_E_OK。

触发器 T_CC_SLEEP_INDICATED

如果在将CAN网络的CAN控制器设置为睡眠模式的相应请求之后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_CC_SLEEP_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。

触发器 CANSM_BSM_T_CC_SLEEP_TIMEOUT

对于控制器睡眠模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件将以CANSM_BSM_T_CC_SLEEP_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。

在状态 S_CHECK_WFLAG_IN_CC_SLEEP的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_CHECK_WFLAG_IN_CC_SLEEP,CANSM模块就会执行动作DO_CHECK_WFLAG,重复API请求CanIf _CheckTrcvWakeFlag,并使用网络已配置CAN收发器作为收发器参数。

防护条件 G_CHECK_WFLAG_E_OK

如果在状态S_CHECK_WFLAG_IN_CC_SLEEP或S_CHECK_WFLAG_IN_NOT_CC_SLEEP下的API调用返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_CHECK_WFLAG_E_OK。

触发器 T_CHECK_WFLAG_INDICATED

如果CanSM_CheckTransceiverWakeFlagIndication的函数参数Transceiver与CAN网络的已配置CAN收发器相匹配,则回调函数CanSM_CheckTransceiverWakeFlagIndication应以T_CHECK_WFLAG_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。

触发器 T_CHECK_WFLAG_TIMEOUT

在回调函数CanSM_CheckTransceiverWakeFlagIndication超时CANSM_MODEREQ_REPEAT_TIME后,该条件将以T_CHECK_WFLAG_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。

在状态 S_CHECK_WFLAG_IN_NOT_CC_SLEEP 的操作

只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_CHECK_WFLAG_IN_NOT_CC_SLEEP,CANSM模块就会执行动作DO_CHECK_WFLAG,重复API请求CanIf_CheckTrcvWakeFlag,并使用相关网络的已配置CAN收发器作为收发器参数。

子状态机 CANSM_BSM_DeInitPnNotSupported

在状态 S_CC_STOPPED 的操作

只要子状态机CANSM_BSM_DeinitPnNotSupported处于状态S_CC_STOPPED,CANSM模块就应执行动作DO_SET_CC_MODE_STOPPED,如果当前CAN控制器模式不同,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STOPPED。

防护条件 CANSM_BSM_G_CC_STOPPED_OK

如果在状态 S_CC_STOPPED的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件CANSM_BSM_G_CC_STOPPED_OK。

触发器 T_CC_STOPPED_INDICATED

如果在CAN网络的CAN控制器相应的停止请求之后,CanSM模块已经获得CAN网络的已配置所有CAN控制器的模式指示,这将T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。

触发器 T_CC_STOPPED_TIMEOUT

对于控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。

在状态 S_CC_SLEEP 的操作

只要子状态机CANSM_BSM_DeinitPnNotSupported处于状态S_CC_SLEEP,CANSM模块就应执行动作DO_SET_CC_MODE_SLEEP,如果当前CAN控制器模式不为CAN_CS_SLEEP,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_SLEEP。

防护条件 G_CC_SLEEP_E_OK

如果在状态 S_CC_SLEEP的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件G_CC_SLEEP_E_OK。

触发器 T_CC_SLEEP_INDICATED

如果在将CAN网络的CAN控制器设置为睡眠模式的相应请求之后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_CC_SLEEP_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。

触发器 T_CC_SLEEP_TIMEOUT

对于控制器睡眠模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,应以T_CC_SLEEP_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。

在状态 S_TRCV_NORMAL 的操作

如果为CAN网络配置了CAN收发器,则只要子状态机CANSM_BSM_DeinitPnNotSupported处于状态S_TRCV_NORMAL,CANSM模块就应执行动作DO_SET_TRCV_MODE_NORMAL,并为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中TransceiverMode等于CANTRCV_TRCVMODE_NORMAL。

防护条件 G_TRCV_NORMAL_E_OK

如果在状态 G_TRCV_NORMAL_E_OK的API调用返回E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件G_TRCV_NORMAL_E_OK。

触发器 T_TRCV_NORMAL_INDICATED

如果CanSM模块在相应的请求后已获得CAN网络已配置的CAN收发器的CANTRCV_TRCVMODE_NORMAL模式指示,这将以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。
如果没有为CAN网络配置CAN收发器,则将在状态S_TRCV_NORMAL中以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。

触发器 T_TRCV_NORMAL_TIMEOUT

在收发器正常指示超时CANSM_MODEREQ_REPEAT_TIME后,该条件将以T_TRCV_NORMAL_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。

在状态 S_TRCV_STANDBY 的操作

如果为CAN网络配置了CAN收发器,则只要子状态机CANSM_BSM_DeinitPnNotSupported处于状态S_TRCV_STANDBY,CANSM模块就应执行动作DO_SET_TRCV_MODE_STANDBY,并为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中TransceiverMode等于CANTRCV_TRCVMODE_STANDBY。

防护条件 G_TRCV_STANDBY_E_OK

如果在状态 S_TRCV_STANDBY 的API调用返回E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件G_TRCV_STANDBY_E_OK。

触发条件 T_TRCV_STANDBY_INDICATED

如果CanSM模块在相应的请求后已获得CAN网络中已配置的CAN收发器的CANTRCV_TRCVMODE_STANDBY模式指示,这将以T_TRCV_STANDBY_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。
如果没有为CAN网络配置CAN收发器,则在状态 S_TRCV_STANDBY中以T_TRCV_STANDBY_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。

触发条件 CANSM_BSM_T_TRCV_STANDBY_TIMEOUT

在收发器待机指示超时CANSM_MODEREQ_REPEAT_TIME后,将以CANSM_BSM_T_TRCV_STANDBY_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。

子状态机 CANSM_BSM_WUVALIDATION

作用

在CAN网络从低功耗模式(部分网络或者NO_COMMUNICATION模式)切换到FULL_COMMUNICATION模式之前,进行唤醒验证(Wake Up Validation)。唤醒验证的目的是检测CAN网络是否有其他活跃的节点,以及是否有外部唤醒源(例如按键或传感器)导致的唤醒事件。唤醒验证的过程是通过发送和接收特定的唤醒帧(Wake Up Frame)来实现的,如果在一定的时间内没有收到任何唤醒帧,那么就认为CAN网络是空闲的,可以进入FULL_COMMUNICATION模式。

CANSM_BSM_WUVALIDATION子状态的作用是保证CAN网络在进入FULL_COMMUNICATION模式之前,已经完成了唤醒验证,以避免因为网络冲突或误唤醒而导致的通信故障。如果唤醒验证成功,那么CANSM模块会通知ComM(Communication Manager)模块,ComM模块会将CAN网络的通信模式指示给上层的应用层。

流程如下:

  • 当ComM模块请求CanSM模块切换到全通信模式时,CanSM模块会调用CanIf模块的API,将CAN控制器和收发器设置为唤醒模式,并进入CANSM_BSM_WUVALIDATION状态。
  • 在该状态下,CanSM模块会等待CanIf模块的回调函数,通知是否有唤醒事件发生。如果有唤醒事件发生,CanSM模块会根据配置的唤醒源类型,判断唤醒事件的有效性。
  • 如果唤醒事件是有效的,CanSM模块会进入CANSM_BSM_PRE_FULLCOM状态,准备切换到全通信模式。如果唤醒事件是无效的,CanSM模块会进入CANSM_BSM_S_NOT_INITIALIZED状态,停止通信,并通知ComM模块。
  • 如果在等待唤醒事件的过程中,没有收到任何回调函数,CanSM模块会进入超时状态,然后重试。如果重试次数超过配置的最大值,CanSM模块会进入CANSM_BSM_S_NOT_INITIALIZED状态,停止通信,并通知ComM模块。

在状态S_TRCV_NORMAL下的操作

在一个配置CAN收发器的CAN网络,则只要子状态机CANSM_BSM_WUVALIDATION处于状态S_TRCV_NORMAL状态,CanSM模块需要执行DO_SET_TRCV_MODE_NORMAL的操作,并因此为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,使用的参数TransceiverMode 为 CANTRCV_TRCVMODE_NORMAL。

防护条件 G_TRCV_NORMAL_E_OK

如果子状态机CANSM_BSM_S_PRE_FULLCOM处于S_TRCV_NORMAL状态,使用TransceiverMode = CANTRCV_TRCVMODE_NORMAL调用API CanIf_SetTrcvMode 返回E_OK,子状态机CANSM_BSM_WUVALIDATION的防护条件G_TRCV_NORMAL_E_OK也应通过。

触发器 T_TRCV_NORMAL_INDICATED

如果CanSM模块在相应的请求后已获得CAN网络已配置CAN收发器的CANTRCV_TRCVMODE_NORMAL模式指示,这将以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_WUVALIDATION。

触发器 T_TRCV_NORMAL_TIMEOUT

在收发器的正常指示在CANSM_MODEREQ_REPEAT_TIME超时后,该条件将以T_TRCV_NORMAL_TIMEOUT触发相应的网络的子状态机CANSM_BSM_WUVALIDATION。

在 S_CC_STOPPED状态下的操作

当子状态机CANSM_BSM_WUVALIDATION处于S_CC_STOPPED状态,CanSM应该执行操作DO_SET_CC_MODE_STOPPED,如果当前CAN网络配置的CNA控制器状态不是CAN_CS_STOPPED,为CAN网络配置的CAN控制器使用ControllerMode = CAN_CS_STOPPED 调用API CanIf_SetControllerMode。

防护条件 G_CC_STOPPED_OK

当在S_CC_STOPPED状态下的操作的所有API返回E_OK,子状态机CANSM_BSM_WUVALIDATION的防护条件G_CC_STOPPED_OK应通过。

触发器 T_CC_STOPPED_INDICATED

如果在停止CAN网络的CAN控制器的相应请求之后,CanSM模块已经获得CAN网络的已配置CAN控制器的所有模式指示,这将以T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_WUVALIDATION。

触发器 T_CC_STOPPED_TIMEOUT

所有控制器的停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时后,将使用T_CC_STOPPED_TIMEOUT触发相应的网络子状态机CANSM_BSM_WUVALIDATION。

在 S_CC_STARTED状态下的操作

只要子状态机CANSM_BSM_WUVALIDATION处于状态S_CC_STARTED,CANSM模块就应执行DO_SET_CC_MODE_STARTED操作,因此,如果CAN控制器模式不是CAN_CS_STARTED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,使用参数ControllerMode = CAN_CS_STARTED。

防护条件 G_CC_STARTED_E_OK

当在S_CC_STARTED状态下的操作的所有API返回E_OK,子状态机CANSM_BSM_WUVALIDATION的防护条件G_CC_STARTED_E_OK应通过。

触发器 T_CC_STARTED_INDICATED

如果在启动CAN网络的CAN控制器的相应请求之后,CanSM模块已获得CAN网络的已配置CAN控制器的所有模式指示,将以T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_WUVALIDATION。

触发器 T_CC_STARTED_TIMEOUT

所有控制器的启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时后,将以T_CC_STARTED_TIMEOUT触发相应网络的子状态机CANSM_BSM_WUVALIDATION。

子状态机 CANSM_BSM_S_PRE_FULLCOM

作用

CANSM_BSM_S_PRE_FULLCOM状态机的作用是在CAN网络从无通信模(COMM_NO_COMMUNICATION)切换到全通信模式(COMM_FULL_COMMUNICATION)之前,执行一些必要的操作。当以下操作都完成后,CANSM_BSM_S_PRE_FULLCOM状态机就会触发T_CC_STOPPED_INDICATED事件,进入CANSM_BSM_S_FULLCOM状态机,实现CAN网络的全通信模式。

  • 检查CAN控制器和CAN收发器的工作模式是否正确,如果不正确,就调用CanIf模块的API来设置正确的模式。
  • 检查CAN网络是否有唤醒事件发生,如果有,就调用CanSM_StartWakeUpSource或CanSM_StopWakeUpSource来启动或停止唤醒源。
  • 检查CAN网络是否有Bus Off事件发生,如果有,就调用CanSM_ControllerBusOff来处理Bus Off恢复流程。
  • 检查CAN网络是否有部分网络(PN)可用,如果有,就调用CanNm_ConfirmPnAvailability来确认PN的可用性。

在状态 S_TRCV_NORMAL 的操作

如果为CAN网络配置了CAN收发器,则只要子状态机CANSM_BSM_S_PRE_FULLCOM处于状态S_TRCV_NORMAL,CANSM模块就应执行动作DO_SET_TRCV_MODE_NORMAL,并为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中TransceiverMode等于CANTRCV_TRCVMODE_NORMAL。

防护条件 G_TRCV_NORMAL_E_OK

如果在状态 S_TRCV_NORMAL下的API调用返回E_OK,则应通过子状态机CANSM_BSM_S_PRE_FULLCOM的防护条件G_TRCV_NORMAL_E_OK。

触发器T_TRCV_NORMAL_INDICATED

如果CanSM模块在相应的请求后已经获得CAN网络的已配置CAN收发器的CANTRCV_TRCVMODE_NORMAL模式指示,这将以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_S_PRE_FULLCOM。
如果没有为CAN网络配置CAN收发器,则将在状态S_TRCV_NORMAL 中以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_S_PRE_FULLCOM。

触发器 T_TRCV_NORMAL_TIMEOUT

在收发器正常指示超时CANSM_MODEREQ_REPEAT_TIME后,将以T_TRCV_NORMAL_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_PRE_FULLCOM。

在状态 S_CC_STOPPED 的操作

只要子状态机CANSM_BSM_S_PRE_FULLCOM处于状态S_CC_STOPPED,CANSM模块就应执行动作DO_SET_CC_MODE_STOPPED,如果当前CAN控制器模式不为CAN_CS_STOPPED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STOPPED。

防护条件 G_CC_STOPPED_OK

如果在状态 S_CC_STOPPED的API调用都返回E_OK,则应通过状态机CANSM_BSM_S_PRE_FULLCOM的防护条件G_CC_STOPPED_OK。

触发器 T_CC_STOPPED_INDICATED

在停止CAN网络的CAN控制器的相应请求之后,CanSM模块已经获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_PRE_FULLCOM。

触发器 T_CC_STOPPED_TIMEOUT

控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,将以T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_PRE_FULLCOM。

在状态 S_CC_STARTED 的操作

只要子状态机CANSM_BSM_S_PRE_FULLCOM处于状态S_CC_STARTED,CANSM模块就应执行动作DO_SET_CC_MODE_STARTED,如果当前CAN控制器模式不为CAN_CS_STARTED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STARTED。

防护条件 G_CC_STARTED_OK

如果在状态 S_CC_STARTED下的所有API调用都返回E_OK,则应通过子状态机CANSM_BSM_S_PRE_FULLCOM的保护条件G_CC_STARTED_OK。

触发器 T_CC_STARTED_INDICATED

如果在CAN网络的CAN控制器相应的请求启动之后,CanSM模块已获得CAN网络所有的已配置CAN控制器的模式指示,这将以T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_PRE_FULLCOM。

触发器 T_CC_STARTED_TIMEOUT

控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_CC_STARTED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_PRE_FULLCOM。

子状态机 CANSM_BSM_S_FULLCOM

作用

在这个状态下,CanSM模块会向ComM模块和BswM模块报告当前的通信模式,并处理可能发生的事件,例如:

  • Bus Off事件:如果检测到Bus Off事件,CanSM模块会尝试恢复CAN网络的通信,并向ComM模块和BswM模块报告Bus Off状态。
  • 通信模式请求:如果收到了其他通信模式的请求,例如SILENT_COM或NO_COM,CanSM模块会根据请求改变CAN网络的通信模式,并向ComM模块和BswM模块报告当前的通信模式。
  • 波特率切换请求:如果收到了波特率切换的请求,CanSM模块会尝试切换CAN网络的波特率,并向ComM模块和BswM模块报告当前的波特率。

防护条件: G_BUS_OFF_PASSIVE

如果CANSM_BOR_TX_CONFIRMATION_POLLING被禁用,并且自E_TX_ON起的持续时间大于或等于等于配置参数CANSM_BOR_TIME_TX_ENSURED,子状态机CANSM_BSM_S_FULLCOM的保护条件G_BUS_OFF_PASSIVE应通过。
如果CANSM_BOR_TX_CONFIRMATION_POLLING使能,CAN网络所有已配置CAN控制器的API CanIf_GetTxConfirmationState返回CANIF_TX_RX_NOTIFICATION,子状态机CANSM_BSM_S_FULLCOM的保护条件G_BUS_OFF_PASSIVE
应通过。

效果:E_BUS_OFF_PASSIVE

子状态机CANSM_BSM_S_FULLCOM的效果E_BUS_OFF_PASSIVE
应使用参数EventId := CANSM_E_BUS_OFF和EventStatus:= DEM_EVENT_STATUS_PASSED,调用Dem_SetEventStatus。

触发器:T_CHANGE_BR_REQUEST

如果不存在拒绝CanSM_SetBaudrate请求的条件,这将通过T_CHANGE_BR_REQUEST分别触发状态机CANSM_BSM_S_FULLCOM和父状态机CANSM_BSM(通过CanIf_SetBaudrate直接改变波特率,或者启动所需的异步进程来实现改变波特率)

效果:E_CHANGE_BR_BSWM_MODE

子状态机CANSM_BSM_S_FULLCOM的效果E_CHANGE_BR_BSWM_MODE是使用参数Network:= CanSMComMNetworkHandleRef和CurrentState:= CANSM_BSWM_CHANGE_BAUDRATE为相应的CAN网络调用API BswM_CanSM_CurrentState。

触发器:T_BUS_OFF

如果CAN网络的一个已配置CAN控制器与回调函数CanSM_ControllerBusOff的函数参数ControllerId相匹配,则回调函数CanSM_ControllerBusOff应以T_BUS_OFF触发CAN网络的子状态机CANSM_BSM_S_FULLCOM。
如果多个CAN控制器属于一个CAN网络,并且其中一个控制器的总线关闭由CanSM_ControllerBusOff指示,则CanSM应在效果E_BUS_OFF的上下文停止CAN网络的其他CAN控制器。

效果:E_BUS_OFF

子状态机CANSM_BSM_S_FULLCOM的效果E_BUS_OFF应首先调用相应CAN网络的API BswM_CanSM_CurrentState,使用参数为Network:= CanSMComMNetworkHandleRef和CurrentState:= CANSM_BSWM_BUS_OFF。

子状态机CANSM_BSM_S_FULLCOM的效果E_BUS_OFF应然后就调用API ComM_BusSM_ModeIndication,使用参数为Channel:= CanSMComMNetworkHandleRef和ComMode:= ComM_SILENT_COMMUNICATION。

子状态机CANSM_BSM_S_FULLCOM的函数E_BUS_OFF应使用参数EventId:= CANSM_E_BUS_OFF和EventStatus:= DEM_EVENT_STATUS_PRE_FAILED,调用Dem_SetEventStatus。

在状态 S_RESTART_CC 的操作

只要子状态机CANSM_BSM_S_FULLCOM处于状态S_RESTART_CC,CANSM模块就应执行动作DO_SET_CC_MODE_STARTED,如果当前CAN控制器模式不为CAN_CS_STARTED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STARTED。

防护条件 G_RESTART_CC_OK

如果在状态 S_RESTART_CC的所有API调用都返回E_OK,则应通过子状态机CANSM_BSM_S_FULLCOM的保护条件G_RESTART_CC_OK。

触发器 T_RESTART_CC_INDICATED

如果CAN网络的CAN控制器在相应启动请求之后,CanSM模块已获得CAN网络已配置的所有CAN控制器的模式指示,这将以T_RESTART_CC_INDICATED触发CAN网络的子状态CANSM_BSM_S_FULLCOM。

触发器 T_RESTART_CC_TIMEOUT

假定控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_RESTART_CC_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_FULLCOM。

效果 E_TX_OFF

效果 E_TX_OFF什么也不做

防护条件 G_TX_ON

如果CanSMEnableBusOffDelay为FALSE,则在与最后一次T_BUS_OFF相关的CanSMBorTimeL1的持续时间之后,应通过子状态机CANSM_BSM_S_FULLCOM的保护条件G_TX_ON,如果未通过保护条件G_BUS_OFF_PASSIVE的具有E_BUS_OFF的bus-off recovery 复重试次数低于CanSMBorCounterL1ToL2。

如果CanSMEnableBusOffDelay为FASLE,则在与最后一次T_BUS_OFF相关的CanSMBorTimeL2的持续时间之后,应通过子状态机CANSM_BSM_S_FULLCOM的保护条件G_TX_ON,如果未通过保护条件G_BUS_OFF_PASSIVE的具有E_BUS_OFF的bus-off recovery重试次数大于或等于CanSMBorCounterL1ToL2

如果CanSMEnableBusOffDelay为真,则以上两种情况下的保护条件应在每种情况下的指定持续时间加上额外的随机延迟值后通过,该值应在总线关闭事件后通过配置的回调函数< User_GetBusOffDelay >请求。

效果 E_TX_ON

如果ECU被动为假,则子状态机CANSM_BSM_S_FULLCOM的效果E_TX_ON应第一件事首先使用参数ControllerId:= CanSMControllerId和PduModeRequest := CANIF_ONLINE调用API函数CanIf_SetPduMode,以配置CAN网络的CAN控制器。

如果ECU被动为真,则子状态机CANSM_BSM_S_FULLCOM的效果E_TX_ON应第一件事首先使用参数ControllerId:= CanSMControllerId和PduModeRequest:= CanIf_TX_OFFLINE_ACTIVE调用API函数CanIf_SetPduMode。

子状态机CANSM_BSM_S_FULLCOM的效果E_TX_ON应第二件事是调用API BswM_CanSM_CurrentState,使用参数为Network:= CanSMComMNetworkHandleRef 和CurrentState:=CANSM_BSWM_FULL_COMMUNICATION。

子状态机CANSM_BSM_S_FULLCOM的作用E_TX_ON应第三件事事调用API ComM_BusSM_ModeIndication,使用参数为Channel:= CanSMComMNetworkHandleRef和ComMode:=ComM_FULL_COMMUNICATION。

触发器 T_TX_TIMEOUT_EXCEPTION

回调函数CanSM_TxTimeoutException应通过T_TX_TIMEOUT_EXCEPTION触发子状态机CANSM_BSM_S_FULLCOM。

note

在S_NO_BUS_OFF状态下,CanSM模块不需要任何状态操作。

子状态机 CANSM_BSM_S_TX_TIMEOUT_EXCEPTION

触发器 T_CC_STOPPED_TIMEOUT

假定控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时后,该条件应通过T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION。

防护条件 G_CC_STOPPED_E_OK

如果状态操作 DO_SET_CC_MODE_STOPPED()的所有API调用都返回了E_OK,则通过子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION的防护条件G_CC_STOPPED_E_OK。

状态操作 DO_SET_CC_MODE_STOPPED()

只要子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION处于状态S_CC_STOPPED,CANSM模块就应执行动作DO_SET_CC_MODE_STOPPED,如果当前CAN控制器模式不为CAN_CS_STOPPED,则为CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STOPPED。

触发器 T_CC_STOPPED_INDICATED

如果在请求停止相应的CAN网络的CAN控制器后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将通过T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION。

触发器 T_CC_STARTED_INDICATED

如果在请求启动CAN网络的CAN控制器的相应之后,CanSM模块已经获得CAN网络的所有已配置CAN控制器的模式指示,这将通过T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION。

防护条件 G_CC_STARTED_E_OK

如果状态操作DO_SET_CC_MODE_STARTED返回E_OK,那么应通过子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION的防护条件G_CC_STARTED_E_OK。

状态操作 DO_SET_CC_MODE_STARTED

只要子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION处于状态S_CC_STARTED,CANSM模块就应执行动作DO_SET_CC_MODE_STARTED,如果当前CAN控制器模式不为CAN_CS_STARTED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STARTED。

ExitPoint:TxTimeout

如果通过T_CC_STARTED_INDICATED触发了子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION,则应使用参数CANIF_ONLINE调用API CanIf_SetPduMode()。

子状态机 CANSM_BSM_S_CHANGE_BAUDRATE

作用

CanSM_BSM_S_CHANGE_BAUDRATE状态机的作用是在CAN网络通信模式为FULL_COM时,根据上层模块(ComM)的请求,切换CAN总线的波特率(Baudrate)。CanSM模块提供了一个API函数CanSM_ChangeBaudrate,用于接收ComM模块的波特率切换请求,并触发CanSM_BSM_S_CHANGE_BAUDRATE状态机的运行。该状态机的流程如下:

  • 首先,CanSM模块会调用CanIf模块的API函数CanIf_SetBaudrate,用于设置CAN控制器和CAN收发器的新波特率。如果该函数返回E_OK,表示设置成功,否则表示设置失败。
  • 然后,CanSM模块会等待CanIf模块的回调函数CanSM_BaudrateChangeIndication,用于确认波特率是否已经成功切换。如果该函数返回E_OK,表示切换成功,否则表示切换失败。
  • 最后,CanSM模块会根据波特率切换的结果,通知ComM模块和BswM模块。如果切换成功,CanSM模块会调用ComM_BusSM_ModeIndication函数,用于通知ComM模块当前的通信模式为FULL_COM,并调用BswM_CanSM_CurrentState函数,用于通知BswM模块当前的网络状态为CANSM_BSWM_FULLCOM。如果切换失败,CanSM模块会调用Dem_ReportErrorStatus函数,用于报告错误事件,并调用BswM_CanSM_CurrentState函数,用于通知BswM模块当前的网络状态为CANSM_BSWM_CHANGE_BAUDRATE。

在进入时需要执行的状态操作:DO_SET_BAUDRATE_DIRECT

状态操作DO_SET_BAUDRATE_DIRECT应为CAN网络中所有已配置的CAN控制器调用API请求CanIf_SetBaudrate,并使用各自的ControllerId参数。CanSM_SetBaudrate()中的相应函数参数BaudRateConfigID作为BaudRateConfigID参数。

防护条件:G_SET_BAUDRATE_DIRECT_OK

如果所有CanIf_SetBaudrate请求都返回E_OK,则应通过保护条件G_SET_BAUDRATE_DIRECT_OK。

防护条件:G_SET_BAUDRATE_DIRECT_NOT_OK

如果任意CanIf_SetBaudrate请求返回E_NOT_OK,那么应通过状态CANSM_BSM_CHANGE_BR_SYNC的防护条件G_SET_BAUDRATE_NOT_OK。

状态 S_CC_STOPPED 中的操作

只要子状态机CANSM_BSM_S_CHANGE_BAUDRATE处于状态S_CC_STOPPED,CANSM模块就应执行动作DO_SET_CC_MODE_STOPPED,如果当前CAN控制器模式不是CAN_CS_STOPPED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STOPPED。

防护条件:G_CC_STOPPED_OK

如果 状态 S_CC_STOPPED 中的操作的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_S_CHANGE_BAUDRATE的保护条件G_CC_STOPPED_OK。

触发器:T_CC_STOPPED_INDICATED

在请求停止相应的CAN网络的CAN控制器之后,如果CanSM模块已获得CAN网络的已配置所有CAN控制器的模式指示,这将通过T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。

触发器:T_CC_STOPPED_TIMEOUT

控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应通过T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。

效果:E_CHANGE_BAUDRATE

子状态机CANSM_BSM_S_CHANGE_BAUDRATE的作用E_CHANGE_BAUDRATE的第一件事是为相应的CAN网络调用API ComM_BusSM_ModeIndication,使用参数为Channel:= CanSMComMNetworkHandleRef和ComMode:=COMM_NO_COMMUNICATION。

子状态机CANSM_BSM_S_CHANGE_BAUDRATE的作用E_CHANGE_BAUDRATE的第二件事是为CAN网络的所有已配置CAN控制器使用相应的ControllerId参数调用API请求CanIf_SetBaudrate,并应使用CanSM_SetBaudrate调用中记忆的BaudRateConfigID作为BaudRateConfigID参数。

状态 S_CC_STARTED 中的操作

只要子状态机CANSM_BSM_S_CHANGE_BAUDRATE处于状态S_CC_STARTED,CANSM模块就应执行动作DO_SET_CC_MODE_STARTED,如果当前CAN控制器模式不是CAN_CS_STARTED,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STARTED。

防护条件:G_CC_STARTED_OK

如果在状态 S_CC_STARTED 中的操作的所有API返回都为E_OK,那么应通过子状态机CANSM_BSM_S_CHANGE_BAUDRATE的防护条件G_CC_STARTED_OK。

触发器:T_CC_STARTED_INDICATED

如果在请求启动相应CAN网络的CAN控制器之后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将通过T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。

触发器:T_CC_STARTED_TIMEOUT

假定控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应通过T_CC_STARTED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。

防护条件:G_NO_COM_MODE_REQUESTED

如果通过CanSM_RequestComMode最近接受的通信模式请求,参数ComM_Mode等于COMM_NO_COMMUNICATION,则子状态机CANSM_BSM_S_CHANGE_BAUDRATE应通过保护条件G_NO_COM_MODE_REQUESTED。

防护条件:G_NO_COM_MODE_NOT_REQUESTED

如果通过CanSM_RequestComMode最近接受的通信模式请求,参数ComM_Mode等于COMM_SILENT_COMMUNICATION或COMM_FULL_COMMUNICATION,则子状态机CANSM_BSM_S_CHANGE_BAUDRATE应通过保护条件G_NO_COM_MODE_NOT_REQUESTED。

子状态机 CANSM_BSM_S_SILENTCOM_BOR

作用

在CAN网络发生总线关闭(Bus Off)事件后,尝试恢复CAN控制器和CAN收发器的正常工作模式,以便恢复网络通信。该状态机的流程如下:

  • 当CanSM模块接收到ComM模块的静默通信模式请求(COMM_SILENT_COMMUNICATION)时,如果当前状态是CANSM_BSM_S_CHANGE_BAUDRATE,那么状态机切换到CANSM_BSM_S_SILENTCOM_BOR。
  • 在CANSM_BSM_S_SILENTCOM_BOR状态下,首先执行DO_SET_CC_MODE_STOPPED动作,调用CanIf_SetControllerMode函数,将CAN控制器设置为停止模式(CAN_CS_STOPPED)。如果成功,状态机切换到S_CC_STOPPED子状态;如果失败,状态机切换到S_TIMEOUT_CC_STOPPED子状态,等待一段时间后重试;如果重试次数超过T_REPEAT_MAX,状态机切换到CANSM_BSM_S_PRE_NOCOM,并报告错误事件CANSM_E_MODE_REQUEST_TIMEOUT。
  • 在S_CC_STOPPED子状态下,执行DO_SET_TRCV_MODE_STANDBY动作,调用CanIf_SetTrcvMode函数,将CAN收发器设置为待机模式(CANTRCV_TRCVMODE_STANDBY)。如果成功,状态机切换到S_TRCV_STANDBY子状态;如果失败,状态机切换到S_TIMEOUT_TRCV_STANDBY子状态,等待一段时间后重试;如果重试次数超过T_REPEAT_MAX,状态机切换到CANSM_BSM_S_PRE_NOCOM,并报告错误事件CANSM_E_MODE_REQUEST_TIMEOUT。
  • 在S_TRCV_STANDBY子状态下,执行DO_SET_CC_MODE_STARTED动作,调用CanIf_SetControllerMode函数,将CAN控制器设置为启动模式(CAN_CS_STARTED)。如果成功,状态机切换到S_RESTART_CC子状态;如果失败,状态机切换到S_TIMEOUT_RESTART_CC子状态,等待一段时间后重试;如果重试次数超过T_REPEAT_MAX,状态机切换到CANSM_BSM_S_PRE_NOCOM,并报告错误事件CANSM_E_MODE_REQUEST_TIMEOUT。
  • 在S_RESTART_CC子状态下,执行DO_CHECK_BOR_TIME动作,检查是否满足BOR时间条件(CanSM_BorTimeL1或CanSM_BorTimeL2)。如果满足,状态机切换到S_CHECK_WFLAG_IN_CC_SLEEP子状态;如果不满足,状态机保持在S_RESTART_CC子状态,直到满足条件或者接收到其他模式请求。
  • 在S_CHECK_WFLAG_IN_CC_SLEEP子状态下,执行DO_CHECK_WFLAG_IN_CC_SLEEP动作,检查CAN控制器是否有唤醒标志(CanIf_GetControllerWakeupFlag函数)。如果有,状态机切换到S_CC_SLEEP子状态;如果没有,状态机切换到S_CC_STARTED子状态。
  • 在S_CC_SLEEP子状态下,执行DO_SET_CC_MODE_SLEEP动作,调用CanIf_SetControllerMode函数,将CAN控制器设置为睡眠模式(CAN_CS_SLEEP)。如果成功,状态机切换到S_CC_STOPPED子状态,重新开始BOR流程;如果失败,状态机切换到S_TIMEOUT_CC_SLEEP子状态,等待一段时间后重试;如果重试次数超过T_REPEAT_MAX,状态机切换到CANSM_BSM_S_PRE_NOCOM,并报告错误事件CANSM_E_MODE_REQUEST_TIMEOUT。
  • 在S_CC_STARTED子状态下,执行DO_SET_TRCV_MODE_NORMAL动作,调用CanIf_SetTrcvMode函数,将CAN收发器设置为正常模式(CANTRCV_TRCVMODE_NORMAL)。如果成功,状态机切换到S_TRCV_NORMAL子状态;如果失败,状态机切换到S_TIMEOUT_TRCV_NORMAL子状态,等待一段时间后重试;如果重试次数超过T_REPEAT_MAX,状态机切换到CANSM_BSM_S_PRE_NOCOM,并报告错误事件CANSM_E_MODE_REQUEST_TIMEOUT。
  • 在S_TRCV_NORMAL子状态下,执行DO_SET_CC_MODE_STARTED动作,调用CanIf_SetControllerMode函数,将CAN控制器设置为启动模式(CAN_CS_STARTED)。如果成功,状态机切换到S_CC_STARTED_BOR子状态;如果失败,状态机切换到S_TIMEOUT_CC_STARTED_BOR子状态,等待一段时间后重试;如果重试次数超过T_REPEAT_MAX,状态机切换到CANSM_BSM_S_PRE_NOCOM,并报告错误事件CANSM_E_MODE_REQUEST_TIMEOUT。
  • 在S_CC_STARTED_BOR子状态下,执行DO_CHECK_WFLAG_IN_CC_STARTED动作,检查CAN控制器是否有唤醒标志(CanIf_GetControllerWakeupFlag函数)。如果有,状态机切换到S_CC_STOPPED子状态,重新开始BOR流程;如果没有,状态机切换到CANSM_BSM_S_SILENTCOM子状态,并通知ComM模块静默通信模式已经达成(CanSM_CurrentState函数)。

效果:BUS_OFF

子状态机CANSM_BSM_S_FULLCOM 和 CANSM_BSM_S_SILENTCOM_BOR 的E_BUS_OFF效果是
使用参数EventId := CANSM_E_BUS_OFF和
EventStatus:= DEM_EVENT_STATUS_PRE_FAILED,调用Dem_SetEventStatus。

状态操作:S_RESTART_CC

只要子状态机CANSM_BSM_S_SILENTCOM_BOR处于状态S_RESTART_CC,CANSM模块就应执行动作DO_SET_CC_MODE_STARTED,如果当前CAN控制器模式不为CAN_CS_STARTED,则为CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STARTED。

G_RESTART_CC_E_OK

如果状态S_RESTART_CC的所有API调用都返回E_OK,则应通过子状态机CANSM_BSM_S_SILENTCOM_BOR的保护条件G_RESTART_CC_OK。

触发器: T_RESTART_CC_INDICATED

如果在启动CAN网络的CAN控制器相应请求之后,CanSM模块已经获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_RESTART_CC_INDICATED触发CAN网络的子状态CANSM_BSM_S_SILENTCOM_BOR。

T_RESTART_CC_TIMEOUT

假定控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_RESTART_CC_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_SILENTCOM_BOR。

效果:E_TX_OFF

效果E_TX_OFF应不起作用(CAN控制器重启后的默认PDU模式已经是TX OFF,参考CanIf SWS)。

子状态机 CANSM_BSM_S_SILENTCOM

CanSM_BSM_S_SILENTCOM状态机的作用是在CAN网络的通信模式为静默模式(COMM_SILENT_COMMUNICATION)时,控制CAN控制器和CAN收发器的工作模式。在静默模式下,CAN控制器只能接收消息,不能发送消息,以避免对其他节点的通信造成干扰。CAN收发器可以根据配置选择是进入正常模式还是低功耗模式。在静默模式下,CanSM模块不会处理任何唤醒事件或总线异常事件,只有当上层模块(ComM)请求切换到其他通信模式时,才会触发状态机的转换。

总结

  • CanSM状态机在一级层面上分为:NO_COMMUNICATION, PRE_NO_COMMUNICATION, WAKEUP_VALIDATION,PRE_FULL_COMMUNICATION,FULL_COMMUNICATION,SLIENT_COMMUNICATION,CHANGE_BAUDRATE,7个子状态;
  • CanSM的作用就是根据发生的事件或者根据API调用触发状态机流转,需要时并通知ComM、BswM等模块网络状态;
  • CanSM关于状态机的触发流转,全部记住是几乎不可能的,只要了解即可;
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇