【Mode Management】CanSM详细介绍

目录

1. Introduction and functional overview

2.Dependencies to other modules

3.Functional specification

3.1General requirements

3.2State machine for each CAN network

3.2.1Trigger: PowerOn

3.2.2Trigger: CanSM_Init

3.2.3 Trigger: CanSM_DeInit

3.2.4 Trigger: T_START_WAKEUP_SOURCE

3.2.5 Trigger: T_STOP_WAKEUP_SOURCE

3.2.6 Trigger: T_FULL_COM_MODE_REQUEST

3.2.7 Trigger: T_NO_COM_MODE_REQUEST

3.2.8 Trigger: T_BUS_OFF

3.2.9 Trigger: T_REPEAT_MAX

3.2.10 Guarding condition: G_FULL_COM_MODE_REQUESTED

3.2.11 Guarding condition: G_SILENT_COM_MODE_REQUESTED

3.2.12 Effect: E_PRE_NOCOM

3.2.13 Effect: E_NOCOM

3.2.14 Effect: E_FULL_COM

3.2.15 Effect: E_FULL_TO_SILENT_COM

3.2.16 Effect: E_BR_END_FULL_COM

3.2.17 Effect: E_BR_END_SILENT_COM

3.2.18 Effect: E_SILENT_TO_FULL_COM

3.2.19 Sub state machine CANSM_BSM_WUVALIDATION

3.2.20 Sub state machine: CANSM_BSM_S_PRE_NOCOM

3.2.21 Sub state machine: CANSM_BSM_S_SILENTCOM_BOR

3.2.22 Sub state machine: CANSM_BSM_S_PRE_FULLCOM

3.2.23 Sub state machine CANSM_BSM_S_FULLCOM

3.2.24 Sub state machine: CANSM_BSM_S_CHANGE_BAUDRATE

4.关键API

4.1Function definitions

4.2Call-back notifications

4.3 Scheduled functions

5.CanSM和其他模块交互时序分析

5.1CanSm_StartCanController时序图

5.2CanSm_StopCanController时序图

6.CanSM模块配置

6.1CanSMGeneral

6.2CanSMConfiguration

6.2.1 CanSMController

6.2.2 CanSMDemEventParameterRefs


1. Introduction and functional overview

AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。

CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个或者多个CAN控制器或者收发器驱动。

2.Dependencies to other modules

ECU State Manager (EcuM)

EcuM模块初始化CanSM模块,并与CanSM模块进行交互,以进行CAN唤醒验证。

BSW Scheduler (SchM)

SchM模块周期调用CanSM模块的MainFunction函数。

Communication Manager (ComM) 

ComM模块使用CanSM模块的API来请求CAN网络的通信模式,并使用唯一的网络句柄进行标识。CanSM模块通知当前CAN网络的通信模式给ComM模块。

CAN Interface (CanIf)

CanSM模块使用CanIf模块的API来控制分配给CAN网络的CAN控制器和CAN收发器的操作模式。CanIf模块将外设事件通知给CanSM模块。

Diagnostic Event Manager (DEM)

CanSM模块将特定的总线错误上报给DEM模块。

Basic Software Mode Manager (BswM)

CanSM模块将总线模式的改变通知到BswM模块。

CAN Network Management (CanNm)

CanSM模块需要将能用的CAN网络通知给CanNM模块,CanSM模块也需要处理CanNM模块通知的超时异常。

Default Error Tracer (DET)

CanSM模块将运行时的错误上报给DET模块。

3.Functional specification

一个ECU可以有不同的通信网络。每个网络都必须用一个唯一的网络句柄来标识。通信模块向网络请求通信模式。它通过它的配置知道哪个句柄被分配给了什么类型的网络。对于CAN,它使用CanSM模块。CanSM模块负责CAN网络的控制流抽象:它根据来自ComM模块的模式请求改变配置的CAN网络的通信模式。

因此CanSM模块使用CanIf模块的API。CanIf模块负责所配置的CAN控制器和CAN收发器的控制流抽象(CanIf模块的数据流抽象与CanSM模块无关)。CAN控制器模式和CAN收发器的任何改变

模式将由CanIf模块通知到CanSM模块。根据CAN网络状态机的通知和状态,CanSM模块将通知ComM和BswM, CanSM模块将为每个配置的CAN网络实现这些通知和状态

3.1General requirements

CanSM模块应该将每一个配置了的CAN通道的当前模式存储下来。

一个CAN网络没有配置CanSMTransceiverId参数,那么CanSM模块将绕过所有指定的CAN网络的CanIf_SetTrcvMode调用,并继续不同的状态转换,就像它已经获得了假定的 CanSM_TransceiverModeIndication。也就是说,一个CAN网络没有配置CanSMTransceiverId参数,当上层模块调用CanIf_SetTrcvMode函数,CanSM模块认为CAN模式转换成功,切换CanSM内部存储的CAN模式,同时调用CanSM_TransceiverModeIndication模式切换函数通知到上层模块。

