2024-07-07 16:42:04 +08:00

2195 lines
75 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
| 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<DCM_SASERVER_KEYERRORCOUNT) /*密钥错误次数在允许范围*/
{
/*设置NRC 35*/
SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT; /*置27 服务为 默认状态 */
MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC35]); /*整理负响应数据*/
SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/
LeDcm_u_Result = CeDcm_e_ResultNegRsp;
}
else
{
/*密钥错误次数超出允许范围*/ /*设置NRC 36*/
SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT; /*置27 服务为 默认状态 */
SeDcm_u_KeyErrorDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT; /*开启密钥错误次数超出后 27服务允许访问延时 */
MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC36]); /*整理负响应数据*/
SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer); /*调用接口发送响应数据*/
LeDcm_u_Result = CeDcm_e_ResultNegRsp;
}
}
else
{
/*设置NRC 24*/
SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT; /*置27 服务为 默认状态 */
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_RoutineFF02Start(void)
*参数 : void
*返回值 : LeDcm_u_Result 处理结果
*描述 : 31 服务 FF02 开始 处理函数
*编辑时间 : 2015-10-10
*备注 :
*****************************************************************************/
TeDcm_h_ResultType MngDcm_RoutineFF02Start(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;
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;
}