作为主动唤醒的节点,ECU上电如何请求通讯
一个ECU如果作为主动唤醒的节点,ECU上电时可以通过以下方式请求通信
如上图所示,ECU在上电后,在OS起来后,可以通过在BSWM模块中完成NvM_ReadAll和相关BSW 模块初始化以及Rte_Start后,这个时候周期性Task已经可以正常调度了。
此时可以通过在BSWM模块中依次配置请求ALLOWCom和请求COMM_FULL_COMMUNICATION
的模式请求,
其中当BSWM请求ALLOWCom后,BswM会通过
BswM_Prv_Action_ComMAllowCom
调用 ComM_CommunicationAllowed
来准许该通道可以进行通讯
void BswM_Prv_Action_ComMAllowCom( Std_ReturnType * action_RetVal_pu8, const void * dataActionParameter_pv)
{const BswM_Cfg_AC_ComMAllowComType_tst * dataActionPara_pst = (const BswM_Cfg_AC_ComMAllowComType_tst*)dataActionParameter_pv;*action_RetVal_pu8 = BSWM_NO_RET_VALUE;/* ComM Channel communication is allowed or blocked by invoking following function */ComM_CommunicationAllowed(dataActionPara_pst->idNetworkReference_u8, dataActionPara_pst->isComAllowed_b);return;
}
在BSWM中请求
COMM_FULL_COMMUNICATION
后,BSWM模块会通过BswM_Prv_Action_ComMModeSwitch
调用ComM_RequestComMode
void BswM_Prv_Action_ComMModeSwitch( Std_ReturnType * action_RetVal_pu8, const void * dataActionParameter_pv)
{const BswM_Cfg_AC_ComMModeSwitchType_tst * dataActionPara_pst = (const BswM_Cfg_AC_ComMModeSwitchType_tst*)dataActionParameter_pv;*action_RetVal_pu8 = BSWM_NO_RET_VALUE;if (BSWM_COMM_FULL_COMMUNICATION == dataActionPara_pst->dataComMRequestedMode_en){*action_RetVal_pu8 = ComM_RequestComMode(dataActionPara_pst->idComMUserReference_u8, COMM_FULL_COMMUNICATION);}else{ *action_RetVal_pu8 = ComM_RequestComMode(dataActionPara_pst->idComMUserReference_u8, COMM_NO_COMMUNICATION);}return;
}
将变量channelRamPtr_pst->ComMFullComWakeupRequestStatus_b = TRUE;
接着ComM会在对应Channel中的Mainfunction中通过ComM_Prv_RequestBusSm
调用CanSM_RequestComMode
将变量置成COMM_FULL_COMMUNICATION
CanSM_ReqComM_Mode_en[network] = COMM_FULL_COMMUNICATION ;
接着会在CanSM的Mainfunction中
CanSM_MainFunctionCanSM_NetworkModeTrans((NetworkHandleType)CanSM_NetworkIdx_u8,CanSM_ReqComMode_uo);CanSM_NO2FULL_COM(network);/*Start the CAN controllers*/CanSM_StartCtrl(network);CanIf_SetControllerMode(CanSM_ControllerId_u8,CAN_CS_STARTED));lRetVal_en = lCtrlDrvConfig_pst->SetCrtlMode(lCtrlConfig_pst->CtrlCanCtrlRef, ControllerMode);Can_Integn_SetControllerMode (uint8 Controller_u8, Can_ControllerStateType Transition_en){return Can_SetControllerMode(Controller_u8, Transition_en);}
将Can控制器的状态设置为CAN_CS_STARTED
就可以正常通讯了。