上层模块对每一个CAN网络的最近一次调用CanSM_RequestComMode函数且返回成功E_OK的请求应该被CanSM模块存储下来,这些请求时CAN网络状态机切换的条件。

3.2State machine for each CAN network

CanSM模块为每一路CAN网络维持一个内部的状态机,包括:CANSM_BSM_S_FULLCOM,CANSM_BSM_S_PRE_FULLCOM,CANSM_BSM_S_CHANGE_BAUDRATE,CANSM_BSM_WUVALIDATION,CANSM_BSM_S_SILENTCOM_BOR,CANSM_BSM_S_SILENTCOM,CANSM_BSM_S_PRE_NOCOM,CANSM_BSM_S_NOCOM,CANSM_BSM_S_NOT_INITIALIZED 9种状态。

以下对于CanSM内部状态机切换的描述都是站在一路CAN状态机的角度来描述的。

3.2.1Trigger: PowerOn

ECU上电后,每一路CanSM状态机默认进入CANSM_BSM_S_NOT_INITIALIZED状态。

3.2.2Trigger: CanSM_Init

EcuM模块调用CanSM_Init函数,CanSM状态从CANSM_BSM_S_NOT_INITIALIZED切换到CANSM_BSM_S_PRE_NOCOM状态。

3.2.3 Trigger: CanSM_DeInit

只有在CANSM_NO_COMMUNICATION状态下调用CanSM_DeInit函数才会发生状态改变,CanSM状态从CANSM_NO_COMMUNICATION状态且切换到CANSM_BSM_S_NOT_INITIALIZED状态

CanSM_DeInit函数被调用且成功后会触发CanSM模块管理的所有CAN网络发生状态改变。

3.2.4 Trigger: T_START_WAKEUP_SOURCE

CanSM状态机处于CANSM_BSM_S_PRE_NOCOM或者CANSM_BSM_S_NOCOM状态下, 上层模块调用CanSM_StartWakeUpSource开始唤醒源检测(一般是在EcuM模块调用),并且函数返回E_OK,则CanSM状态机切换到CANSM_BSM_WUVALIDATION状态。

3.2.5 Trigger: T_STOP_WAKEUP_SOURCE

CanSM状态机处于CANSM_BSM_WUVALIDATION状态时,上层模块调用 CanSM_StopWakeUpSource函数停止唤醒源检测,并且函数返回E_OK,则CanSM状态机切换到CANSM_BSM_S_PRE_NOCOM状态。

3.2.6 Trigger: T_FULL_COM_MODE_REQUEST

CanSM状态机处于CANSM_BSM_WUVALIDATION或者CANSM_BSM_S_NOCOM状态时,上层模块调用CanSM_RequestComMode且函数参数ComM_Mode等于COMM_FULL_COMMUNICATION时(ComM模块调用),则函数参数 network标识的网络CanSM状态机切换到CANSM_BSM_S_PRE_FULLCOM状态。

3.2.7 Trigger: T_NO_COM_MODE_REQUEST

CanSM状态机处于CANSM_BSM_S_FULLCOM或者CANSM_BSM_S_PRE_FULLCOM或者CANSM_BSM_S_SILENTCOM状态时,上层模块调用CanSM_RequestComMode且函数参数ComM_Mode等于COMM_NO_COMMUNICATION时,则函数参数 network标识的网络CanSM状态机切换到CANSM_BSM_S_PRE_NOCOM状态。

3.2.8 Trigger: T_BUS_OFF

CanSM状态机处于CANSM_BSM_S_SILENTCOM状态时,CAN网络发生BusOff实践,CanSM模块的回调函数 CanSM_ControllerBusOff被调用,CanSM状态机切换到CANSM_BSM_S_SILENTCOM_BOR状态。

3.2.9 Trigger: T_REPEAT_MAX

CanSM状态机处于CANSM_BSM_S_SILENTCOM_BOR状态时,CanSM模块调用CanIf模块的接口尝试从新开启CAN控制器,如果没有返回E_OK且没有收到预定的开始CAN控制器的成功通知的次数(失败的次数)大于配置参数T_REPEAT_MAX后,状态机机切换到CANSM_BSM_S_PRE_NOCOM状态。

3.2.10 Guarding condition: G_FULL_COM_MODE_REQUESTED

CanSM状态机处于CANSM_BSM_S_CHANGE_BAUDRATE状态时,上层模块(ComM)调用CanSM_RequestComMode函数请求Can通信模式的最后的请求是全通信模式(ComM_Mode等于COMM_FULL_COMMUNICATION),状态机切换到CANSM_BSM_S_FULLCOM状态。

3.2.11 Guarding condition: G_SILENT_COM_MODE_REQUESTED

