/****************************************************************************** * Description: : Include File Section ******************************************************************************/ #include "boot_macrodriver.h" #include "Dcm_App.h" #include "Dcm_extern.h" #include "crc.h" #include "Dcm_Cfg.h" #include "fsl_user.h" #include "pfdl_user.h" extern uint8 GetCanTxCmpltd(void); /****************************************************************************** * Description: : Global Variable Definition Section ******************************************************************************/ TsDcm_h_RquestInfo VeDcm_h_RqustInfo; /*提取请求信息的结构体*/ uint8 VaDcm_u_NegRspTxBuffer[3]; /*负响应发送数据的缓存数组*/ uint8* VeDcm_P_DataAddress ; /*TP层数据地址*/ extern uint16 ADval_Power; /****************************************************************************** * Description: : Static Variable Definition Section ******************************************************************************/ static uint16 SeDcm_u_DL; /*TP层数据长度*/ static uint8 SeDcm_u_RequstSty; /*TP层数据请求方式*/ uint16 SeDcm_w_S3ServerTime; /*S3ServerTime计数*/ static uint8 SeDcm_u_S3ServerTimeSts; /*S3计数状态 继续 或 停止*/ static uint8 SeDcm_u_DiagnosticSession ; /*诊断会话模式*/ static uint8 SeDcm_u_SecurityAccessState; /*安全权限状态*/ static uint8 SeDcm_u_DtcSetSts; /*DTC设置状态*/ static uint8 SeDcm_u_NetworkMsgSts; /*网络管理报文收发权限状态*/ //static uint8 SeDcm_u_NormalMsgSts; /*应用报文收发权限状态*/ static uint16 SeDcm_u_KeyErrorCount; /*27 服务密钥错误次数计数*/ static uint16 SeDcm_u_KeyErrorDelayCount; /*27 服务密钥错误延时计数*/ static uint8 SaDcm_u_RequestCounter; /*27 服务种子请求计数 */ static uint16 SaDcm_u_RequestDelayCount; static uint8 SeDcm_u_SecurityAccessServerSts; /*27 服务状态*/ static uint16 CeDcm_u_P2serverTime = 0x0032; /* P2server 时间 标定量*/ static uint16 CeDcm_u_P2ExtserverTime = 0x00C8; /* P2*server 时间 标定量*/ static uint32 SeDcm_w_SecurityAccessSeed = 0x12345678; /*27 服务 种子*/ static uint32 SeDcm_u_SecurityAccessKey; /*27 服务密钥*/ static uint32 CeDcm_w_SecurityAccessFBLMask = 0xAC856D89; /*27 服务掩码*/ static TeDcm_e_DownLoadStsType SeDcm_u_DownLoadDataSts; /*34 36 37 数据下载相关服务处理状态*/ static uint32 SeDcm_w_DownLoadDataLength; /*34 请求下载的数据长度*/ static uint32 SeDcm_w_TransmitDataCount; /*36 已传输的数据量计数*/ static uint8 SeDcm_u_BlockSequenceCountSts; /*36 传输块编号*/ static uint16 CaDcm_w_SingleAllowDateLength = 0x0202; static uint8 SeDcm_u_DownLoadState; static TeDcm_e_RidStsType SeDcm_u_RidFF02Sts; /*例程 FF02 状态*/ static TeDcm_e_RidStsType SeDcm_u_RidFF00Sts; /*例程 FF00 状态*/ static TeDcm_e_RidStsType SeDcm_u_RidFF01Sts; /*例程 FF01 状态*/ static TeDcm_e_RidStsType SeDcm_u_RidF001Sts; /*例程 F001 状态*/ static RidRunSts_T RidFF02RunSts; /* 例程 FF02 执行情况 */ static DcmReset_T DcmResetReady; static uint32 LastProgramingAddr; static uint32 SeFCL_Programing_dw_FlashAddr,LastSeFCL_Programing_dw_FlashAddr; static uint32 SeFCL_Programing_dw_DataLen; /****************************************************************************** * Description: : Static Function Prototype Declaration *****************************************************************************/ static void MngDcm_CleanRequstInfo(void); unsigned char DF_Write(unsigned char* write_buf,unsigned char data_num,unsigned char len); RidRunSts_T GetRidFF02RunSts(void); /****************************************************************************** * Description: : Write User Function Code *****************************************************************************/ void resetS3Server(void) { SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*重置S3server计时*/ } /****************************************************************************** *函数名称 : void MngDcm_CleanRequstInfo(void) *参数 : void *返回值 : void *描述 : 清除请求信息 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void MngDcm_CleanRequstInfo(void) { uint8 i; VeDcm_h_RqustInfo.DL= 0x00; /*有效字节长度*/ VeDcm_h_RqustInfo.Sid = 0x00; /*SID*/ VeDcm_h_RqustInfo.RequstSty = 0x00; /*请求方式*/ VeDcm_h_RqustInfo.Sub = 0x00; /*子服务*/ for(i = 0;i < 3;i++) { VeDcm_h_RqustInfo.DtcGroup[i] = 0x00; /*DTC组*/ } VeDcm_h_RqustInfo.StateMask = 0x00; /*请求的 状态掩码*/ for(i = 0;i < 4;i++) { VeDcm_h_RqustInfo.Key[i] = 0x00; /*密钥信息*/ } VeDcm_h_RqustInfo.CommType = 0x00; /*通讯类型*/ for(i = 0;i < DCM_READDID_MAXNUMBER*2 ;i++) { VeDcm_h_RqustInfo.Did[i] = 0x00; /*具体DID*/ } VeDcm_h_RqustInfo.DidCount = _NULL; /*DID个数*/ VeDcm_h_RqustInfo.Rid = 0x00; /*写操作目标DID*/ for(i = 0;i < DCM_WRITEDATA_MAXLENGTH;i++) { VeDcm_h_RqustInfo.WriteData[i] = 0x00; /*写入的数据*/ } } /****************************************************************************** *函数名称 : uint8 MngDcm_CollectRequstInfo(void) *参数 : void *返回值 : LeDcm_TempResult 数据获取结果 获取成功或失败 *描述 : 从TP层获取基本信息 请求方式、DL 、sid *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ uint8 MngDcm_CollectRequstInfo(void) { uint8 LeDcm_TempResult = DCM_CHECK_NOK; TeCanTp_e_RxBufferSts CanTp_e_RxBufferSts; MngDcm_CleanRequstInfo(); /* 清请求数据*/ CanTp_e_RxBufferSts = GetCanTp_e_RxBufferSts(&SeDcm_u_RequstSty,&SeDcm_u_DL,&VeDcm_P_DataAddress); if((CeCanTp_e_Full == CanTp_e_RxBufferSts) ||(CeCanTp_e_SF_Full == CanTp_e_RxBufferSts)) { LeDcm_TempResult = DCM_CHECK_OK; if(CeCanTp_e_Physical ==SeDcm_u_RequstSty) { VeDcm_h_RqustInfo.RequstSty = DCM_PHYSICAL_ADDRESS; } else { VeDcm_h_RqustInfo.RequstSty = DCM_FUNCTIONAL_ADDRESS; } VeDcm_h_RqustInfo.DL = SeDcm_u_DL; VeDcm_h_RqustInfo.Sid = VeDcm_P_DataAddress[0]; } else {} return LeDcm_TempResult; } /****************************************************************************** *函数名称 : uint8 MngDcm_DtcAvailableCheck(uint8* LeDcm_u_Dtc,const TsDcm_h_DtcGroupType LeDcm_u_DtcTable[]) *参数 : LeDcm_u_Dtc 需要查找的DTC LeDcm_u_DtcTable[] 支持的DTC列表 *返回值 : LeDcm_u_TempResult 数据获取结果 获取成功或失败 *描述 : 检查DTC是否支持 *编辑时间 : 2015-10-23 *备注 : *****************************************************************************/ uint8 MngDcm_DtcAvailableCheck(uint8* LeDcm_u_Dtc,const TsDcm_h_DtcGroupType LeDcm_u_DtcTable[]) { uint8 i; uint8 LeDcm_u_TempResult = DCM_NORESULT; for(i=0 ; i < DCM_SUPDTC_COUNT; i++) { if((LeDcm_u_Dtc[0] == LeDcm_u_DtcTable[i].DtcHigh)&&(LeDcm_u_Dtc[1] == LeDcm_u_DtcTable[i].DtcMiddle)&&(LeDcm_u_Dtc[2] == LeDcm_u_DtcTable[i].DtcLow)) { LeDcm_u_TempResult = i; break; } } return LeDcm_u_TempResult; } /****************************************************************************** *函数名称 : uint8 MngDcm_ExtDataRecordAvailableCheck(uint8 LeDcm_u_ExtDataRecord,const DTCExtDataRecordType LeDcm_u_ExtDataRecordTable[]) *参数 : LeDcm_u_ExtDataRecord 请求的ExtDataRecord ExtDataRecordTable[] 支持的ExtDataRecord信息列表 *返回值 : LeDcm_u_TempResult 数据获取结果 获取成功或失败 *描述 : 检查参数 ExtDataRecord 是否支持 *编辑时间 : 2015-10-23 *备注 : *****************************************************************************/ uint8 MngDcm_ExtDataRecordAvailableCheck(uint8 LeDcm_u_ExtDataRecord,const DTCExtDataRecordType LeDcm_u_ExtDataRecordTable[]) { uint8 i; uint8 LeDcm_u_TempResult = DCM_NORESULT; for(i=0 ; i < DCM_19SUPDTCEXTDATARECORD_COUNT; i++) { if(LeDcm_u_ExtDataRecord == LeDcm_u_ExtDataRecordTable[i].DTCExtDataRecordNumber) { LeDcm_u_TempResult = i; break; } } return LeDcm_u_TempResult; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_DefaultSessionDeal(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 进入 默认会话模式 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_DefaultSessionDeal(void) { uint8 LaDcm_u_TempBuffer[6]; TeDcm_h_ResultType LeDcm_u_Result; uint32 DcmResetDelay; SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_STOP; /*S3server 计时停止*/ if( DCM_PROGRAMME_SESSION == SeDcm_u_DiagnosticSession) DcmResetReady = DCM_RESET_READY; SeDcm_u_DiagnosticSession = DCM_DEFAULT_SESSION; /*会话模式 默认模式*/ SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式锁定*/ SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; /*DTC设置使能*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发使能*/ if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { if( DCM_RESET_READY == DcmResetReady && (GetAppValid() == APP_VALID)&&(GetAppEndValid() == APP_VALID)) { KamData.AckReq = ACK_REQ; KamData.AckLenth = 7; KamData.RspData[0] = 0x06; KamData.RspData[1] = VeDcm_h_RqustInfo.Sid + 0x40; KamData.RspData[2] = VeDcm_h_RqustInfo.Sub; KamData.RspData[3] = (uint8)(CeDcm_u_P2serverTime>>8); KamData.RspData[4] = (uint8)(CeDcm_u_P2serverTime&0xFF); KamData.RspData[5] = (uint8)(CeDcm_u_P2ExtserverTime>>8); KamData.RspData[6] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF); KamData.RspData[7] = 0xAA; KamData.boot_enable = 0; SetMcu_SoftReset(); } else { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[2] = (uint8)(CeDcm_u_P2serverTime>>8); LaDcm_u_TempBuffer[3] = (uint8)(CeDcm_u_P2serverTime&0xFF); LaDcm_u_TempBuffer[4] = (uint8)(CeDcm_u_P2ExtserverTime>>8); LaDcm_u_TempBuffer[5] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF); SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ } LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; /*设置为不响应*/ } //if( DCM_RESET_READY == DcmResetReady) //{ // //while(++DcmResetDelay < 80000); // SetMcu_SoftReset(); //} return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_ProgramSessionDeal(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 进入 编程会话模式 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_ProgramSessionDeal(void) { uint8 LaDcm_u_TempBuffer[6]; uint32 ResetDelayCnt = 0; TeDcm_h_ResultType LeDcm_u_Result; uint32_t ReprogmaValid; SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_CONTINUE; /*S3server 计时继续*/ SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*S3server 计时计数值重新装载*/ if( DCM_DEFAULT_SESSION != SeDcm_u_DiagnosticSession ) { // 78 //MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); //SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); SeDcm_u_DiagnosticSession = DCM_PROGRAMME_SESSION; /*会话模式编程模式*/ SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式 锁定*/ SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; /*DTC设置使能*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE; /*应用报文收发使能*/ //ReprogmaValid = 0xAA5555AA; //if( 0 == DF_Write((uint8*)(&ReprogmaValid),GetIndexNumber(INDEX_REPROGMA),sizeof(ReprogmaValid))) //R_FDL_OK => 0 if(1) { KamData.boot_enable = RPRGRM_REQ_VALID; if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { KamData.AckReq = ACK_REQ; KamData.AckLenth = 7; KamData.RspData[0] = 0x06; KamData.RspData[1] = VeDcm_h_RqustInfo.Sid + 0x40; KamData.RspData[2] = VeDcm_h_RqustInfo.Sub; KamData.RspData[3] = (uint8)(CeDcm_u_P2serverTime>>8); KamData.RspData[4] = (uint8)(CeDcm_u_P2serverTime&0xFF); KamData.RspData[5] = (uint8)(CeDcm_u_P2ExtserverTime>>8); KamData.RspData[6] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF); KamData.RspData[7] = 0xAA; SetMcu_SoftReset(); #if 0 LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[2] = (uint8)(CeDcm_u_P2serverTime>>8); LaDcm_u_TempBuffer[3] = (uint8)(CeDcm_u_P2serverTime&0xFF); LaDcm_u_TempBuffer[4] = (uint8)(CeDcm_u_P2ExtserverTime>>8); LaDcm_u_TempBuffer[5] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF); while(++ResetDelayCnt < 100000); SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ #endif LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { KamData.AckReq = 0; SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; /*设置为不响应*/ SetMcu_SoftReset(); } //ResetDelayCnt = 0; //while(++ResetDelayCnt < 10000); //SetMcu_SoftReset(); } else { /*设置NRC 22*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } } else { /*设置NRC 22*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /*------------ boot add 394 -----------------*/ /****************************************************************************** *函数名称 : void BootProgramSessionDeal(void) *参数 : void *返回值 : void *描述 : *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void BootProgramSessionDeal(void) { SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_CONTINUE; /*S3server 计时继续*/ SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*S3server 计时计数值重新装载*/ SeDcm_u_DiagnosticSession = DCM_PROGRAMME_SESSION; /*会话模式编程模式*/ SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式 锁定*/ SeDcm_u_DtcSetSts = DCM_DTCSET_DISENABLE; /*DTC设置使能*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE; /*应用报文收发使能*/ } /****************************************************************************** *函数名称 : void BootDefaultSessionDeal(void) *参数 : void *返回值 : void *描述 : *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void BootDefaultSessionDeal(void) { SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_STOP; /*S3server 计时停止*/ SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*S3server 计时计数值重新装载*/ SeDcm_u_DiagnosticSession = DCM_DEFAULT_SESSION; /*会话模式默认模式*/ SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式 锁定*/ SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; /*DTC设置使能*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发使能*/ } /*------------ boot add 394 -----------------*/ /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_ExtendedSessionDeal(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 进入 扩展会话模式 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_ExtendedSessionDeal(void) { uint8 LaDcm_u_TempBuffer[6]; TeDcm_h_ResultType LeDcm_u_Result; if(SeDcm_u_DiagnosticSession != DCM_PROGRAMME_SESSION) { SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_CONTINUE; /*S3server 计时继续*/ SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*S3server 计时计数值重新装载*/ if(SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION) { SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; /*DTC设置使能*/ SeDcm_u_DiagnosticSession = DCM_EXTEND_SESSION; /*会话模式 扩展模式*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发使能*/ } SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式 锁定*/ if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[2] = (uint8)(CeDcm_u_P2serverTime>>8); LaDcm_u_TempBuffer[3] = (uint8)(CeDcm_u_P2serverTime&0xFF); LaDcm_u_TempBuffer[4] = (uint8)(CeDcm_u_P2ExtserverTime>>8); LaDcm_u_TempBuffer[5] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF); //SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L2_UNLOCK; /*置安全权限为 解锁状态 */ SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; /*设置为不响应*/ } } else { if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty) { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC7E]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_SoftResetDeal(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 11 03 请求软件复位 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_SoftResetDeal(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; static uint32 ResetDelayCnt; uint32 Temp_ReprogmaValid; //重启ECU接口 if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { KamData.AckReq = ACK_REQ; KamData.AckLenth = 3; KamData.RspData[0] = 0x02; KamData.RspData[1] = VeDcm_h_RqustInfo.Sid + 0x40; KamData.RspData[2] = VeDcm_h_RqustInfo.Sub; KamData.RspData[3] = 0xAA; KamData.RspData[4] = 0xAA; KamData.RspData[5] = 0xAA; KamData.RspData[6] = 0xAA; KamData.RspData[7] = 0xAA; // LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; //LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; //SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { KamData.AckReq = 0; SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; /*设置为不响应*/ } KamData.boot_enable = 0; if(LeDcm_u_Result == CeDcm_e_ResultPosRsp) { //while(GetCanTxCmpltd() != 1){} SetMcu_SoftReset(); } else SetMcu_SoftReset(); return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RequestSeekDeal( uint8 SecurityLevel) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 27 请求种子 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RequestSeekDeal( uint8 SecurityLevel) { uint8 LaDcm_u_TempBuffer[6]; TeDcm_h_ResultType LeDcm_u_Result; //SeDcm_u_KeyErrorDelayCount = 0; if(SaDcm_u_RequestCounter < 5) { SaDcm_u_RequestCounter++; KamData.SeedReqTimes = SaDcm_u_RequestCounter | 0xB0; if(SaDcm_u_RequestCounter == 5) { SaDcm_u_RequestDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT; SeDcm_u_KeyErrorCount = 3; KamData.KeyErrTimes = SeDcm_u_KeyErrorCount | 0xB0; } }//fcb if(0==SeDcm_u_KeyErrorDelayCount && 0==SaDcm_u_RequestDelayCount) { if(SaDcm_u_RequestCounter == 5) { SaDcm_u_RequestCounter=0; KamData.SeedReqTimes = 0; } if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; if(MngDcm_GetSecurityAccessSts() != DCM_SECURITYACCESS_DEFAULT) { LaDcm_u_TempBuffer[2] = 0; LaDcm_u_TempBuffer[3] = 0; LaDcm_u_TempBuffer[4] = 0; LaDcm_u_TempBuffer[5] = 0; } else { if(SaDcm_u_RequestCounter < 2) SeDcm_w_SecurityAccessSeed = GetSeed(); LaDcm_u_TempBuffer[2] = (uint8)(SeDcm_w_SecurityAccessSeed>>24)&0xFF; LaDcm_u_TempBuffer[3] = (uint8)(SeDcm_w_SecurityAccessSeed>>16)&0xFF; LaDcm_u_TempBuffer[4] = (uint8)(SeDcm_w_SecurityAccessSeed>>8)&0xFF; LaDcm_u_TempBuffer[5] = (uint8)SeDcm_w_SecurityAccessSeed&0xFF; } SeDcm_u_SecurityAccessServerSts |= DCM_SASERVERSTS_REQUESTKEY; /*置27 服务为 已请求种子*/ SeDcm_u_SecurityAccessKey = GENERIC_ALGORITHM(SeDcm_w_SecurityAccessSeed,SecurityLevel); SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; /*设置为不响应*/ } } else { /*设置NRC 37*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC37]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_KeyCkeckDeal(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 27 密钥校验 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_KeyCkeckDeal(uint8 dummy) { uint8 i; uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; uint32 LeDcm_w_Key; if(DCM_SASERVERSTS_REQUESTKEY & SeDcm_u_SecurityAccessServerSts) { SaDcm_u_RequestCounter = 0; KamData.SeedReqTimes = 0; for(i = 0;i < DCM_SASERVER_KEYLENGTH;i++) /*获取客户端发送过来的密钥*/ { VeDcm_h_RqustInfo.Key[i] = VeDcm_P_DataAddress[i+2]; } LeDcm_w_Key = ((uint32)VeDcm_h_RqustInfo.Key[0]<<24) + ((uint32)VeDcm_h_RqustInfo.Key[1]<<16) + ((uint32)VeDcm_h_RqustInfo.Key[2]<<8) + VeDcm_h_RqustInfo.Key[3]; if(LeDcm_w_Key != SeDcm_u_SecurityAccessKey) /*密钥校验*/ //if(LeDcm_w_Key != SeDcm_w_SecurityAccessSeed) /*密钥校验*/ { SeDcm_u_KeyErrorCount++; /*密钥不符合 密钥错误数加1*/ KamData.KeyErrTimes = SeDcm_u_KeyErrorCount | 0xB0; } else /*密钥验证通过*/ { SeDcm_u_KeyErrorCount = 0U; /*密钥错误次数清零*/ KamData.KeyErrTimes = 0; if(dummy == 0x02) //SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L1_UNLOCK; SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L2_UNLOCK; /*置安全权限为 解锁状态 改为L2用于此项目 */ else if(dummy == 0x12) SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L2_UNLOCK; /*置安全权限为 解锁状态 */ } if(0 == SeDcm_u_KeyErrorCount) /*密钥没有错误*/ { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT; /*置27 服务为 默认状态 */ SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else if(SeDcm_u_KeyErrorCount>0&&SeDcm_u_KeyErrorCount>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SeDcm_u_RidFF02Sts = CeDcm_e_RidStart; /*置例程当前状态*/ //必要的化 插 78 //处理函数 RidFF02RunSts = Rid_Finish; SeDcm_u_RidFF02Sts = CeDcm_e_RidStop; /*置例程当前状态*/ SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SeDcm_u_RidFF02Sts = CeDcm_e_RidStart; /*置例程当前状态*/ //必要的化 插 78 //处理函数 RidFF02RunSts = Rid_Finish; SeDcm_u_RidFF02Sts = CeDcm_e_RidStop; /*置例程当前状态*/ SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } RidRunSts_T GetRidFF02RunSts(void) { return RidFF02RunSts; } /*------------ boot add 766 -----------------*/ /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF00Start(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF00 开始 处理函数 *编辑时间 : 2015-11-03 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF00Start(void) { fsl_u08 ret; uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; uint32 Temp_AppValid; uint32 LeDcm_w_Address; /*地址*/ uint32 LeDcm_w_DataLength; /*数据长度*/ uint8 BootCnt[16]; /*提取地址参数*/ LeDcm_w_Address = (((uint32)VeDcm_P_DataAddress[4])<<24U) + (((uint32)VeDcm_P_DataAddress[5])<<16U) + (((uint32)VeDcm_P_DataAddress[6])<<8U) + VeDcm_P_DataAddress[7]; /*提取数据长度数*/ LeDcm_w_DataLength = (((uint32)VeDcm_P_DataAddress[8])<<24U) + (((uint32)VeDcm_P_DataAddress[9])<<16U) + (((uint32)VeDcm_P_DataAddress[10])<<8U) + VeDcm_P_DataAddress[11]; /* if(DCM_DS_FLASHCRC_COMPLETE != SeDcm_u_DownLoadState) { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]); SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); LeDcm_u_Result = CeDcm_e_ResultNegRsp; return LeDcm_u_Result; } */ if (LeDcm_w_DataLength > LeDcm_w_Address) { LeDcm_w_DataLength -= LeDcm_w_Address; } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; return LeDcm_u_Result; } if((LeDcm_w_Address < 0xA000 || LeDcm_w_Address > 0x19FFF) || LeDcm_w_DataLength > 0x10000) { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; return LeDcm_u_Result; } if(CeDcm_e_RidStop == SeDcm_u_RidFF00Sts) { // 78 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); Temp_AppValid = 0xFFFFFFFF; if( 0 == DF_Write(((unsigned char*)(&Temp_AppValid)),INDEX_APP_VALID,sizeof(Temp_AppValid))) //R_FDL_OK { // 78 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); if(LeDcm_w_Address >= 0xA000 && LeDcm_w_Address <= 0x19FFF) { ret = prFslStart(); if (FSL_OK == ret) { // 78 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); ret = prFslErase(APP_START_BLOCK,APP_TOTAL_BLOCK); SeDcm_u_DownLoadState = DCM_DS_ERASE_COMPLETE; NOP(); /**************************************************/ GetRTE_Dcm_DidServices_0x0200_ReadData(BootCnt); GetRTE_Dcm_DidServices_0x0201_ReadData(BootCnt + 8); if(BootCnt[8] == 0xFF) BootCnt[8] = 1; else BootCnt[8]++; if (FSL_OK == prFslStart()) { prFslErase(104,1); prFslWrite(DID_0200_ADDR,(fsl_u08*)BootCnt,16); } /**************************************************/ } if(FSL_OK == ret) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SeDcm_u_RidFF00Sts = CeDcm_e_RidStart; /*置例程当前状态*/ SeDcm_u_RidFF00Sts = CeDcm_e_RidStop; /*置例程当前状态*/ SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC72]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } } else { //MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据*/ //SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ //LeDcm_u_Result = CeDcm_e_ResultNegRsp; if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_FAILURE; SeDcm_u_RidFF00Sts = CeDcm_e_RidStart; /*置例程当前状态*/ SeDcm_u_RidFF00Sts = CeDcm_e_RidStop; /*置例程当前状态*/ SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC72]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF01Start(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF01 开始 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF01Start(void) { uint8 LaDcm_u_TempBuffer[5]; uint8 BootCnt[16]; TeDcm_h_ResultType LeDcm_u_Result; #if 1 if(CeDcm_e_RidStop == SeDcm_u_RidFF01Sts) { //处理函数 if(DCM_DS_APPCRC_COMPLETE != SeDcm_u_DownLoadState) { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_FAILURE; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; return LeDcm_u_Result; } if((GetAppValid() == APP_VALID)&&(GetAppEndValid() == APP_VALID)) { GetRTE_Dcm_DidServices_0x0200_ReadData(BootCnt); GetRTE_Dcm_DidServices_0x0201_ReadData(BootCnt + 8); if(BootCnt[0] == 0xFF) BootCnt[0] = 1; else BootCnt[0]++; BootCnt[8]=0; //下载成功后201清零 if (FSL_OK == prFslStart()) { prFslErase(104,1); prFslWrite(DID_0200_ADDR,(fsl_u08*)BootCnt,16); } if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SeDcm_u_RidFF01Sts = CeDcm_e_RidStart; /*置例程当前状态*/ SeDcm_u_RidFF01Sts = CeDcm_e_RidStop; /*置例程当前状态*/ SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_FAILURE; SeDcm_u_RidFF01Sts = CeDcm_e_RidStart; /*置例程当前状态*/ SeDcm_u_RidFF01Sts = CeDcm_e_RidStop; /*置例程当前状态*/ SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } #endif return LeDcm_u_Result; } /*------------ boot add 766-----------------*/ /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF02Stop(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF02 停止 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF02Stop(void) { uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; if(CeDcm_e_RidStart == SeDcm_u_RidFF02Sts) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF02Stop(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF00 停止 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF00Stop(void) { uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; if(CeDcm_e_RidStart == SeDcm_u_RidFF00Sts) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF02Result(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF01 停止 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF01Stop(void) { uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; if(CeDcm_e_RidStart == SeDcm_u_RidFF01Sts) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF02Result(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF02 请求结果 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF02Result(void) { uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; if(CeDcm_e_RidStop == SeDcm_u_RidFF02Sts) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF00Result(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF00 请求结果 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF00Result(void) { uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; if(CeDcm_e_RidStop == SeDcm_u_RidFF00Sts) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF01Result(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF01 请求结果 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF01Result(void) { uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; if(CeDcm_e_RidStop == SeDcm_u_RidFF01Sts) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } TeDcm_h_ResultType MngDcm_Routine0202Start(void) { /*------------ boot add 1245 -----------------*/ static uint32 CrcValue; uint32 Temp_AppValid,Temp_ReprogramValid; uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType LeDcm_u_Result; // 78 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); if(CeDcm_e_RidStop == SeDcm_u_RidF001Sts) { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF; LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8; CrcValue = (((uint32)VeDcm_P_DataAddress[4])<<24U) + (((uint32)VeDcm_P_DataAddress[5])<<16U) + (((uint32)VeDcm_P_DataAddress[6])<<8U) + VeDcm_P_DataAddress[7]; if(FLASH_DRIVER_ADDR == SeFCL_Programing_dw_FlashAddr) {//Flash Driver if(CrcValue == GetCrc32_Ram(0xFFFFFFFF,FLASH_DRIVER_ADDR,FLASH_DRIVER_SIZE)) { LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SeDcm_u_DownLoadState = DCM_DS_FLASHCRC_COMPLETE; } else LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_FAILURE; } else { if(CrcValue == GetCrc32(0xFFFFFFFF,APP_START_ADDR,APP_SIZE)) { KamData.boot_enable = 0; LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS; SeDcm_u_DownLoadState = DCM_DS_APPCRC_COMPLETE; } else LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_FAILURE; } SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { /*设置NRC 24*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; /*------------ boot add 1245 -----------------*/ } TeDcm_h_ResultType MngDcm_Routine0202Stop(void) { } TeDcm_h_ResultType MngDcm_Routine0202Result(void) { } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_EnableCommunication(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 28 允许通讯 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_CtrlCommunication(uint8 CommunicationType) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; if(SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION) { if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty) { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ return CeDcm_e_ResultNoRsp; } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC7F]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ return CeDcm_e_ResultNoRsp; } } if( (CommunicationType >= 1) && ( CommunicationType <= 3)) { if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; if( CommunicationType == 3) { SeDcm_u_NetworkMsgSts = 3 - VeDcm_h_RqustInfo.Sub; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = 3 - VeDcm_h_RqustInfo.Sub; /*应用报文收发使能*/ } else if(CommunicationType == 1) SeDcm_u_NormalMsgSts = 3 - VeDcm_h_RqustInfo.Sub; /*应用报文收发使能*/ else SeDcm_u_NetworkMsgSts = 3 - VeDcm_h_RqustInfo.Sub; /*网络管理报文收发使能*/ SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } else { /*设置NRC 31*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_DisenableCommunication(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 28 禁止通讯 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_DisenableCommunication(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_DISENABLE; /*网络管理报文收发关闭*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE; /*应用报文收发关闭*/ SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } return LeDcm_u_Result; } uint8 GetNormalMsgSts(void) { return (SeDcm_u_NormalMsgSts); } uint8 GetNetworkMsgSts(void) { return(SeDcm_u_NetworkMsgSts); } unsigned char SX11GetNormalMsgSts(void) { return (3 - SeDcm_u_NormalMsgSts); } unsigned char SX11GetNetworkMsgSts(void) { return(3 - SeDcm_u_NetworkMsgSts); } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_TesterPresentDeal(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 3E 诊断在线 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_TesterPresentDeal(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*重置S3server计时*/ if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_DTCSettingEnable(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 85 DTC 设置使能 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_DTCSettingEnable(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; uint8 temp; if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty && (SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION)) { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ return CeDcm_e_ResultNoRsp; } SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; //DtcStutasInit(); if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_DTCSettingDisenable(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 85 DTC 设置禁止 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_DTCSettingDisenable(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty && (SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION)) { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ return CeDcm_e_ResultNoRsp; } SeDcm_u_DtcSetSts = DCM_DTCSET_DISENABLE; if(_FALSE == (VeDcm_h_RqustInfo.Sub&0x80)) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } return LeDcm_u_Result; } uint8 GetDtcEnable(void) { return SeDcm_u_DtcSetSts; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_DynamicaDefineNewDid(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 2C 创建新动态DID 处理函数 *编辑时间 : 2016-12-25 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_DynamicaDefineNewDid(void) { TeDcm_h_ResultType LeDcm_u_Result; /*设置NRC22*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; /*负响应*/ return LeDcm_u_Result; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_ClearDynamicaDid(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 2C 创建新动态DID 处理函数 *编辑时间 : 2016-12-25 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_ClearDynamicaDid(void) { TeDcm_h_ResultType LeDcm_u_Result; /*设置NRC22*/ MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; /*负响应*/ return LeDcm_u_Result; } /****************************************************************************** *函数名称 : void MngDcm_ChangeToDefaltSession(void) *参数 : void *返回值 : void *描述 : 跳转到 默认会话模式 处理函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void MngDcm_ChangeToDefaltSession(void) { /*------------ boot add -----------------*/ uint32 Temp_ReprogmaValid; if(DCM_PROGRAMME_SESSION == SeDcm_u_DiagnosticSession) { KamData.boot_enable = 0; SetMcu_SoftReset(); } /*------------ boot add -----------------*/ SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_STOP; /*S3server 计时停止*/ SeDcm_u_DiagnosticSession = DCM_DEFAULT_SESSION; /*会话模式 默认模式*/ SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式锁定*/ SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; /*DTC设置使能*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发使能*/ } /****************************************************************************** *函数名称 : void MngDcmS3ServerAndKeyErrorCountCutDown(void) *参数 : void *返回值 : void *描述 : S3ServerTime 计数自减 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void MngDcmS3ServerCountCutDown(void) { if(SeDcm_w_S3ServerTime > 0) { SeDcm_w_S3ServerTime--; } } /****************************************************************************** *函数名称 : void MngDcmKeyErrorDelayCountCutDown(void) *参数 : void *返回值 : void *描述 : 密钥错误超出允许次数 延时 计数自减 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void MngDcmKeyErrorDelayCountCutDown(void) { if(SeDcm_u_KeyErrorDelayCount > 0) { SeDcm_u_KeyErrorDelayCount--; if(SeDcm_u_KeyErrorDelayCount == 0) { SeDcm_u_KeyErrorCount = 0U; KamData.KeyErrTimes = 0; } } if(SaDcm_u_RequestDelayCount > 0) { SaDcm_u_RequestDelayCount--; if(SaDcm_u_RequestDelayCount == 0) { SaDcm_u_RequestCounter = 0U; KamData.SeedReqTimes = 0; } } } /****************************************************************************** *函数名称 : void MngDcm_PrepareNegRsp(uint8 LeDcm_u_Sid,uint8 LeDcm_u_Nrc) *参数 : LeDcm_u_Sid 请求的sid 要回应的NRC的索引 *返回值 : void *描述 : 整理负响应数据 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void MngDcm_PrepareNegRsp(uint8 LeDcm_u_Sid,uint8 LeDcm_u_Nrc) { VaDcm_u_NegRspTxBuffer[0] = 0x7F; /*负响应*/ VaDcm_u_NegRspTxBuffer[1] = LeDcm_u_Sid; /*sid*/ VaDcm_u_NegRspTxBuffer[2] = LeDcm_u_Nrc; /*NRC*/ } /****************************************************************************** *函数名称 : void MngDcm_PrepareNegRsp(uint8 LeDcm_u_Sid,uint8 LeDcm_u_Nrc) *参数 : TargetAddress 目标数组,TargetPost 目标数组的起始位置,SourceAddress 源数组,SourcePost 源数组位置, DataLength 需移动的数据长度 *返回值 : void *描述 : 移动数据 处理 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void MngDcm_DataMoveDeal(uint8* TargetAddress,uint8 TargetPost,uint8* SourceAddress,uint8 SourcePost,uint8 DataLength) { uint8 i; for(i = 0;i < DataLength; i ++) { TargetAddress[TargetPost + i] = SourceAddress[SourcePost + i]; } } /****************************************************************************** *函数名称 :TeDcm_h_ResultType MngDcm_RequestDownloadService(void) *参数 : void *返回值 : LeDcm_u_FinallyResult 处理结果 *描述 : 34 服务函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ uint8 MngDcm_34AddrChk(uint32 Addr,uint32 Size) { if(((Addr == APP_START_ADDR) && (Size == APP_SIZE)) || (((Addr == FLASH_DRIVER_ADDR) && (Size == FLASH_DRIVER_SIZE))||(Addr == DM_FLASH_DRIVER_ADDR))) return DCM_CHECK_OK; else return DCM_CHECK_NOK; } TeDcm_h_ResultType MngDcm_RequestDownloadService(void) { uint8 LeDcm_u_dataFomatldentifier; /*数据格式*/ uint8 LeDcm_u_addressAndLengthFomatldentifier; /*地址和数据长度格式*/ uint32 LeDcm_w_Address; /*地址*/ uint32 LeDcm_w_DataLength; /*数据长度*/ uint8 LeDcm_u_SidIndex; uint8 LeDcm_u_SecurityAccessCheckResult; uint8 LaDcm_u_TempBuffer[6]; uint8 BootCnt[16]; TeDcm_h_ResultType LeDcm_u_FinallyResult; LeDcm_u_dataFomatldentifier = VeDcm_P_DataAddress[1]; LeDcm_u_addressAndLengthFomatldentifier = VeDcm_P_DataAddress[2]; /*提取地址参数*/ LeDcm_w_Address = (((uint32)VeDcm_P_DataAddress[3])<<24U) + (((uint32)VeDcm_P_DataAddress[4])<<16U) + (((uint32)VeDcm_P_DataAddress[5])<<8U) + VeDcm_P_DataAddress[6]; /*提取数据长度数*/ LeDcm_w_DataLength = (((uint32)VeDcm_P_DataAddress[7])<<24U) + (((uint32)VeDcm_P_DataAddress[8])<<16U) + (((uint32)VeDcm_P_DataAddress[9])<<8U) + VeDcm_P_DataAddress[10]; SeFCL_Programing_dw_FlashAddr = LeDcm_w_Address; SeFCL_Programing_dw_DataLen = LeDcm_w_DataLength; if((DCM_DATAFOMATLDENTIFER == LeDcm_u_dataFomatldentifier)&&(LeDcm_u_addressAndLengthFomatldentifier == DCM_ADDRESSANDLENGTHFOMATLDENTIFER)) { if(VeDcm_h_RqustInfo.DL == 11U) { if(DCM_CHECK_OK == MngDcm_34AddrChk(LeDcm_w_Address,LeDcm_w_DataLength)) { if((DM_FLASH_DRIVER_ADDR == SeFCL_Programing_dw_FlashAddr) || (FLASH_DRIVER_ADDR == SeFCL_Programing_dw_FlashAddr)) { SeFCL_Programing_dw_FlashAddr = FLASH_DRIVER_ADDR; SeFCL_Programing_dw_DataLen = FLASH_DRIVER_SIZE; /* GetRTE_Dcm_DidServices_0x0200_ReadData(BootCnt); GetRTE_Dcm_DidServices_0x0201_ReadData(BootCnt + 8); if(BootCnt[8] == 0xFF) BootCnt[8] = 1; else BootCnt[8]++; if (FSL_OK == prFslStart()) { prFslErase(104,1); prFslWrite(DID_0200_ADDR,(fsl_u08*)BootCnt,16); } */ CaDcm_w_SingleAllowDateLength = 0x0042; } else { CaDcm_w_SingleAllowDateLength = 0x0202; SeFCL_Programing_dw_FlashAddr = APP_START_ADDR; SeFCL_Programing_dw_DataLen = 0x10000; if(SeDcm_u_DownLoadState != DCM_DS_ERASE_COMPLETE) { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC70]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ return LeDcm_u_FinallyResult; } else { SeDcm_u_DownLoadState = DCM_DS_APPDOWNLOAD_REQUEST; } } LeDcm_u_SidIndex = MngDcm_SIDCheckAvailable(VeDcm_h_RqustInfo.Sid); LeDcm_u_SecurityAccessCheckResult = MngDcm_SIDCheckSecurityAccess(LeDcm_u_SidIndex); if(DCM_CHECK_OK == LeDcm_u_SecurityAccessCheckResult) { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = DCM_LENGTHFOMATLDENTIFER; LaDcm_u_TempBuffer[3] = (uint8)(CaDcm_w_SingleAllowDateLength&0xFF); /*单次允许的最大数据 低字节*/ LaDcm_u_TempBuffer[2] = (uint8)(CaDcm_w_SingleAllowDateLength>>8); /*单次允许的最大数据 高字节*/ SetCanTp_TxBuffer(4U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadRequested; /*置数据下载状态为 已请求下载*/ SeDcm_w_DownLoadDataLength = LeDcm_w_DataLength; /*记录 34 请求下载的数据长度*/ SeDcm_w_TransmitDataCount = 0U; LeDcm_u_FinallyResult = CeDcm_e_ResultPosRsp; } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC70]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC13]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } return LeDcm_u_FinallyResult; } /****************************************************************************** *函数名称 : *参数 : void *返回值 : LeDcm_u_FinallyResult 处理结果 *描述 : 36 服务函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_TransmitDataService(void) { uint16 LeDcm_w_SingleTransmitDataCount; uint8 LeDcm_u_BlockSequenceCount; uint8 LeDcm_u_BlockExpect; uint8 LaDcm_u_TempBuffer[6]; /*响应数据缓存数组*/ TeDcm_h_ResultType LeDcm_u_FinallyResult; static uint16 ProgramByteCnt; static uint16 RemaindProgramByteCnt,LastRemaindProgramByteCnt; static uint8 ProgramDataBuf[1024]; uint8 *pWriteBuf; fsl_u08 LeDcm_FCC_Ret; uint16 TempCnt,TempCnt1; static uint16 FlashDrvCpyCnt; unsigned char *flashdata; if(CeDcm_e_DownLoadRequested==SeDcm_u_DownLoadDataSts||CeDcm_e_DownLoadDuringTransmit == SeDcm_u_DownLoadDataSts||CeDcm_e_DownLoadTransmited == SeDcm_u_DownLoadDataSts) { LeDcm_w_SingleTransmitDataCount = VeDcm_h_RqustInfo.DL - 2U; /*提取传输的数据量 剔除服务参数字节*/ SeDcm_w_TransmitDataCount = SeDcm_w_TransmitDataCount + LeDcm_w_SingleTransmitDataCount; /*记录传输数据量*/ /*判断传输数据累计是否超过 请求下载的数据量 单次传输长度是否超出 34服务回应的允许的数据量*/ LeDcm_u_BlockSequenceCount = VeDcm_P_DataAddress[1]; /*提取 36 请求参数 BlockSequenceCount*/ LeDcm_u_BlockExpect = (uint8)(((uint16)SeDcm_u_BlockSequenceCountSts + 1)&0x00ff); if((uint32_t)LeDcm_w_SingleTransmitDataCount * LeDcm_u_BlockSequenceCount <= APP_SIZE) { if(VeDcm_h_RqustInfo.DL != CaDcm_w_SingleAllowDateLength)/*MaxNumberofBlockLength*/ { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC13]); /*整理负响应数据 */ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ return LeDcm_u_FinallyResult; } if(((0x01 == LeDcm_u_BlockSequenceCount)&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadRequested)) || (((LeDcm_u_BlockSequenceCount== LeDcm_u_BlockExpect)||(LeDcm_u_BlockSequenceCount == LeDcm_u_BlockExpect-1))&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadDuringTransmit||CeDcm_e_DownLoadTransmited == SeDcm_u_DownLoadDataSts))) { if((0x01 == LeDcm_u_BlockSequenceCount)&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadRequested)) { RemaindProgramByteCnt = 0; FlashDrvCpyCnt = 0; SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadDuringTransmit; /*置数据下载状态为 正在传输*/ } //如果SequenceCount不变,覆盖缓冲区 if((LeDcm_u_BlockSequenceCount == LeDcm_u_BlockExpect-1) && (FLASH_DRIVER_ADDR != SeFCL_Programing_dw_FlashAddr)) { flashdata = (unsigned char *)LastSeFCL_Programing_dw_FlashAddr; for(TempCnt=0;TempCnt>8; /* 上次剩余数据长度及本次数据长度之和 ,取0x100整数倍 */ for(TempCnt = 0;(RemaindProgramByteCnt + TempCnt) < (ProgramByteCnt<<8);TempCnt++) ProgramDataBuf[RemaindProgramByteCnt + TempCnt] = VeDcm_P_DataAddress[TempCnt + 2]; /* 转移0x100整数倍数据到专用缓冲区 */ if(ADval_Power<285) { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC93]); /*整理负响应数据 传输数据暂停*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } else if(ADval_Power>574) { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC92]); /*整理负响应数据 传输数据暂停*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } if(VeDcm_h_RqustInfo.DL == CaDcm_w_SingleAllowDateLength)/*MaxNumberofBlockLength*/ { SeDcm_u_BlockSequenceCountSts = LeDcm_u_BlockSequenceCount; if(SeDcm_w_TransmitDataCount == SeDcm_w_DownLoadDataLength) /* 目标接收长度接收完成 */ { SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadTransmited; /*置数据下载状态为 传输完毕*/ RemaindProgramByteCnt = LeDcm_w_SingleTransmitDataCount + RemaindProgramByteCnt - (ProgramByteCnt<<8); SeDcm_w_TransmitDataCount = 0U; if(RemaindProgramByteCnt > 0) ProgramByteCnt += 1; for(TempCnt1 = 0;TempCnt1 < RemaindProgramByteCnt ;TempCnt++,TempCnt1++) ProgramDataBuf[RemaindProgramByteCnt + TempCnt] = VeDcm_P_DataAddress[TempCnt + 2]; /* 转移0x100整数倍数据到专用缓冲区 */ for(;(RemaindProgramByteCnt + TempCnt) < (ProgramByteCnt<<8);TempCnt++) /* 数据全部传输完成,如果数据不满足0x100整数倍,则填入0xFF */ ProgramDataBuf[RemaindProgramByteCnt + TempCnt] = 0xFF; RemaindProgramByteCnt = 0; } LastRemaindProgramByteCnt = RemaindProgramByteCnt; RemaindProgramByteCnt = LeDcm_w_SingleTransmitDataCount + RemaindProgramByteCnt - (ProgramByteCnt<<8); if(FLASH_DRIVER_ADDR == SeFCL_Programing_dw_FlashAddr) /* Flash Driver*/ { for(TempCnt1 = 2;FlashDrvCpyCnt < SeFCL_Programing_dw_DataLen;) { fsl_code_buf[FlashDrvCpyCnt++] = VeDcm_P_DataAddress[TempCnt1++]; if(TempCnt1 >= (LeDcm_w_SingleTransmitDataCount + 2)) break; } //if(ADval_Power>262 && ADval_Power<621) { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = LeDcm_u_BlockSequenceCount; SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultPosRsp; } } else { //78响应 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); /*整理负响应数据*/ SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ if (FSL_OK == prFslStart()) { pWriteBuf = ProgramDataBuf; LastSeFCL_Programing_dw_FlashAddr = SeFCL_Programing_dw_FlashAddr; for(;ProgramByteCnt > 0;ProgramByteCnt--) { //78响应 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); /*整理负响应数据*/ SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ //调用接口 编程 LeDcm_FCC_Ret = prFslWrite(SeFCL_Programing_dw_FlashAddr,(fsl_u08*)pWriteBuf,0x100); SeFCL_Programing_dw_FlashAddr += 0x100; pWriteBuf += 0x100; } } if(LeDcm_FCC_Ret == FSL_OK) { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = LeDcm_u_BlockSequenceCount; SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ //SeFCL_Programing_dw_FlashAddr += (ProgramByteCnt<<8); for(TempCnt += 2,TempCnt1 = 0;TempCnt1 < RemaindProgramByteCnt;TempCnt++,TempCnt1++) ProgramDataBuf[TempCnt1] = VeDcm_P_DataAddress[TempCnt]; /* 转移取出的0x100整数倍数据盛夏的数据转移到专用缓冲区 */ LeDcm_u_FinallyResult = CeDcm_e_ResultPosRsp; } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC11]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC13]); /*整理负响应数据 */ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { //20190112更改36服务超出最大区块时发NRC31 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC73]); /*整理负响应数据 快序列错误*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]); /*整理负响应数据 传输数据暂停*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据 请求顺序错误 */ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } return LeDcm_u_FinallyResult; } /****************************************************************************** *函数名称 : *参数 : void *返回值 : LeDcm_u_FinallyResult 处理结果 *描述 : 37 服务函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_TransmitExitService(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_FinallyResult; //SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadTransmited; if(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadTransmited) { if((VeDcm_h_RqustInfo.DL == 1U))// ||(VeDcm_h_RqustInfo.DL == 2U)) { LaDcm_u_TempBuffer[0] = LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; SetCanTp_TxBuffer(1U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadRelax; /*置数据下载状态为 退出传输 空闲状态*/ SeDcm_u_RidF001Sts = CeDcm_e_RidStop; #if 0 SetFCC_Programing_Finish(); #endif } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC13]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } return LeDcm_u_FinallyResult; } /****************************************************************************** *函数名称 : void InitDcm_Parameter (void) *参数 : void *返回值 : void *描述 : DCM 初始化函数 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ void InitDcm_Parameter (void) { SeDcm_u_DiagnosticSession = DCM_DIAGNOSTIC_SESSION_DEFAULT; /*会话模式 默认会话*/ SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT; /*安全模式 锁定状态*/ SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE; /*DTC设置使能*/ SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发使能*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE |(DCM_MSGTXRX_ENABLE<<1); /*应用报文收发使能*/ SeDcm_u_KeyErrorDelayCount = 0;//DCM_SASERVERSTS_ERRORDELAY_COUNT_DEFAULT; /*默认27服务上电延时*/ SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT; /*置27 服务为 默认状态 */ SeDcm_u_KeyErrorCount = 0U; /*置27 密钥错误次数初始为0 */ SaDcm_u_RequestCounter = KamData.SeedReqTimes; SeDcm_u_KeyErrorCount = KamData.KeyErrTimes; /*读取储存的次数*/ if((SaDcm_u_RequestCounter>>4)==0x0B)SaDcm_u_RequestCounter &= 0x0F; else SaDcm_u_RequestCounter = 0; if((SeDcm_u_KeyErrorCount>>4)==0x0B)SeDcm_u_KeyErrorCount &= 0x0F; else SeDcm_u_KeyErrorCount = 0; if(SeDcm_u_KeyErrorCount >= 3 ) { SeDcm_u_KeyErrorDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT; } SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadRelax; /*置下载处理状态为 空闲*/ SeDcm_u_RidFF02Sts = CeDcm_e_RidStop; /*置例程初始状态*/ SeDcm_u_RidFF00Sts = CeDcm_e_RidStop; SeDcm_u_RidFF01Sts = CeDcm_e_RidStop; RidFF02RunSts = Rid_Idle; //DtcInit(); } /****************************************************************************** *函数名称 : uint16 MngDcm_GetS3serverTime() *参数 : void *返回值 : SeDcm_w_S3ServerTime S3ServerTime当前计数值 *描述 : 获取S3ServerTime当前计数值 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ uint16 MngDcm_GetS3serverTime(void) { return SeDcm_w_S3ServerTime; } void MngDcm_ResetS3serverTime(void) { SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; } /****************************************************************************** *函数名称 : uint8 MngDcm_GetS3serverTimeSts(void) *参数 : void *返回值 : SeDcm_u_S3ServerTimeSts S3ServerTime当前计数 计数状态 *描述 : 获取S3ServerTime当前计数 计数状态 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ uint8 MngDcm_GetS3serverTimeSts(void) { return SeDcm_u_S3ServerTimeSts; } /****************************************************************************** *函数名称 :uint8 MngDcm_GetDiagnosticSession(void) *参数 : void *返回值 : SeDcm_u_DiagnosticSession 当前会话模式 *描述 : 获取当前会话模式 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ uint8 MngDcm_GetDiagnosticSession(void) { return SeDcm_u_DiagnosticSession; } /****************************************************************************** *函数名称 :uint8 MngDcm_GetSecurityAccessSts(void) *参数 : void *返回值 : SeDcm_u_SecurityAccessState 当前安全权限 *描述 : 获取当前安全权限 *编辑时间 : 2015-10-10 *备注 : *****************************************************************************/ uint8 MngDcm_GetSecurityAccessSts(void) { return SeDcm_u_SecurityAccessState; }