图 1 网络管理架构
每个通信总线都有各自与总线相关的状态管理模块。这个模块实现对应总线的控制流。总线相关的状态管理器模块主要负责维护两个状态机:
-
网络通信模式状态机:负责维护网络通信模式;
-
总线离线恢复状态机:负责把总线从离线事件中恢复。
由于延迟等原因,网络的通信模式可能会和ComM请求的不一致。这就需要CanSM通过以下方式来提供接口向ComM反馈当前的通信模式:
-
CanSM提供API,ComM可以通过这个API调用来得到CAN网络当前的通信模式。
-
CanSM使用ComM提供的回调函数来通知通信模式的改变。
2 CanSM与各模块间的交互
3 CanSM网络模式的管理
-
COMM_NO_COMMUNICATION
-
COMM_SILENT_COMMUNICATION
-
COMM_FULL_COMMUNICATION
如果CanSM状态机CANSM_BSM处于CANSM_BSM_S_NOT_INITIALIZED状态,它将拒绝来自ComM模块的网络模式请求。如果用T_REPEAT_MAX触发了CanSM模块状态机,则CanSM模块将使用事件ID:CANSM_E_MODE_REQUEST_TIMEOUT来调用函数Dem_SetEventStatus。
CanIf模块通过回调函数CanSM_ConfirmPnAvailability来通知已配置PN的CAN收发器的可用性给CanSM模块,然后CanSM模块将调用的API:CanNm_ConfirmPnAvailability,通过相关网络的通道来确认PN的可用性。这里的PN是指patial network,部分网络。
如果没有为CAN网络配置CanSMTransceiverId,那么CanSM模块应该绕过对CAN网络的所有指定CanIf_SetTrcvMode调用,并继续进行不同的状态转换,就好像它已经获得假定的CanSM_TransceiverModeIndication指示一样。
CanSM模块为每个已配置的CAN网络存储最新的通信模式请求,该请求已经在API请求CanSM_RequestComMode中返回E_OK接受,并将其用作相关CAN网络状态机的触发器。每次CAN控制器模式切换成功或总线条件切换到CAN_CS_STOPPED后,CanSM模块都会在内部存储每个CAN控制器的切换模式。
状态机详解
1. 触发条件
上电后,CanSM状态机处于CANSM_BSM_NOT_INITIALIZED。
如果使用函数CanSM_Init请求CanSM模块,则将通过该函数触发所有已配置的CAN网络的CanSM状态机。CanSM_DeInit函数的调用也是类似。
如果API函数CanSM_StartWakeUpSource返回的状态为E_OK,则将会通过T_START_WAKEUP_SOURCE触发状态机;如果API函数CanSM_StopWakeUpSource返回状态为E_OK,则将会通过T_STOP_WAKEUP_SOURCE触发状态机。
如果API函数CanSM_RequestComMode中的参数ComM_Mode为COMM_FULL_COMMUNICATION,将会通过T_FULL_COM_MODE_REQUEST触发状态机。如果参数ComM_Mode为COMM_SILENT_COMMUNICATION,则会通过CANSM_BSM_S_FULLCOM触发子状态。如果参数ComM_Mode为COMM_NO_COMMUNICATION,则通过T_NO_COM_MODE_REQUEST触发状态机。
如果配置的CAN控制器匹配到回调函数CanSM_ControllerBusOff的ControllerId,该函数会通过T_BUS_OFF触发状态机到CANSM_BSM。
如果状态机CANSM_BSM重复的是子状态,CanIf API没有得到返回值E_OK或没有得到该模式指示,将通过T_REPEAT_MAX触发状态机CANSM_BSM。
2. 保护条件
3. 效应
当API函数BswM_CanSM_CurrentState的参数Network为CanSMComMNetworkHandleRef或CurrentState为CANSM_BSWM_NO_COMMUNICATION,状态机E_PRE_NOCOM的效果是会调取相应的CAN网络。
CanSM_BSM状态机中E_NOCOM的作用是将所寻址的CAN网络的内部存储网络模式更改为COMM_NO_COMMUNICATION。如果网络的通信模式请求已经存在,并且为COMM_NO_COMMUNICATION,状态机CanSM_BSM中E_NOCOM的效果是,调用API函数ComM_BusSM_ModeIndication。
如果ECU非被动模式,则状态机CanSM_BSM中E_FULL_COM的效果是,在CAN网络的每个配置CAN控制器的第一个位置调用API函数CanIf_SetPduMode,其参数ControllerId为 CanSMControllerId和PduModeRequest为 CANIF_ONLINE。
如果ECU为被动模式,那么E_FULL_COM 的效果是,在CAN网络的每个配置CAN控制器的第一个位置调用API函数,其参数ControllerId为CanSMControllerId和PduModeRequest为CANIF_TX_OFFLINE_ACTIVE。
状态机CanSM_BSM中E_FULL_TO_SILENT_COM的效果是,第一个位置调用对应的CAN网络API函数BswM_CanSM_CurrentState,其参数network为 CanSMComMNetworkHandleRef和CurrentState为 CANSM_BSWM_SILENT_COMMUNICATION。在第二个位置调用API 函数CanIf_SetPduMode,其参数ControllerId为CanSMControllerId和PduModeRequest为CANIF_TX_OFFLINE。
4. 子状态
4.2 CANSM_BSM_S_PRE_NOCOM
如果CanSMTransceiverId中的参数CanTrcvPnEnabled配置为False,则子状态CANSM_BSM_S_PRE_NO_COM 的保护条件CANSM_BSM_G_PN_NOT_SUPPORTED将会执行;如果CanTrcvPnEnabled配置为True,则保护条件CANSM_BSM_G_PN_SUPPORTED将执行。
4.3 CANSM_BSM_S_SILENTCOM_BOR
只要子状态CANSM_BSM_S_SILENTCOM_BOR处于S_RESTART_CC,CanSM模块将执行行为DO_SET_CC_MODE_STARTED,并且重复执行API函数CanIf_SetControllerMode。如果该函数的返回值为E_OK,那么保护条件G_RESTART_CC_OK将通过。
4.4 CANSM_BSM_S_PRE_FULLCOM
4.5 CANSM_BSM_S_FULLCOM
如果CANSM_BOR_TX_CONFIRMATION_POLLING 使能,则该子状态的保护条件G_BUS_OFF_PASSIVE将通过,同时,API函数CanIf_GetTxConfirmationState的返回值为CANIF_TX_RX_NOTIFICATION。
4.6 CANSM_BSM_S_CHANGE_BAUDRATE
该状态操作DO_SET_BAUDRATE_DIRECT会调用CanIf_SetBaudrate函数,如果该函数的所有请求都返回E_OK,保护条件G_SET_BAUDRATE_DIRECT_OK将会通过。反之,如果返回值为E_NOT_OK,则保护条件G_SET_BAUDRATE_NOT_OK将执行通过。
总结
CanSM是通信服务层的成员,它与通信硬件抽象层和系统服务层交互。每个ECU可以有不同的通信网络,每个网络都有惟一的网络句柄来识别。CanSM模块负责CAN网络的控制流抽象:它根据来自ComM模块的模式请求改变所配置的CAN网络的通信模式。