CanSM状态机处于CANSM_BSM_S_CHANGE_BAUDRATE状态时,上层模块(ComM)调用CanSM_RequestComMode函数请求Can通信模式的最后的请求是静默模式(ComM_Mode等于COMM_SILENT_COMMUNICATION),状态机切换到CANSM_BSM_S_SILENTCOM状态。

3.2.12 Effect: E_PRE_NOCOM

CanSM状态机处于CANSM_BSM_S_FULLCOM或者CANSM_BSM_S_SILENTCOM或者CANSM_BSM_S_SILENTCOM_BOR状态,CanSM状态机由于满足T_NO_COM_MODE_REQUEST,T_REPEAT_MAX或者T_NO_COM_MODE_REQUEST条件切换到CANSM_BSM_S_PRE_NOCOM状态,则BswM_CanSM_CurrentState函数将被调用( Network := CanSMComMNetworkHandleRef and CurrentState := CANSM_BSWM_NO_COMMUNICATION)。

3.2.13 Effect: E_NOCOM

CanSM状态机处于CANSM_BSM_S_PRE_NOCOM状态切换到CANSM_BSM_S_NOCOM状态时,如果已经存在网络的通信模式请求,且存储的通信模式请求为COMM_NO_COMMUNICATION,那么CanSM_BSM状态机的效果E_NOCOM将使用参数Channel:= CanSMComMNetworkHandleRef和ComMode:= COMM_NO_COMMUNICATION调用API ComM_BusSM_ModeIndication。

3.2.14 Effect: E_FULL_COM

CanSM状态机从CANSM_BSM_S_PRE_FULLCOM状态切换到CANSM_BSM_S_FULLCOM状态时,将会产生以下的动作(Effect)。

(1)如果 ECU被动模式(ECU passive mode)等于true,则 CanIf_SetPduMode被调用( ControllerId := CanSMControllerId, PduModeRequest :=CANIF_ONLINE.)。

(2)如果 ECU被动模式(ECU passive mode)等于false,则 CanIf_SetPduMode被调用( ControllerId := CanSMControllerId, PduModeRequest :=CANIF_TX_OFFLINE_ACTIVE.)。

(3)CanSM模块将会调用 ComM_BusSM_ModeIndication函数(Channel :=

CanSMComMNetworkHandleRef, ComMode := COMM_FULL_COMMUNICATION)。

(4)CanSM模块将会调用 BswM_CanSM_CurrentState函数( Network :=

CanSMComMNetworkHandleRef,CurrentState :=CANSM_BSWM_FULL_COMMUNICATION)。

3.2.15 Effect: E_FULL_TO_SILENT_COM

CanSM状态机从CANSM_BSM_S_FULLCOM状态切换到CANSM_BSM_S_SILENTCOM状态时,将会产生以下的动作(Effect)。

(1)CanSM模块将会调用 BswM_CanSM_CurrentState函数( Network :=

CanSMComMNetworkHandleRef,CurrentState :=CANSM_BSWM_SILENT_COMMUNICATION)

(2)CanIf_SetPduMode被调用( ControllerId := CanSMControllerId, PduModeRequest :=CANIF_TX_OFFLINE.)。

(3)CanSM模块将会调用 ComM_BusSM_ModeIndication函数(Channel :=

CanSMComMNetworkHandleRef, ComMode := COMM_SILENT_COMMUNICATION)。

3.2.16 Effect: E_BR_END_FULL_COM

CanSM状态机从CANSM_BSM_S_CHANGE_BAUDRATE状态切换到CANSM_BSM_S_FULLCOM状态。产生的动作(Effect)和3.2.14一样。

3.2.17 Effect: E_BR_END_SILENT_COM

CanSM状态机从CANSM_BSM_S_CHANGE_BAUDRATE状态切换到CANSM_BSM_S_SILENTCOM状态。产生的动作(Effect)和3.2.15一样。

3.2.18 Effect: E_SILENT_TO_FULL_COM

CanSM状态机从CANSM_BSM_S_SILENTCOM状态切换到CANSM_BSM_S_FULLCOM状态。产生的动作(Effect)和3.2.14一样。

3.2.19 Sub state machine CANSM_BSM_WUVALIDATION

CANSM_BSM_WUVALIDATION状态包含:S_TRCV_NORMAL,S_TRCV_NORMAL_WAIT,S_CC_STOPPED,S_CC_STOPPED_WAIT,S_CC_STARTED,S_CC_STARTED_WAIT,WAIT_WUVALIDATION_LEAVE六个子状态。

默认进入S_TRCV_NORMAL状态,CanSM模块会调用 CanIf_SetTrcvMode( TransceiverMode ==  CANTRCV_TRCVMODE_NORMAL)函数设置CanTrcv收发器到 CANTRCV_TRCVMODE_NORMAL状态,如果接收到CanIf的Indication(CanTrcv转换到CANTRCV_TRCVMODE_NORMAL模式),则进入到S_CC_STOPPED状态。如果没有接收到CanIf的Indication,则进入到S_TRCV_NORMAL_WAIT状态(S_TRCV_NORMAL_WAIT状态下也可以接收到CanIf的Indication切换到S_CC_STOPPED状态)。

