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状态机”获取)

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网络的通信模式。

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值