在一个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。
CanSM会内部存储关于Can网络状态、通信模式、CAN控制器状态。
CanSM状态机的流转是被上图一系列条件所触发跳转,按类型分为:触发器、防护条件、作用。
上电后,CanSM状态机处于CANSM_BSM_NOT_INITIALIZED状态。
如果CanSM模块被请求执行CanSM_Init,该行为会触发CanSM状态机为所有配置的CAN网络执行CanSM_Init,状态机处于CANSM_BSM_S_PRE_NOCOM状态。
如果CanSM模块被请求执行CanSM_DeInit,该行为会触发CanSM状态机为所有配置的CAN网络执行CanSM_DeInit,状态机处于CANSM_BSM_NOT_INITIALIZED状态,调用CanSM_DeInit的函数保证CanSM处于CANSM_BSM_NOCOM状态。
如果API请求 CanSM_StartWakeUpSource返回E_OK,将会以参数T_START_WAKEUP_SOURCE触发CanSM状态机,跳转进入CANSM_BSM_WUVALDATION状态。
如果API请求 CanSM_StopWakeUpSource返回E_OK,将会以参数T_STOP_WAKEUP_SOURCE触发CanSM状态机,跳转进入CANSM_BSM_S_PRE_NOCOM状态。
如果API请求CanSM_RequestComMode,且使用参数ComM_Mode = COMM_FULL_COMMUNICATION ,那么将会以参数T_FULL_COM_MODE_REQUEST触发CanSM状态机跳转,进入CANSM_BSM_S_PRE_FULLCOM。
如果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模式的切换
如果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)
调用回调函数CanSM_ControllerBusOff将会以参数T_BUS_OFF触发CanSM状态机。
当上一个通过CanSM_RequestComMode请求接收到的通信模式请求为COMM_FULL_COMMUNICATION时,将评估CanSM_BSM状态机的防护条件G_FULL_COM_MODE_REQUESTED。
当上一个通过CanSM_RequestComMode请求接收到的通信模式请求为COMM_SILENT_COMMUNICATION时,将评估CanSM_BSM状态机的防护条件G_SILENT_COM_MODE_REQUESTED。
CanSM_BSM状态机的作用E_PRE_NOCOM应为相应的CAN网络调用API BswM_CanSM_CurrentState,参数Network:= CanSMComMNetworkHandleRef和current state:= CanSM _BSWM _NO _COMMUNICATION。
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。
如果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。
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。
CanSM_BSM状态机的效果E_BR_END_FULL_COM的作用与E_FULL_COM相同。
CanSM_BSM状态机的效果E_BR_END_SILENT_COM的作用与E_FULL_TO_SILENT_COM相同
CanSM_BSM状态机的效果E_SILENT_TO_FULL_COM的作用与E_FULL_COM相同。
在一个配置CAN收发器的CAN网络,则只要子状态机CANSM_BSM_WUVALIDATION处于状态S_TRCV_NORMAL状态,CanSM模块需要执行DO_SET_TRCV_MODE_NORMAL的操作,并因此为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,使用的参数TransceiverMode 为 CANTRCV_TRCVMODE_NORMAL。
如果子状态机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也应通过。
如果CanSM模块在相应的请求后已获得CAN网络已配置CAN收发器的CANTRCV_TRCVMODE_NORMAL模式指示,这将以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_WUVALIDATION。
在收发器的正常指示在CANSM_MODEREQ_REPEAT_TIME超时后,该条件将以T_TRCV_NORMAL_TIMEOUT触发相应的网络的子状态机CANSM_BSM_WUVALIDATION。
当子状态机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。
当在S_CC_STOPPED状态下的操作的所有API返回E_OK,子状态机CANSM_BSM_WUVALIDATION的防护条件G_CC_STOPPED_OK应通过。
如果在停止CAN网络的CAN控制器的相应请求之后,CanSM模块已经获得CAN网络的已配置CAN控制器的所有模式指示,这将以T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_WUVALIDATION。
所有控制器的停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时后,将使用T_CC_STOPPED_TIMEOUT触发相应的网络子状态机CANSM_BSM_WUVALIDATION。
只要子状态机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。
当在S_CC_STARTED状态下的操作的所有API返回E_OK,子状态机CANSM_BSM_WUVALIDATION的防护条件G_CC_STARTED_E_OK应通过。
如果在启动CAN网络的CAN控制器的相应请求之后,CanSM模块已获得CAN网络的已配置CAN控制器的所有模式指示,将以T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_WUVALIDATION。
所有控制器的启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时后,将以T_CC_STARTED_TIMEOUT触发相应网络的子状态机CANSM_BSM_WUVALIDATION。
子状态机CANSM_BSM_S_PRE_NO_COM的保护条件CANSM_BSM_G_PN_NOT_SUPPORTED应评估配置参数CanTrcvPnEnabled是否为假(可通过参考CanSMTransceiverId获得)或是否根本未配置CanSMTransceiverId。
子状态机CANSM_BSM_S_PRE_NO_COM的保护条件CANSM_BSM_G_PN_SUPPORTED应评估是否配置了CanSMTransceiverId,以及配置参数CanTrcvPnEnabled是否为真(可通过参考CanSMTransceiverId获得)。
只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_PN_CLEAR_WUF,CANSM模块就执行DO_CLEAR_TRCV_WUF操作,重复API请求CanIf_ClrTrcvWufFlag,并使用配置的收发器作为API函数参数。
如果状态S_PN_CLEAR_WUF下调用的API返回都为E_OK,应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_PN_CLEAR_WUF_E_OK。
如果函数CanSM_ClearTrcvWufFlagIndication的参数Transceiver与CAN网络的已配置CAN收发器相匹配,则回调函数CanSM _ ClearTrcvWufFlagIndication应以T_CLEAR_WUF_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。
在回调函数CANSM_ClearTrcvWufFlagIndication超时CANSM_MODEREQ_REPEAT_TIME后,将以T_CLEAR_WUF_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。
只要子状态机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。
如果状态S_CC_STOPPED中的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_CC_STOPPED_E_OK。
如果在分别请求停止CAN网络的CAN控制器之后,CanSM模块已经获得CAN网络的已配置CAN控制器的所有模式指示,将以T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。
控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,将以T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。
只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_TRCV_NORMAL,CANSM模块就应执行DO_SET_TRCV_MODE_NORMAL操作,为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中使用参数TransceiverMode等于CANTRCV_TRCVMODE_NORMAL。
如果在状态S_TRCV_NORMAL下的API调用返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_TRCV_NORMAL_E_OK。
如果CanSM模块在相应的请求后已获得CAN网络中已配置的CAN收发器的CANTRCV_TRCVMODE_NORMAL模式指示,这将以T_TRCV_NORMAL_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。
收发器正常指示超时CANSM_MODEREQ_REPEAT_TIME后,该条件将以T_TRCV_NORMAL_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。
只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_TRCV_STANDBY,CANSM模块就应执行动作DO_SET_TRCV_STANDBY,并为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中TransceiverMode等于CANTRCV_TRCVMODE_STANDBY。
如果在状态S_TRCV_STANDBY下的API调用返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_TRCV_STANDBY_E_OK。
如果CanSM模块在相应请求后已获得CAN网络中已配置的CAN收发器的CANTRCV_TRCVMODE_STANDBY模式指示,这将以T_TRCV_STANDBY_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。
收发器待机指示超时CANSM_MODEREQ_REPEAT_TIME后,该条件将T_TRCV_STANDBY_TIMEOUT以触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。
只要子状态机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下的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_CC_SLEEP_E_OK。
如果在将CAN网络的CAN控制器设置为睡眠模式的相应请求之后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_CC_SLEEP_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。
对于控制器睡眠模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件将以CANSM_BSM_T_CC_SLEEP_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。
只要子状态机CANSM_BSM_DeinitPnSupported处于状态S_CHECK_WFLAG_IN_CC_SLEEP,CANSM模块就会执行动作DO_CHECK_WFLAG,重复API请求CanIf _CheckTrcvWakeFlag,并使用网络已配置CAN收发器作为收发器参数。
如果在状态S_CHECK_WFLAG_IN_CC_SLEEP或S_CHECK_WFLAG_IN_NOT_CC_SLEEP下的API调用返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnSupported的保护条件G_CHECK_WFLAG_E_OK。
如果CanSM_CheckTransceiverWakeFlagIndication的函数参数Transceiver与CAN网络的已配置CAN收发器相匹配,则回调函数CanSM_CheckTransceiverWakeFlagIndication应以T_CHECK_WFLAG_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnSupported。
在回调函数CanSM_CheckTransceiverWakeFlagIndication超时CANSM_MODEREQ_REPEAT_TIME后,该条件将以T_CHECK_WFLAG_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnSupported。
只要子状态机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模块就应执行动作DO_SET_CC_MODE_STOPPED,如果当前CAN控制器模式不同,则对CAN网络的所有已配置CAN控制器重复API请求CanIf_SetControllerMode,其中ControllerMode等于CAN_CS_STOPPED。
如果在状态 S_CC_STOPPED的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件CANSM_BSM_G_CC_STOPPED_OK。
如果在CAN网络的CAN控制器相应的停止请求之后,CanSM模块已经获得CAN网络的已配置所有CAN控制器的模式指示,这将T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。
对于控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。
只要子状态机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。
如果在状态 S_CC_SLEEP的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件G_CC_SLEEP_E_OK。
如果在将CAN网络的CAN控制器设置为睡眠模式的相应请求之后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_CC_SLEEP_INDICATED触发CAN网络的子状态机CANSM_BSM_DeinitPnNotSupported。
对于控制器睡眠模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,应以T_CC_SLEEP_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。
如果为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的API调用返回E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件G_TRCV_NORMAL_E_OK。
如果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。
在收发器正常指示超时CANSM_MODEREQ_REPEAT_TIME后,该条件将以T_TRCV_NORMAL_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。
如果为CAN网络配置了CAN收发器,则只要子状态机CANSM_BSM_DeinitPnNotSupported处于状态S_TRCV_STANDBY,CANSM模块就应执行动作DO_SET_TRCV_MODE_STANDBY,并为CAN网络的已配置CAN收发器重复API请求CanIf_SetTrcvMode,其中TransceiverMode等于CANTRCV_TRCVMODE_STANDBY。
如果在状态 S_TRCV_STANDBY 的API调用返回E_OK,则应通过子状态机CANSM_BSM_DeinitPnNotSupported的保护条件G_TRCV_STANDBY_E_OK。
如果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_MODEREQ_REPEAT_TIME后,将以CANSM_BSM_T_TRCV_STANDBY_TIMEOUT触发相应网络的子状态机CANSM_BSM_DeinitPnNotSupported。
子状态机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。
只要子状态机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。
如果状态S_RESTART_CC的所有API调用都返回E_OK,则应通过子状态机CANSM_BSM_S_SILENTCOM_BOR的保护条件G_RESTART_CC_OK。
如果在启动CAN网络的CAN控制器相应请求之后,CanSM模块已经获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_RESTART_CC_INDICATED触发CAN网络的子状态CANSM_BSM_S_SILENTCOM_BOR。
假定控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_RESTART_CC_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_SILENTCOM_BOR。
效果E_TX_OFF应不起作用(CAN控制器重启后的默认PDU模式已经是TX OFF,参考CanIf SWS)。
如果为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。
如果在状态 S_TRCV_NORMAL下的API调用返回E_OK,则应通过子状态机CANSM_BSM_S_PRE_FULLCOM的防护条件G_TRCV_NORMAL_E_OK。
如果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。
在收发器正常指示超时CANSM_MODEREQ_REPEAT_TIME后,将以T_TRCV_NORMAL_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_PRE_FULLCOM。
只要子状态机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。
如果在状态 S_CC_STOPPED的API调用都返回E_OK,则应通过状态机CANSM_BSM_S_PRE_FULLCOM的防护条件G_CC_STOPPED_OK。
在停止CAN网络的CAN控制器的相应请求之后,CanSM模块已经获得CAN网络的所有已配置CAN控制器的模式指示,这将以T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_PRE_FULLCOM。
控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,将以T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_PRE_FULLCOM。
只要子状态机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。
如果在状态 S_CC_STARTED下的所有API调用都返回E_OK,则应通过子状态机CANSM_BSM_S_PRE_FULLCOM的保护条件G_CC_STARTED_OK。
如果在CAN网络的CAN控制器相应的请求启动之后,CanSM模块已获得CAN网络所有的已配置CAN控制器的模式指示,这将以T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_PRE_FULLCOM。
控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_CC_STARTED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_PRE_FULLCOM。
如果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
应通过。
子状态机CANSM_BSM_S_FULLCOM的效果E_BUS_OFF_PASSIVE
应使用参数EventId := CANSM_E_BUS_OFF和EventStatus:= DEM_EVENT_STATUS_PASSED,调用Dem_SetEventStatus。
如果不存在拒绝CanSM_SetBaudrate请求的条件,这将通过T_CHANGE_BR_REQUEST分别触发状态机CANSM_BSM_S_FULLCOM和父状态机CANSM_BSM(通过CanIf_SetBaudrate直接改变波特率,或者启动所需的异步进程来实现改变波特率)
子状态机CANSM_BSM_S_FULLCOM的效果E_CHANGE_BR_BSWM_MODE是使用参数Network:= CanSMComMNetworkHandleRef和CurrentState:= CANSM_BSWM_CHANGE_BAUDRATE为相应的CAN网络调用API BswM_CanSM_CurrentState。
如果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控制器。
子状态机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。
只要子状态机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。
如果在状态 S_RESTART_CC的所有API调用都返回E_OK,则应通过子状态机CANSM_BSM_S_FULLCOM的保护条件G_RESTART_CC_OK。
如果CAN网络的CAN控制器在相应启动请求之后,CanSM模块已获得CAN网络已配置的所有CAN控制器的模式指示,这将以T_RESTART_CC_INDICATED触发CAN网络的子状态CANSM_BSM_S_FULLCOM。
假定控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应以T_RESTART_CC_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_FULLCOM。
效果 E_TX_OFF什么也不做
如果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 >请求。
如果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。
回调函数CanSM_TxTimeoutException应通过T_TX_TIMEOUT_EXCEPTION触发子状态机CANSM_BSM_S_FULLCOM。
在S_NO_BUS_OFF状态下,CanSM模块不需要任何状态操作。
假定控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时后,该条件应通过T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION。
如果状态操作 DO_SET_CC_MODE_STOPPED()的所有API调用都返回了E_OK,则通过子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION的防护条件G_CC_STOPPED_E_OK。
只要子状态机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。
如果在请求停止相应的CAN网络的CAN控制器后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将通过T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION。
如果在请求启动CAN网络的CAN控制器的相应之后,CanSM模块已经获得CAN网络的所有已配置CAN控制器的模式指示,这将通过T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION。
如果状态操作DO_SET_CC_MODE_STARTED返回E_OK,那么应通过子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION的防护条件G_CC_STARTED_E_OK。
只要子状态机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。
如果通过T_CC_STARTED_INDICATED触发了子状态机CANSM_BSM_S_TX_TIMEOUT_EXCEPTION,则应使用参数CANIF_ONLINE调用API CanIf_SetPduMode()。
状态操作DO_SET_BAUDRATE_DIRECT应为CAN网络中所有已配置的CAN控制器调用API请求CanIf_SetBaudrate,并使用各自的ControllerId参数。CanSM_SetBaudrate()中的相应函数参数BaudRateConfigID作为BaudRateConfigID参数。
如果所有CanIf_SetBaudrate请求都返回E_OK,则应通过保护条件G_SET_BAUDRATE_DIRECT_OK。
如果任意CanIf_SetBaudrate请求返回E_NOT_OK,那么应通过状态CANSM_BSM_CHANGE_BR_SYNC的防护条件G_SET_BAUDRATE_NOT_OK。
只要子状态机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。
如果 状态 S_CC_STOPPED 中的操作的所有API调用都返回了E_OK,则应通过子状态机CANSM_BSM_S_CHANGE_BAUDRATE的保护条件G_CC_STOPPED_OK。
在请求停止相应的CAN网络的CAN控制器之后,如果CanSM模块已获得CAN网络的已配置所有CAN控制器的模式指示,这将通过T_CC_STOPPED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。
控制器停止模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应通过T_CC_STOPPED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_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参数。
只要子状态机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。
如果在状态 S_CC_STARTED 中的操作的所有API返回都为E_OK,那么应通过子状态机CANSM_BSM_S_CHANGE_BAUDRATE的防护条件G_CC_STARTED_OK。
如果在请求启动相应CAN网络的CAN控制器之后,CanSM模块已获得CAN网络的所有已配置CAN控制器的模式指示,这将通过T_CC_STARTED_INDICATED触发CAN网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。
假定控制器启动模式指示,在CANSM_MODEREQ_REPEAT_TIME超时之后,该条件应通过T_CC_STARTED_TIMEOUT触发相应网络的子状态机CANSM_BSM_S_CHANGE_BAUDRATE。
如果通过CanSM_RequestComMode最近接受的通信模式请求,参数ComM_Mode等于COMM_NO_COMMUNICATION,则子状态机CANSM_BSM_S_CHANGE_BAUDRATE应通过保护条件G_NO_COM_MODE_REQUESTED。
如果通过CanSM_RequestComMode最近接受的通信模式请求,参数ComM_Mode等于COMM_SILENT_COMMUNICATION或COMM_FULL_COMMUNICATION,则子状态机CANSM_BSM_S_CHANGE_BAUDRATE应通过保护条件G_NO_COM_MODE_NOT_REQUESTED。