同样的逻辑:

S_CC_STOPPED 切换到 S_CC_STARTED状态的条件:CanSM模块调用CanIf_SetTrcvMode( TransceiverMode ==  CAN_CS_STOPPED)且接收到CanTcv切换到CAN_CS_STOPPED模式的Indication。同样存在TimeOut的情况。

S_CC_STARTED切换到WAIT_WUVALIDATION_LEAVE状态的条件:调用CanIf_SetTrcvMode( TransceiverMode ==  CAN_CS_STARTED)且接收到CanTcv切换到CAN_CS_STARTED模式的Indication。同样存在TimeOut的情况。

最后,如果整个子状态机从WAIT_WUVALIDATION_LEAVE退出,则进入到CANSM_BSM_S_PRE_FULLCOM状态,否则(超过重复请求最大次数,T_REPEAT_MAX)进入到CANSM_BSM_S_PRE_NOCOM状态。

3.2.20 Sub state machine: CANSM_BSM_S_PRE_NOCOM

CANSM_BSM_S_PRE_NOCOM状态包含:CANSM_BSM_DeinitPnNotSupported,CANSM_BSM_DeinitPnSupported

CANSM_BSM_DeinitPnSupported两个子状态。

进入CANSM_BSM_S_PRE_NOCOM状态后,根据配置参数CanTrcvPnEnabled进入不同的子状态:

CanTrcvPnEnabled == FALSE,进入CANSM_BSM_DeinitPnNotSupported子状态。

CanTrcvPnEnabled == TRUE,进入CANSM_BSM_DeinitPnSupported子状态。

CANSM_BSM_DeinitPnSupported子状态下又包含极为复杂的子状态,一般我们CanTrcvPnEnabled 配置为FALSE,这里不再深入讲解。

CANSM_BSM_DeinitPnNotSupported子状态下又包含:S_CC_STOPPED,S_CC_STOPPED_WAIT,S_CC_SLEEP,S_CC_SLEEP_WAIT,S_TRCV_NORMAL,S_TRCV_NORMAL_WAIT,S_TRCV_STANDBY,S_TRCV_STANDBY_WAIT八个子状态。

默认进入S_CC_STOPPED子状态,随后的逻辑和3.2.19中子状态迁移逻辑类似。

S_CC_STOPPED状态切换到S_CC_SLEEP状态:CanSM调用CanIf_SetControllerMode(ControllerMode ==  CAN_CS_STOPPED)且接收到Can控制器模块(Can Controller)的模式切换成功的Indication。

S_CC_SLEEP状态切换到S_TRCV_NORMAL状态:CanSM调用CanIf_SetControllerMode(ControllerMode ==   CAN_CS_SLEEP,)且接收到Can控制器模块(Can Controller)的模式切换成功的Indication。

S_TRCV_NORMAL状态切换到S_TRCV_STANDBY状态:CanSM调用CanIf_SetTrcvMode(TransceiverMode == CANTRCV_TRCVMODE_NORMAL)且接收到Can收发器(CanTrcv)模块的模式切换成功的Indication。

S_TRCV_STANDBY状态退出整个CANSM_BSM_DeinitPnNotSupported状态:CanSM调用CanIf_SetTrcvMode(TransceiverMode == CANTRCV_TRCVMODE_STANDBY)且接收到Can收发器(CanTrcv)模块的模式切换成功的Indication。

整个子状态切换过程中,任何一个状态切换如果没有收到对应的Indication,则会进入到超时TimeOut状态,然后重试Repeat,一旦重试次数大于T_REPEAT_MAX,则状态机退出整个CANSM_BSM_DeinitPnNotSupported状态。

3.2.21 Sub state machine: CANSM_BSM_S_SILENTCOM_BOR

CANSM_BSM_S_SILENTCOM_BOR状态下包括:S_RESTART_CC,CANSM_BSM_S_RESTART_CC_WAIT两个子状态。

默认进入S_RESTART_CC子状态,在S_RESTART_CC子状态下CanSM模块调用CanIf_SetControllerMode( ControllerMode ==  CAN_CS_STARTED)函数,如果接收到Can控制器模式切换成功的Indication,则退出CANSM_BSM_S_SILENTCOM_BOR状态,否则CanIf_SetControllerMode函数调用后进入CANSM_BSM_S_RESTART_CC_WAIT子状态。

3.2.22 Sub state machine: CANSM_BSM_S_PRE_FULLCOM

CANSM_BSM_S_PRE_FULLCOM状态下包括:S_TRCV_NORMAL,S_TRCV_NORMAL_WAIT,S_CC_STOPPED,S_CC_STOPPED_WAIT,S_CC_STARTED,S_CC_STARTED_WAIT六个子状态。

