/****************************************************************************** | File Name : Dcm_App.c | Description: 诊断服务具体处理 *****************************************************************************/ /****************************************************************************** * Description: : Include File Section ******************************************************************************/ #include "r_cg_macrodriver.h" #include "Dcm_App.h" #include "Dcm_extern.h" #include "r_cg_userdefine.h" #include "pfdl.h" /****************************************************************************** * Description: : Global Variable Definition Section ******************************************************************************/ TsDcm_h_RquestInfo VeDcm_h_RqustInfo; /*提取请求信息的结构体*/ uint8 VaDcm_u_NegRspTxBuffer[3]; /*负响应发送数据的缓存数组*/ uint8* VeDcm_P_DataAddress ; /*TP层数据地址*/ //uint32_t ReprogmaValid = 0xAA5555AA; /****************************************************************************** * Description: : Static Variable Definition Section ******************************************************************************/ static uint16 SeDcm_u_DL; /*TP层数据长度*/ static uint8 SeDcm_u_RequstSty; /*TP层数据请求方式*/ static 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 = 0x03E8; 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; /****************************************************************************** * 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); void CleanIoDid(void); /****************************************************************************** * Description: : Write User Function Code *****************************************************************************/ /****************************************************************************** *函数名称 : 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 = DCM_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; MngDcm_CleanRequstInfo(); /* 清请求数据*/ if(CeCanTp_e_Full == GetCanTp_e_RxBufferSts(&SeDcm_u_RequstSty,&SeDcm_u_DL,&VeDcm_P_DataAddress)) { 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); /*应用报文收发使能*/ //CleanIoDid(); if(DCM_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); 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; 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(DCM_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] = 0x55; #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; /*设置为不响应*/ } //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 { 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_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; 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(DCM_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; /*设置为不响应*/ } 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; //重启ECU接口 if(SeDcm_u_DiagnosticSession != DCM_DEFAULT_SESSION) { if(DCM_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] = 0x55; KamData.RspData[4] = 0x55; KamData.RspData[5] = 0x55; KamData.RspData[6] = 0x55; KamData.RspData[7] = 0x55; #if 0 LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SetCanTp_TxBuffer(2U,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; /*设置为不响应*/ } if(LeDcm_u_Result == CeDcm_e_ResultPosRsp) { #if 0 while(ResetDelayCnt < 0x80000) { ResetDelayCnt++; } #endif SetMcu_SoftReset(); } else SetMcu_SoftReset(); } 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_NRC7F]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNegRsp; } } 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],savebuf[4]; TeDcm_h_ResultType LeDcm_u_Result; //SeDcm_u_KeyErrorDelayCount = 0; if(SaDcm_u_RequestCounter < 5) { SaDcm_u_RequestCounter++; KamData.SeedReqTimes = SaDcm_u_RequestCounter | 0x10; if(SaDcm_u_RequestCounter == 5) { SaDcm_u_RequestDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT; SeDcm_u_KeyErrorCount = 3; KamData.KeyErrTimes = SeDcm_u_KeyErrorCount | 0x10; } ReadFlashData(savebuf,0x000F1800,4); savebuf[0] = SaDcm_u_RequestCounter; savebuf[1] = SeDcm_u_KeyErrorCount; WriteDataflash(savebuf,0x000F1800,4); }//fcb if(0==SeDcm_u_KeyErrorDelayCount && 0==SaDcm_u_RequestDelayCount) { if(SaDcm_u_RequestCounter == 5) { SaDcm_u_RequestCounter=0; KamData.SeedReqTimes = 0; ReadFlashData(savebuf,0x000F1800,4); savebuf[0] = SaDcm_u_RequestCounter; savebuf[1] = SeDcm_u_KeyErrorCount; WriteDataflash(savebuf,0x000F1800,4); } if(DCM_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 { 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],savebuf[4]; TeDcm_h_ResultType LeDcm_u_Result; uint32 LeDcm_w_Key; if(DCM_SASERVERSTS_REQUESTKEY & SeDcm_u_SecurityAccessServerSts) { SaDcm_u_RequestCounter = 0; KamData.SeedReqTimes = SaDcm_u_RequestCounter; 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 | 0x10; ReadFlashData(savebuf,0x000F1800,4); savebuf[0] = SaDcm_u_RequestCounter; savebuf[1] = SeDcm_u_KeyErrorCount; WriteDataflash(savebuf,0x000F1800,4); } else /*密钥验证通过*/ { SeDcm_u_KeyErrorCount = 0U; /*密钥错误次数清零*/ KamData.KeyErrTimes = SeDcm_u_KeyErrorCount; ReadFlashData(savebuf,0x000F1800,4); savebuf[0] = SaDcm_u_RequestCounter; savebuf[1] = SeDcm_u_KeyErrorCount; WriteDataflash(savebuf,0x000F1800,4); if(dummy == 0x02) SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L1_UNLOCK; /*置安全权限为 解锁状态 */ else if(dummy == 0x12) SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L2_UNLOCK; /*置安全权限为 解锁状态 */ } if(0 == SeDcm_u_KeyErrorCount) /*密钥没有错误*/ { if(DCM_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; } /****************************************************************************** *函数名称 : TeDcm_h_ResultType MngDcm_RoutineFF00Start(void) *参数 : void *返回值 : LeDcm_u_Result 处理结果 *描述 : 31 服务 FF00 开始 处理函数 *编辑时间 : 2015-11-03 *备注 : *****************************************************************************/ TeDcm_h_ResultType MngDcm_RoutineFF00Start(void) { TeDcm_h_ResultType LeDcm_u_Result; #if 0 uint8 LaDcm_u_TempBuffer[5]; TeDcm_h_ResultType 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); if(CeFCC_Programing_e_Succeed == SetFCC_Programing_EraseFlash(FCC_PROGRAMING_APPCODE_SECTORONE)) { SetWd_FeedWdg(); // 78 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); //处理函数 SetFCC_Programing_EraseFlash(FCC_PROGRAMING_APPCODE_SECTORTWO); SetWd_FeedWdg(); // 78 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); //处理函数 SetFCC_Programing_EraseFlash(FCC_PROGRAMING_APPCODE_SECTORTHR); if(DCM_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 { /*设置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; } /****************************************************************************** *函数名称 : 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]; TeDcm_h_ResultType LeDcm_u_Result; #if 0 if(CeDcm_e_RidStop == SeDcm_u_RidFF01Sts) { //处理函数 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]); SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); LeDcm_u_Result = CeDcm_e_ResultNegRsp; if(CeFCC_Programing_e_Succeed == SetFCC_Programing_Check()) { if(DCM_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 { 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; } #endif return LeDcm_u_Result; } /****************************************************************************** *函数名称 : 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(DCM_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(DCM_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(DCM_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(DCM_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(DCM_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(DCM_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_RoutineF001Start(void) { } TeDcm_h_ResultType MngDcm_RoutineF001Stop(void) { } TeDcm_h_ResultType MngDcm_RoutineF001Result(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(DCM_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*/ 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_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } } 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(DCM_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 { SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_DISENABLE; /*网络管理报文收发关闭*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE; /*应用报文收发关闭*/ SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } return LeDcm_u_Result; } TeDcm_h_ResultType MngDcm_EnableCommunication(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; if(0x02 != VeDcm_h_RqustInfo.Sub) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发关闭*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发关闭*/ SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发关闭*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发关闭*/ SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer); /*调用接口发送响应数据 0数据为不响应*/ LeDcm_u_Result = CeDcm_e_ResultNoRsp; } return LeDcm_u_Result; } TeDcm_h_ResultType MngDcm_EnableCommunication_SID_0x29(void) { uint8 LaDcm_u_TempBuffer[2]; TeDcm_h_ResultType LeDcm_u_Result; if(0x02 != VeDcm_h_RqustInfo.Sub) /*判断正响应抑制位*/ { LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40; LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub; SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发关闭*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发关闭*/ SetCanTp_TxBuffer(1U,LaDcm_u_TempBuffer); /*调用接口发送响应数据*/ LeDcm_u_Result = CeDcm_e_ResultPosRsp; } else { SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE; /*网络管理报文收发关闭*/ SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1); /*应用报文收发关闭*/ 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(DCM_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; } void resetS3Server(void) { SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT; /*重置S3server计时*/ } /****************************************************************************** *函数名称 : 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(DCM_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(DCM_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) { 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); /*应用报文收发使能*/ //CleanIoDid(); } /****************************************************************************** *函数名称 : 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) { unsigned char savebuf[4]; if(SeDcm_u_KeyErrorDelayCount > 0) { SeDcm_u_KeyErrorDelayCount--; if(SeDcm_u_KeyErrorDelayCount == 0) { SeDcm_u_KeyErrorCount = 0U; KamData.KeyErrTimes = SeDcm_u_KeyErrorCount; ReadFlashData(savebuf,0x000F1800,4); savebuf[0] = SaDcm_u_RequestCounter; savebuf[1] = SeDcm_u_KeyErrorCount; WriteDataflash(savebuf,0x000F1800,4); } } if(SaDcm_u_RequestDelayCount > 0) { SaDcm_u_RequestDelayCount--; if(SaDcm_u_RequestDelayCount == 0) { SaDcm_u_RequestCounter = 0U; KamData.SeedReqTimes = SaDcm_u_RequestCounter; ReadFlashData(savebuf,0x000F1800,4); savebuf[0] = SaDcm_u_RequestCounter; savebuf[1] = SeDcm_u_KeyErrorCount; WriteDataflash(savebuf,0x000F1800,4); } } } /****************************************************************************** *函数名称 : 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 *备注 : *****************************************************************************/ 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]; TeDcm_h_ResultType LeDcm_u_FinallyResult; #if 0 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]; if((DCM_DATAFOMATLDENTIFER == LeDcm_u_dataFomatldentifier)&&(LeDcm_u_addressAndLengthFomatldentifier == DCM_ADDRESSANDLENGTHFOMATLDENTIFER)) { if(VeDcm_h_RqustInfo.DL == 11U) { if(CeFCC_Programing_e_Succeed == SetFCC_Programing_AddrSize(LeDcm_w_Address,LeDcm_w_DataLength)) { 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] = CaDcm_w_SingleAllowDateLength&0xFF; /*单次允许的最大数据 低字节*/ LaDcm_u_TempBuffer[2] = 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_NRC33]); /*整理负响应数据*/ 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; /*负响应*/ } #endif 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; #if 0 TeFCC_Programing_e_Result LeDcm_FCC_Ret; if(CeDcm_e_DownLoadRequested==SeDcm_u_DownLoadDataSts||CeDcm_e_DownLoadDuringTransmit == SeDcm_u_DownLoadDataSts) { LeDcm_w_SingleTransmitDataCount = VeDcm_h_RqustInfo.DL - 2U; /*提取传输的数据量 剔除服务参数字节*/ SeDcm_w_TransmitDataCount = SeDcm_w_TransmitDataCount + LeDcm_w_SingleTransmitDataCount; /*记录传输数据量*/ /*判断传输数据累计是否超过 请求下载的数据量 单次传输长度是否超出 34服务回应的允许的数据量*/ if(SeDcm_w_TransmitDataCount <= SeDcm_w_DownLoadDataLength) { LeDcm_u_BlockSequenceCount = VeDcm_P_DataAddress[1]; /*提取 36 请求参数 BlockSequenceCount*/ LeDcm_u_BlockExpect = (uint8)(((uint16)SeDcm_u_BlockSequenceCountSts + 1)&0x00ff); if(((0x01 == LeDcm_u_BlockSequenceCount)&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadRequested)) || ((LeDcm_u_BlockSequenceCount== LeDcm_u_BlockExpect)&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadDuringTransmit))) { if(VeDcm_h_RqustInfo.DL <= CaDcm_w_SingleAllowDateLength)/*MaxNumberofBlockLength*/ { SeDcm_u_BlockSequenceCountSts = LeDcm_u_BlockSequenceCount; SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadDuringTransmit; /*置数据下载状态为 正在传输*/ if(SeDcm_w_TransmitDataCount == SeDcm_w_DownLoadDataLength) { SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadTransmited; /*置数据下载状态为 传输完毕*/ SeDcm_w_TransmitDataCount = 0U; } //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 = SetFCC_Programing_Code(VeDcm_h_RqustInfo.DL-2,&VeDcm_P_DataAddress[2]); if(LeDcm_FCC_Ret == CeFCC_Programing_e_Succeed) { 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 { 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_NRC31]); /*整理负响应数据*/ SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/ LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp; /*负响应*/ } } else { 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_NRC71]); /*整理负响应数据*/ 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; /*负响应*/ } #endif 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; if(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadTransmited) { if(VeDcm_h_RqustInfo.DL == 1U) { 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; /*置数据下载状态为 退出传输 空闲状态*/ #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) { unsigned char readbuf[33]; 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; /*读取储存的次数*/ ReadFlashData(readbuf,0x000F1800,4); SaDcm_u_RequestCounter = readbuf[0]; SeDcm_u_KeyErrorCount = readbuf[1]; /*读取储存的次数*/ if(SaDcm_u_RequestCounter > 6)SaDcm_u_RequestCounter=0; if(SeDcm_u_KeyErrorCount > 4)SeDcm_u_KeyErrorCount=0; /* if((SaDcm_u_RequestCounter>>4)==0x01)SaDcm_u_RequestCounter &= 0x0F; else SaDcm_u_RequestCounter = 0; if((SeDcm_u_KeyErrorCount>>4)==0x01)SeDcm_u_KeyErrorCount &= 0x0F; else SeDcm_u_KeyErrorCount = 0; */ if(SeDcm_u_KeyErrorCount >= 3 ) { SeDcm_u_KeyErrorDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT; //SaDcm_u_RequestCounter=5; } 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; }