/**------------------历史版本信息------------------------------------------------------- ** 修 改 人: ** 版 本: V1.0 ** 日 期: ** 描 述: 初始版本 **-------------------------------------------------------------------------------------*/ #include "CanIf.h" //#include "CanNM.h" /***************************************************************************************/ static CanIf_ControllerModeType TeCanIf_e_ControllerMode; static CanTrcv_WorkModeType TeCanTrcv_e_WorkMode; static ComUint8 SeCanIf_u_IsInit; static ComUint8 SeCanIf_u_WakeEvent; static ComUint32 SeCanIf_u_TxQueueCounter; static CanIf_TxQueueType TsCanIf_h_TxQueue[CANIF_CFG_MAX_TX_HANDLE]; extern unsigned char TransmitCAN_Message(unsigned int ID,unsigned char Dlc,unsigned char *Data); /**************************************************************************************** @函数名称 : void ClearCanIf_Queue(void) @参数 : void @返回值 : void @描述 : @最后编辑时间 : 2015/04/08 @版本 : V1.0 @备注 : *****************************************************************************************/ void ClearCanIf_Queue(void) { ComUint8 LeCanIf_u_Index; SeCanIf_u_TxQueueCounter = 0; for(LeCanIf_u_Index = 0; LeCanIf_u_Index < CANIF_CFG_MAX_TX_HANDLE; LeCanIf_u_Index++) { TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_CanId = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_CanDlc = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eQueued = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[0] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[1] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[2] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[3] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[4] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[5] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[6] = 0x00; TsCanIf_h_TxQueue[LeCanIf_u_Index].eCanIf_Txdata[7] = 0x00; } } /**************************************************************************************** @函数名称 : void DeInitCanIf_Parameter(void) @参数 : void @返回值 : void @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : *****************************************************************************************/ void DeInitCanIf_Parameter(void) { SeCanIf_u_IsInit = COM_FALSE; } /**************************************************************************************** @函数名称 : void ReInitCanIf_Parameter(void) @参数 : void @返回值 : void @描述 : @最后编辑时间 : 2015/05/7 @版本 : V1.0 @备注 : *****************************************************************************************/ void ReInitCanIf_Parameter(void) { SeCanIf_u_IsInit = COM_TRUE; } /**************************************************************************************** @函数名称 : void InitCanIf_Parameter(void) @参数 : void @返回值 : void @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : called by main *****************************************************************************************/ void InitCanIf_Parameter(void) { TeCanIf_e_ControllerMode = CANIF_CS_STOP; TeCanTrcv_e_WorkMode = CANTRCV_STANDBY; ClearCanIf_Queue(); SeCanIf_u_IsInit = COM_TRUE; } /**************************************************************************************** @函数名称 : ComStd_ReturnType SetCanIf_BusoffEvent(void) @参数 : void @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : called by can module to indicator busoff event has happened *****************************************************************************************/ #if 0 ComStd_ReturnType SetCanIf_BusoffEvent(CanIf_ControllerErrorType LeCanIf_u_BusoffEvent) { (void)LeCanIf_u_BusoffEvent; SetCanSM_BusoffEvent(LeCanIf_u_BusoffEvent); return COM_E_OK; } #endif /**************************************************************************************** @函数名称 : ComStd_ReturnType ResetCanIf_Controller(ComUint8 LeCanIf_u_Channel) @参数 : LeCanIf_u_Channel @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/04/13 @版本 : V1.0 @备注 : called by can module to indicator busoff event has happened *****************************************************************************************/ ComStd_ReturnType ResetCanIf_Controller(ComUint8 LeCanIf_u_Channel) { (void)LeCanIf_u_Channel; #if 0 ResetCan_Controller(); #endif return COM_E_OK; } /**************************************************************************************** @函数名称 : ComStd_ReturnType SetCanIf_WakeUpEvent(CanIf_WakeUpSourceType LeCanIf_u_WakeUpSource) @参数 : CanIf_WakeUpSourceType LeCanIf_e_WakeUpSource @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : called by can/cantrcv/ICU module to indicator wakeup event has happened *****************************************************************************************/ ComStd_ReturnType SetCanIf_WakeUpEvent(CanIf_WakeUpSourceType LeCanIf_e_WakeUpSource) { SeCanIf_u_WakeEvent |= LeCanIf_e_WakeUpSource; //SetCanNM_NmMode(NMStatus_WAITCHECK,NoActiveLoad); return COM_E_OK; } ComStd_ReturnType ClrCanIf_WakeUpEvent(CanIf_WakeUpSourceType LeCanIf_e_WakeUpSource) { SeCanIf_u_WakeEvent &= ~LeCanIf_e_WakeUpSource; return COM_E_OK; } ComStd_ReturnType GetCanIf_WakeUpEvent(CanIf_WakeUpSourceType *LeCanIf_e_WakeUpSource) { *LeCanIf_e_WakeUpSource = SeCanIf_u_WakeEvent; return COM_E_OK; } /**************************************************************************************** @函数名称 : ComStd_ReturnType SetCanIf_ControllerMode(CanIf_ControllerModeType LeCanIf_e_RequestedMode) @参数 : CanIf_ControllerModeType LeCanIf_e_RequestedMode @返回值 : ComStd_ReturnType @描述 : Call by CanSM @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : CanIf Layer Set Controller RequestMode *****************************************************************************************/ ComStd_ReturnType SetCanIf_ControllerMode(CanIf_ControllerModeType LeCanIf_e_RequestedMode) { #if 0 SetCan_ControllerMode(LeCanIf_e_RequestedMode); TeCanIf_e_ControllerMode = LeCanIf_e_RequestedMode; #endif return COM_E_OK; } /**************************************************************************************** @函数名称 : ComStd_ReturnType GetCanIf_ControllerMode(CanIf_ControllerModeType *LeCanIf_e_ControllerModePtr) @参数 : CanIf_ControllerModeType *LeCanIf_e_ControllerModePtr @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : Upper Layer Get Controller Mode *****************************************************************************************/ ComStd_ReturnType GetCanIf_ControllerMode(CanIf_ControllerModeType *LeCanIf_e_ControllerModePtr) { *LeCanIf_e_ControllerModePtr = TeCanIf_e_ControllerMode; return COM_E_OK; } /**************************************************************************************** @函数名称 : ComStd_ReturnType GetCanIf_TransceiverMode(CanTrcv_WorkModeType *LeCanIf_e_WorkModePtr) @参数 : CanTrcv_WorkModeType *LeCanIf_e_WorkModePtr @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : Upper Layer Get Transceive Mode *****************************************************************************************/ ComStd_ReturnType GetCanIf_TransceiverMode(CanTrcv_WorkModeType *LeCanIf_e_WorkModePtr) { *LeCanIf_e_WorkModePtr = TeCanTrcv_e_WorkMode; return COM_E_OK; } /**************************************************************************************** @函数名称 : ComStd_ReturnType SetCanIf_TransceiverMode(CanTrcv_WorkModeType LeCanIf_e_WorkMode) @参数 : CanTrcv_WorkModeType LeCanIf_e_WorkMode @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : *****************************************************************************************/ ComStd_ReturnType SetCanIf_TransceiverMode(CanTrcv_WorkModeType LeCanIf_e_WorkMode) { SetCanTrcv_WorkMode(LeCanIf_e_WorkMode); TeCanTrcv_e_WorkMode = LeCanIf_e_WorkMode; return COM_E_OK; } /**************************************************************************************** @函数名称 : void RxIndicationCanIf_Messages(CanIf_HwHandleType LeCanIf_e_Hrh, CanIf_CanIdType LeCanIf_e_CanId, CanIf_CanDlcType LeCanIf_e_CanDlc, const CanIf_CanDataType* LeCanIf_e_CanSduPtr) @参数 : CanIf_HwHandleType LeCanIf_e_Hrh, CanIf_CanIdType LeCanIf_e_CanId, CanIf_CanDlcType LeCanIf_e_CanDlc, const CanIf_CanDataType* LeCanIf_e_CanSduPtr @返回值 : void @描述 : @最后编辑时间 : 2015/03/16 @版本 : V1.0 @备注 : *****************************************************************************************/ void RxIndicationCanIf_Messages(CanIf_HwHandleType LeCanIf_e_Hrh, CanIf_CanIdType LeCanIf_e_CanId, CanIf_CanDlcType LeCanIf_e_CanDlc, CanIf_CanDataType* LeCanIf_e_CanSduPtr) { CanIf_PduIdType LeCanIf_e_RxPduId = 0; uint16_t temp; (void)LeCanIf_e_Hrh; /* No Rx-Pdus or Ranges configured. Nothing to search. */ if (0 != CANIF_CFG_GENERIC(eMaxRxPDUHandle)) { /* Checked for invalid RxPduId earlier */ for(LeCanIf_e_RxPduId = 0;LeCanIf_e_RxPduId < CANIF_CFG_GENERIC(eMaxRxPDUHandle);LeCanIf_e_RxPduId++) { temp = CANIF_CFG_GENERIC(eMaxRxPDUHandle); temp = CANIF_CFG_CANRX_TABLE(LeCanIf_e_RxPduId,eRxCanId); if( CANIF_CFG_CANRX_TABLE(LeCanIf_e_RxPduId,eRxCanId) == LeCanIf_e_CanId ) { /* ID matches - Pdu identified */ /* DLC check - if configured DLC == 0 the following condition is always false and DLC check is deactivated */ CanIf_RxIndicationType rxIndicationFct; if (LeCanIf_e_CanDlc != CANIF_CFG_CANRX_TABLE(LeCanIf_e_RxPduId, eRxCanDlc) ) { /*DLC Error*/ rxIndicationFct = CANIF_CFG_CANRX_TABLE(LeCanIf_e_RxPduId,eCanIf_RxErrorFct); if(COM_NULL_PTR != rxIndicationFct) { rxIndicationFct(LeCanIf_e_Hrh,LeCanIf_e_CanId,LeCanIf_e_CanDlc,LeCanIf_e_CanSduPtr); } else { /*Avoid Warning*/ } } else { rxIndicationFct = CANIF_CFG_CANRX_TABLE(LeCanIf_e_RxPduId,eCanIf_RxIndicationFct); if(COM_NULL_PTR != rxIndicationFct) { rxIndicationFct(LeCanIf_e_Hrh,LeCanIf_e_CanId,LeCanIf_e_CanDlc,LeCanIf_e_CanSduPtr); } else { /*Avoid Warning*/ } } break; } else { /*Avoid Warning*/ } } } else { /*Avoid Warning*/ } } /**************************************************************************************** @函数名称 : ComStd_ReturnType TransmitCanIf_Buffer(CanIf_CanIdType LeCanIf_t_TxCanID,CanIf_CanDlcType LeCanIf_t_TxCanDlc,CanIf_CanDataType *LeCanIf_t_TxCanDataPtr) @参数 : CanIf_CanIdType LeCanIf_t_TxCanID,CanIf_CanDlcType LeCanIf_t_TxCanDlc,CanIf_CanDataType *LeCanIf_t_TxCanDataPtr @返回值 : ComStd_ReturnType @描述 : @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : *****************************************************************************************/ ComStd_ReturnType TransmitCanIf_Buffer(CanIf_CanIdType LeCanIf_t_TxCanID,CanIf_CanDlcType LeCanIf_t_TxCanDlc,CanIf_CanDataType *LeCanIf_t_TxCanDataPtr) { Can_ReturnType txResult = CAN_OK; /*or CAN_OK*/ #if 0 AC_DiagResp.RcvId = LeCanIf_t_TxCanID; AC_DiagResp.RcvDLC = LeCanIf_t_TxCanDlc; AC_DiagResp.Data[0] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[1] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[2] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[3] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[4] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[5] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[6] = *LeCanIf_t_TxCanDataPtr++; AC_DiagResp.Data[7] = *LeCanIf_t_TxCanDataPtr; #endif CanIf_EnterCritical(); #if 0 txResult = CanSnd(CanBufDsc[9]);//TransmitCAN_Message(LeCanIf_t_TxCanID,LeCanIf_t_TxCanDlc,LeCanIf_t_TxCanDataPtr); #endif txResult = TransmitCAN_Message(LeCanIf_t_TxCanID,LeCanIf_t_TxCanDlc,LeCanIf_t_TxCanDataPtr); CanIf_LeaveCritical(); /*发送失败*/ if(CAN_NOT_OK == txResult) { CanIf_uint8Type LeCanIf_e_TxPduId; for(LeCanIf_e_TxPduId = 0;LeCanIf_e_TxPduId < CANIF_CFG_GENERIC(eMaxTxPDUHandle);LeCanIf_e_TxPduId++) { if( CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eTxCanId) == LeCanIf_t_TxCanID ) { CanIf_uint8Type LeCanIf_e_TxDataCycle; TsCanIf_h_TxQueue[CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eQueuedIndex)].eCanIf_CanId = LeCanIf_t_TxCanID; TsCanIf_h_TxQueue[CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eQueuedIndex)].eCanIf_CanDlc = LeCanIf_t_TxCanDlc; for(LeCanIf_e_TxDataCycle = 0;LeCanIf_e_TxDataCycle < LeCanIf_t_TxCanDlc;LeCanIf_e_TxDataCycle++) { TsCanIf_h_TxQueue[CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eQueuedIndex)].eCanIf_Txdata[LeCanIf_e_TxDataCycle] = LeCanIf_t_TxCanDataPtr[LeCanIf_e_TxDataCycle]; } TsCanIf_h_TxQueue[CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eQueuedIndex)].eQueued = 1; SeCanIf_u_TxQueueCounter |= ( 1 << (CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eQueuedIndex)) ); break; } else { } } } else { /*Tx OK == do nothing */ } return (ComStd_ReturnType)txResult; } /**************************************************************************************** @函数名称 : void TreatCanIf_TxQueue(void) @参数 : void @返回值 : void @描述 : @最后编辑时间 : 2015/04/08 @版本 : V1.0 @备注 : *****************************************************************************************/ #if 0 void TreatCanIf_TxQueue(void) { if(0 != SeCanIf_u_TxQueueCounter) { Can_ReturnType txResult = CAN_NOT_OK; CanIf_uint8Type LeCanIf_e_Index = 0; for(LeCanIf_e_Index = 0;LeCanIf_e_Index < CANIF_CFG_MAX_TX_HANDLE;LeCanIf_e_Index++) { if(0 != TsCanIf_h_TxQueue[LeCanIf_e_Index].eQueued) { txResult = TransmitCAN_Message(TsCanIf_h_TxQueue[LeCanIf_e_Index].eCanIf_CanId,TsCanIf_h_TxQueue[LeCanIf_e_Index].eCanIf_CanDlc,TsCanIf_h_TxQueue[LeCanIf_e_Index].eCanIf_Txdata); if(CAN_OK == txResult) { TsCanIf_h_TxQueue[LeCanIf_e_Index].eQueued = 0; SeCanIf_u_TxQueueCounter &= ~( 1 << LeCanIf_e_Index ); } else { } break; } else { } } } else { } } #endif /**************************************************************************************** @函数名称 : void ConfirmCanIf_TxOK(CanIf_CanIdType LeCanIf_t_TxCanID) @参数 : LeCanIf_t_TxCanID @返回值 : void @描述 : @最后编辑时间 : 2015/04/08 @版本 : V1.0 @备注 : *****************************************************************************************/ #if 0 void ConfirmCanIf_TxOK(ComUint8 LeCanIf_e_Hrh,CanIf_CanIdType LeCanIf_t_TxCanID) { CanIf_PduIdType LeCanIf_e_TxPduId = 0; if(0 != CANIF_CFG_MAX_TX_HANDLE) { /* Checked for invalid RxPduId earlier */ for(LeCanIf_e_TxPduId = 0;LeCanIf_e_TxPduId < CANIF_CFG_GENERIC(eMaxTxPDUHandle);LeCanIf_e_TxPduId++) { if( CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eTxCanId) == LeCanIf_t_TxCanID ) { CanIf_TxConfirmationType TxConfirmationFct; TxConfirmationFct = CANIF_CFG_CANTX_TABLE(LeCanIf_e_TxPduId,eCanIf_TxConfirmationFct); if(COM_NULL_PTR != TxConfirmationFct) { TxConfirmationFct(LeCanIf_e_Hrh,LeCanIf_t_TxCanID); } else { /*Avoid Warning*/ } break; } else { /*Avoid Warning*/ } } } else { } CanIf_EnterCritical(); TreatCanIf_TxQueue(); CanIf_LeaveCritical(); } #endif /**************************************************************************************** @函数名称 : void CanIf_MainFunction(void) @参数 : void @返回值 : void @描述 : 10ms周期调用 @最后编辑时间 : 2015/03/14 @版本 : V1.0 @备注 : CanIf层TASK *****************************************************************************************/ void CanIf_MainFunction(void) { if( COM_FALSE != SeCanIf_u_IsInit ) { if( (CANIF_CS_STOP == TeCanIf_e_ControllerMode) && (CANTRCV_STANDBY == TeCanTrcv_e_WorkMode) ) { /*有总线唤醒事件,在此增加代码*/ } else { } } else { /*Avoid Warning*/ } }