默认进入S_TRCV_NORMAL状态。

S_TRCV_NORMAL状态切换到S_CC_STOPPED状态:CanSM调用CanIf_SetTrcvMode(TransceiverMode == CANTRCV_TRCVMODE_NORMAL)函数,且接收到Can收发器(CanTrcv)模块的模式切换成功的Indication,否则进入到S_TRCV_NORMAL_WAIT状态。

S_CC_STOPPED状态切换到S_CC_STARTED状态:CanSM调用CanIf_SetControllerMode(ControllerMode==  CAN_CS_STOPPED)函数,且接收到Can控制器(Can Controller)模块的模式切换成功的Indication,否则进入到S_CC_STOPPED_WAIT状态。

S_CC_STARTED状态切换到退出整个CANSM_BSM_S_PRE_FULLCOM状态:CanSM调用CanIf_SetControllerMode(ControllerMode==   CAN_CS_STARTED,)函数,且接收到Can控制器(Can Controller)模块的模式切换成功的Indication,否则进入到S_CC_STARTED_WAIT状态。

整个子状态切换过程中,任何一个状态切换如果没有收到对应的Indication,则会进入到超时TimeOut状态,然后重试Repeat,一旦重试次数大于T_REPEAT_MAX,则状态机退出整个CANSM_BSM_S_PRE_FULLCOM状态。

3.2.23 Sub state machine CANSM_BSM_S_FULLCOM

CANSM_BSM_S_FULLCOM状态下包括:S_BUS_OFF_CHECK,S_RESTART_CC,S_NO_BUS_OFF,CANSM_BSM_S_TX_TIMEOUT_EXCEPTION,CANSM_BSM_S_RESTART_CC_WAIT,S_TX_OFF六个子状态。

S_BUS_OFF_CHECK状态切换到S_NO_BUS_OFF状态:CANSM_BOR_TX_CONFIRMATION_POLLING功能被Enabled且 CanSM函数调用CanIf_GetTxConfirmationState函数返回 CANIF_TX_RX_NOTIFICATION。

S_NO_BUS_OFF状态退出CANSM_BSM_S_FULLCOM状态切换到CANSM_BSM_S_CHANGE_BAUDRATE状态:CanSM调用CanSM_SetBaudrate且没有被拒绝。如果切换成功,CanSM调用 BswM_CanSM_CurrentState(Network := CanSMComMNetworkHandleRef,CurrentState

:= CANSM_BSWM_CHANGE_BAUDRATE).

S_BUS_OFF_CHECK状态切换到S_RESTART_CC状态:CanSM模块的回调函数CanSM_ControllerBusOff被调用。如果状态切换成功,CanSM调用 BswM_CanSM_CurrentState( Network := CanSMComMNetworkHandleRef and CurrentState

:= CANSM_BSWM_BUS_OFF),CanSM调用ComM_BusSM_ModeIndication( Channel := CanSMComMNetworkHandleRef,ComMode := COMM_SILENT_COMMUNICATION)。

S_RESTART_CC状态切换到S_TX_OFF状态:CanSM模块调用CanIf_SetControllerMode(ControllerMode == CAN_CS_STARTED)且接收到CAN控制器模式切换成功的Indication,否则进入CANSM_BSM_S_RESTART_CC_WAIT状态。

S_TX_OFF状态切换到S_BUS_OFF_CHECK状态:

条件:1 || 2 || 3

(1)CanSMEnableBusOffDelay == FALSE,且Bus-Off恢复从第1级(短恢复时间)切换到第2级(长恢复时间)之前的Bus-Off计数小于 CanSMBorCounterL1ToL2,且总线恢复计时满足快恢复时间 CanSMBorTimeL1。

(2)CanSMEnableBusOffDelay == FALSE,且Bus-Off恢复从第1级(短恢复时间)切换到第2级(长恢复时间)之前的Bus-Off计数大于 CanSMBorCounterL1ToL2,且总线恢复计时满足慢恢复时间 CanSMBorTimeL2。

(3)CanSMEnableBusOffDelay == TRUE,总线恢复后随意指定的时间后即可。

执行的动作:

(1)CanSM调用 CanIf_SetPduMode(ControllerId := CanSMControllerId, PduModeRequest :=

CANIF_ONLINE)

(2)CanSM调用CanIf_SetPduMode(ControllerId := CanSMControllerId,PduModeRequest :=

CANIF_TX_OFFLINE_ACTIVE)

(3)CanSM调用 BswM_CanSM_CurrentState( Network := CanSMComMNetworkHandleRef ,CurrentState := CANSM_BSWM_FULL_COMMUNICATION)

(4)CanSM调用ComM_BusSM_ModeIndication(CanSMComMNetworkHandleRef ,ComMode :=

COMM_FULL_COMMUNICATION)

