AUTOSAR通信之CAN状态管理:CanSM
汽车控制与人工智能

让人工智能更好地服务出行,智行天下
1 CanSM的位置和作用
网络管理的架构如图1所示。最上层是通信管理器ComM模块,负责简化用户对网络管理和总线通信状态的
控制。网络管理部分使用通信服务栈来发送和接收维护网络激活态的网络管理帧。总线相关的状态管理器
通过使用通信服务栈的服务来控制总线的通信状态。网络管理在ECU抽象层和微控制器抽象层直接使用通
信服务栈的模块。

图 1 网络管理架构
每个通信总线都有各自与总线相关的状态管理模块。这个模块实现对应总线的控制流。总线相关的状态管理器模块主要负责维护两个状态机:
网络通信模式状态机:负责维护网络通信模式;总线离线恢复状态机:负责把总线从离线事件中恢复。CAN总线的状态管理器CanSM,它负责实现CAN网络控制流程的抽象。CanSM提供API以便ComM来请
求CAN网络进行通信模式的切换。ComM请求切换网络模式时,会传递一个参数,用以标识是哪个网络。
对应网络收到该请求后,会执行对应的通信模式切换。在网络通信模式切换的过程中,会执行对应的CAN
外设控制和PDU处理。
由于延迟等原因,网络的通信模式可能会和ComM请求的不一致。这就需要CanSM通过以下方式来提供接口向ComM反馈当前的通信模式:
CanSM提供API,ComM可以通过这个API调用来得到CAN网络当前的通信模式。CanSM使用ComM提供的回调函数来通知通信模式的改变。
2 CanSM与各模块间的交互

图2 CanSM和各模块间的交互
EcuM模块会初始化CanSM模块,并与CanSM模块交互进行CAN总线唤醒的验证。BSW操作系统调用
CanSM模块的主函数,这是CanSM模块循环处理必不可少的。ComM模块使用CanSM模块的API请求
CAN网络的通信模式,这些通信模式由唯一的网络句柄标识,同时,CanSM模块会将其CAN网络的当前
通信模式通知给ComM模块。CanSM模块使用CanIf模块的API来控制CAN控制器和分配给CAN网络的
CAN收发器工作模式。CanIf模块通知CanSM模块有关的外围事件。CanSM模块向DEM模块报告总线特
定的故障信息。CanSM将总线特定的模式更新通知到BswM模块。CanSM模块将部分网络可用性通知给CanNm模块,并在部分联网的情况下处理已通知的CanNm超时异常。CanSM模块向DET模块报告开发和
运行时错误。当然,只有在通过配置打开错误处理时,才会报告相应故障。
3 CanSM网络模式的管理
一个ECU可以有不同的通信网络,每个网络都有唯一网络句柄来识别。ComM模块从网络请求通信模式,
它通过配置得知哪个句柄被分配给哪种网络。如果是CAN,则使用CanSM模块。CanSM模块负责CAN网
络的控制流抽象:它根据来自ComM模块的模式请求改变所配置的CAN网络的通信模式。
因此,CanSM模块使用了CanIf模块的API。CanIf模块负责已配置的CAN控制器和CAN收发器的控制流抽
象。CAN控制器模式和CAN收发模式的任何更改都将由CanIf模块通知CanSM模块。根据此通知和CAN网
络状态机的状态(CanSM模块将为每个已配置的CAN网络实现此状态机),CanSM模块将通知ComM和
BswM。

图3 CanSM的状态机总揽
CanSM模块在内部存储每个已配置的CAN网络的当前网络模式,存储的网络模式包括:
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. 保护条件
如果最新接受的通信模式请求中参数ComM_Mode为COMM_FULL_COMMUNICATION,则该状态机的
保 护 条 件 G_FULL_COM_MODE_REQUESTED; 如 果 其 参 数 ComM_Mode 为
COMM_SILENT_COMMUNICATION , 则 该 状 态 机 的 保 护 条 件 为
G_SILENT_COM_MODE_REQUESTED。
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.1 CANSM_BSM_WUVALIDATION
如果CAN网络的CAN收发器已配置,只要子状态CANSM_BSM_WUVALIDATION 处于S_TRCV_NORMAL
状态,CanSM模块会执行DO_SET_TRCV_MODE_NORMAL,并重复API请求CanIf_SetTrcvMode。如
果API函数CanIf_SetTrcvMode的返回值为E_OK,则该子状态的保护条件G_TRCV_NORMAL_E_OK将
通过。

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
如 果 子 状 态 CANSM_BSM_S_PRE_FULLCOM 在 S_TRCV_NORMAL , CanSM 模 块 将 执 行 行 为
DO_SET_TRCV_MODE_NORMAL,并且重复调用API请求CanIf_SetTrcvMode。如果该函数的返回值
为E_OK,该子状态的保护条件G_TRCV_NORMAL_E_OK将通过。

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网络的通信模式。
汽车ECU设计

一个菜鸟程序猿的成长之路。116篇原创内容
公众号
🌏 微 信:@氨气中的战斗机✍🏻 知 乎:@吃完饭后不刷牙👬 公众号:@汽车ECU设计