S_NO_BUS_OFF状态切换到CANSM_BSM_S_RESTART_CC_WAIT状态:回调函数 CanSM_TxTimeoutException被调用。

CANSM_BSM_S_RESTART_CC_WAIT状态下包括:S_CC_STOPPED,S_CC_STOPPED_WAIT,S_CC_STARTED,S_CC_STARTED_WAIT四个子状态。

默认进入S_CC_STOPPED子状态,和之前分析一样,调用CanIf_SetControllerMode先进入 CAN_CS_STOPPED状态后尝试恢复CAN控制器(S_CC_STARTED)。不过值得注意的事,没有超时退出CANSM_BSM_S_TX_TIMEOUT_EXCEPTION状态的机制。

3.2.24 Sub state machine: CANSM_BSM_S_CHANGE_BAUDRATE

CANSM_BSM_S_CHANGE_BAUDRATE状态下包括CANSM_BSM_CHANGE_BR_SYNC,S_CC_STOPPED,S_CC_STOPPED_WAIT,S_CC_STARTED,S_CC_STARTED_WAIT五个子状态。

实际项目中一般不会在运行时动态改变波特率,这里不再详细讲解。

4.关键API

4.1Function definitions

CanSM_RequestComMode

Std_ReturnType CanSM_RequestComMode(NetworkHandleType network,ComM_ModeType ComM_Mode)

改变network参数标识的网络的通信模式为Mode

CanSM_GetCurrentComMode

Std_ReturnType CanSM_GetCurrentComMode(NetworkHandleType network,ComM_ModeType* ComM_ModePtr)

通过指针参数ModePtr获取network标识的网络的通信模式。

CanSM_StartWakeupSource

Std_ReturnType CanSM_StartWakeupSource(NetworkHandleType network)

EcuM模块调用该函数开始CAN唤醒源检测。

CanSM_StopWakeupSource

Std_ReturnType CanSM_StopWakeupSource(NetworkHandleType network)

EcuM模块调用该函数停止CAN唤醒源检测。

4.2Call-back notifications

CanSM_ControllerBusOff

void CanSM_ControllerBusOff(uint8 ControllerId)

通知到CanSM模块ControllerId标识的网络发生Bus-Off事件。

CanSM_ControllerModeIndication

void CanSM_ControllerModeIndication(uint8 ControllerId,Can_ControllerStateType ControllerMode)

通知到CanSM模块,ControllerId标识的网络发生了模式切换到了ControllerMode事件。

CanSM_TransceiverModeIndication

void CanSM_TransceiverModeIndication(uint8 TransceiverId,CanTrcv_TrcvModeType TransceiverMode)

通知到CanSM模块,TransceiverId标识的收发器发生了模式切换到了TransceiverMode事件。

4.3 Scheduled functions

CanSM_MainFunction

void CanSM_MainFunction(void)

5.CanSM和其他模块交互时序分析

CanSM模块的所有交互接口都依赖于CanIf,ComM,BswM,Dem,CanNM等模块。这里以CanSM模块调用CanIf模块接口控制Can控制器为例,说明CanSM模块和其他模块的交互过程。

5.1CanSm_StartCanController时序图

CanSM模块可同步或者异步的设置Can控制器模式。

同步:CanSM模块调用CanIf模块的接口函数CanIf_SetControllerMode设置Can控制器模式,直到接收到CanIf模块的的回调通知CanSM_ControllerModeIndication后CanIf_SetControllerMode函数才返回E_OK,此时Can控制器已经切换到预定的模式。

异步:CanSM模块调用CanIf模块的接口函数CanIf_SetControllerMode后立即返回,之后在CanSM模块的MainFunction中轮询CanIf模块的Indication通知。

5.2CanSm_StopCanController时序图

和CanSm_StartCanController基本类似。

6.CanSM模块配置

CanSM配置主要包括CanSMConfiguration和CanSMGeneral的配置。

CanSMConfiguration: CAN网络的特殊配置,主要包括一些全局配置参数及一些子配置容器的配置。

CanSMGeneral: 通用配置项,主要配置一些预编译功能的开闭。

6.1CanSMGeneral

CanSMDevErrorDetect: 配置是否开启Error检测上报功能。

CanSMGetBusOffDelayFunction: 该参数设置<User_GetBusOffDelay> callout函数的名称,CanSM使用该函数获取额外的L1/L2延迟时间。此功能仅在启用了CanSMEnableBusOffDelay的通道中调用。

CanSMGetBusOffDelayHeader: 该参数配置包含<User_GetBusOffDelay> callout函数原型的头文件。

CanSMIcomSupport: 配置CanSM中对虚拟网络特性的支持。

CanSMMainFunctionTimePeriod: 配置主函数的调度周期。

CanSMPncSupport: 配置是否支持局部网络功能。

CanSMSetBaudrateApi: 配置是否支持Can_SetBaudrate API的使用。

CanSMTxOfflineActiveSupport: 配置是否支持ECU被动功能。

CanSMVersionInfoApi: 配置是否支持版本检测API。

6.2CanSMConfiguration

CanSMModeRequestRepetitionMax: CanSM在进行模式切换请求过程中未收到对应模块模式切换成功的Indication后最大的重试次数。

CanSMModeRequestRepetitionTime: CanSM模块使用CanIf模块的接口重复进行模式切换请求的重复间隔时间。

CanSMManagerNetwork: 这个容器包含每个CAN网络的特定参数。

CanSMBorCounterL1ToL2: 此阈值定义Bus-Off恢复从第1级(短恢复时间)切换到第2级(长恢复时间)之前的Bus-Off计数。

CanSMBorTimeL1: 这个时间参数以秒为单位定义一级(短恢复时间)中Bus-Off恢复时间的持续时间。

CanSMBorTimeL2: 这个时间参数以秒为单位定义第2级(长恢复时间)中Bus-Off恢复时间的持续时间。

CanSMBorTimeTxEnsured: 此参数以秒为单位定义Bus-Off事件检查的持续时间。

CanSMBorTxConfirmationPolling: 如果CanSM轮询CanIf_GetTxConfirmationState API来决定要恢复的总线关闭状态,而不是使用CanSMBorTimeTxEnsured参数来决定,则应该配置此参数。

CanSMEnableBusOffDelay: 这个参数定义了是否应该为这个网络调用<User_GetBusOffDelay>。

CanSMComMNetworkHandleRef: ComM模块中标识一个Can网络的唯一句柄(handle, ComMChannel)。

CanSMTransceiverId: 标识CAN收发器的句柄。

6.2.1 CanSMController

CanSMControllerId: 标识CAN控制器的句柄。

6.2.2 CanSMDemEventParameterRefs

容器中引用DemEventParameter元素,当发生相应的错误时,应该使用API Dem_SetEventStatus调用这些元素。

CANSM_E_MODE_REQUEST_TIMEOUT: 参考配置的DEM事件来报告这个CAN网络的总线关闭错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 | 概率图模型

见微知著&#xff0c;睹始知终。 见到细微的苗头就能预知事物的发展方向&#xff0c;能透过微小的现象看到事物的本质&#xff0c;推断结论或者结果。 概率模型为机器学习打开了一扇新的大门&#xff0c;将学习的任务转变为计算变量的概率分布。 实际情况中&#xff0c;各个变量…

单词接龙[中等]

一、题目 字典wordList中从单词beginWord和endWord的 转换序列 是一个按下述规格形成的序列beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 1、每一对相邻的单词只差一个字母。 2、对于1 < i < k时&#xff0c;每个si都在wordList中。注意&#xff0c;beg…

Midjourney V6版本的5大新特性,掌握了,想法和实现信手拈来

Midjourney v6已推出&#xff1a;更简单的提示、增强的文本集成和更高水平的照片真实感&#xff01;以下是每个创意人员都需要了解的 5 个重要见解。 一、产品文字整合 使用简单风格提示向您的产品添加文本提示&#xff1a;带有文字“SALMA”的白色健身瓶 Midjourney v5.2&am…

Git安装和使用教程,并以gitee为例实现远程连接远程仓库

文章目录 1、Git简介及安装2、使用方法2.1、Git的启动与配置2.2、基本操作2.2.1、搭建自己的workspace2.2.2、git add2.2.3、git commit2.2.4、忽略某些文件不予提交2.2.5、以gitee为例实现git连接gitee远程仓库来托管代码 1、Git简介及安装 版本控制&#xff08;Revision cont…

只用10分钟,ChatGPT就帮我写了一篇2000字文章

有了ChatGPT之后&#xff0c;于我来说&#xff0c;有两个十分明显的变化&#xff1a; 1. 人变的更懒 因为生活、工作中遇到大大小小的事情&#xff0c;都可以直接找ChatGPT来寻求答案。 2. 工作产出量更大 之前花一天&#xff0c;甚至更久才能写一篇原创内容&#xff0c;现…

qt简单连接摄像头

要使用摄像头&#xff0c;就需要链接多媒体模块以及多媒体工具模块 需要在.pro文件中添加QT multimedia multimediawidgets 是用的库文件 QCamera 类用于打开系统的摄像头设备&#xff0c; QCameraViewfinder 用于显示捕获的视频&#xff0c; QCameraImageCapt…

Java并发工具类---ForkJoin、countDownlatch、CyclicBarrier、Semaphore

一、Fork Join fork join是JDK7引入的一种并发框架&#xff0c;采用分而治之的思想来处理并发任务 ForkJoin框架底层实现了工作窃取&#xff0c;当一个线程完成任务处于空闲状态时&#xff0c;会窃取其他工作线程的任务来做&#xff0c;这样可以充分利用线程来进行并行计算&a…

系列十四、SpringBoot + JVM参数配置实战调优

一、SpringBoot JVM参数配置实战调优 1.1、概述 前面的系列文章大篇幅的讲述了JVM的内存结构以及各种参数&#xff0c;今天就使用SpringBoot项目实战演示一下&#xff0c;如何进行JVM参数调优&#xff0c;如果没有阅读过前面系列文章的朋友&#xff0c;建议先阅读后再看本篇文…

Java整合APNS推送消息-IOS-APP(基于.p12推送证书)

推送整体流程 1.在开发者中心申请对应的证书&#xff08;我用的是.p12文件&#xff09; 2.苹果手机用户注册到APNS&#xff0c;APNS将注册的token返回给APP&#xff08;服务端接收使用&#xff09;。 3.后台服务连接APNS&#xff0c;获取连接对象 4.后台服务构建消息载体 5.后台…

Searching for MobileNetV3(2019)

文章目录 Abstract主要内容实验结果 IntroductionRelated WorkEfficient Mobile Building BlocksNetwork SearchPlatform-Aware NAS for Block-wise SearchNetAdapt for Layer-wise Search Network ImprovementsRedesigning Expensive LayersNonlinearitiesLarge squeeze-and-e…

PHP-Xlswriter高性能导出Excel

使用背景 使用传统的PHPExcel导出效率太慢&#xff0c;并且资源占用高&#xff0c;数据量大的情况&#xff0c;会导致服务占用大量的资源&#xff0c;从而导致生产意味&#xff0c;再三思索后&#xff0c;决定使用其他高效率的导出方式 PHP-Xlswriter PHPExcel 因为内存消耗过…

信号与线性系统翻转课堂笔记9——傅里叶变换

信号与线性系统翻转课堂笔记9——傅里叶变换 The Flipped Classroom9 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&#xff09;…

MyBatis中延迟加载,全局和局部的开启使用与关闭

文章目录 MyBatis中延迟加载&#xff0c;全局和局部的开启使用与关闭1、问题提出2、延迟加载和立即加载延迟加载立即加载 3、三种对应的表关系中的加载4、打开全局延迟加载&#xff08;实现一对一的延迟加载&#xff09;5、实现一对多的延迟加载&#xff08;将上面设置的全局延…

零成本搭建一款博客网站(基于Vercel+Hexo完美实现)【保姆级教程】

文章目录 &#x1f438;基于VercelHexo零成本搭建博客网站&#x1f43b;实现思路 &#x1f42e;Hexo的配置与安装&#x1f412;Hexo的美化与使用&#x1f42b;Github的推送与部署&#x1f43c;Vercel部署与网站上线&#x1f41b;总结 &#x1f438;基于VercelHexo零成本搭建博客…

【数据结构】递归与分治

一.递归 1.递归的概念&#xff1a; 子程序&#xff08;或函数&#xff09;. 接调用自己或通过一系列调用语句间接调用自己&#xff0c;成为递归。 递归是一种描述问题和解决问题的基本方法。 重复地把问题转化为与原问题相似的新问题&#xff0c;直到问题解决为止。 2.递归…

ElasticSearch学习篇9_文本相似度计算方法现状以及基于改进的 Jaccard 算法代码实现

背景 XOP亿级别题库的试题召回以及搜题的举一反三业务场景都涉及使用文本相似搜索技术&#xff0c;学习此方面技术以便更好的服务于业务场景。 目前基于集合的Jaccard算法以及基于编辑距离的Levenshtein在计算文本相似度场景中有着各自的特点&#xff0c;为了优化具体的计算时…

【Linux驱动】字符设备驱动程序框架 | LED驱动

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;Hello驱动程序⚽驱动程序框架⚽编程 &#x1f3c0;LED驱动⚽配置GPIO⚽编程驱动…

YB75XXH系列是采用CMOS工艺制造,低功耗的高压稳压器

YB75xxH 高耐压线性稳压器 ■产品简介&#xff1a; YB75XXH系列是采用CMOS工艺制造&#xff0c;低功耗的高压稳压器&#xff0c;最高输入电压可达25V,输出电压范围为1.5V一12.0V。它具有高精度的输出电压、极低的供电电流、极低的跌落电压等特点。 ■产品特点&#xff1a; …

SpringBoot 3 集成Hive 3

前提条件: 运行环境&#xff1a;Hadoop 3.* Hive 3.* MySQL 8 &#xff0c;如果还未安装相关环境&#xff0c;请参考&#xff1a;Hive 一文读懂 Centos7 安装Hadoop3 单机版本&#xff08;伪分布式版本&#xff09; SpringBoot 2 集成Hive 3 pom.xml <?xml ver…

MyBatis 通过 SqlSession 实现动态Entity批量插入

需要几个关键点: 1、entity对应的service需要继承BaseService 2、entity对应的serviceImpl需要实现baseMapper方法&#xff0c;需要把当前的mapper返回去 3、entity对应的Mapper需要BaseMapper