Commit 83c528c2 authored by 李秉薇's avatar 李秉薇

fix:修改31服务负反馈及优先级,禅道号:39985,39986,39987,39988,39990

parent df10c6dc
/code/EF01_Data
/code/bin
......@@ -201,7 +201,7 @@ RoutineControl
#define stopRoutine 0x02
#define requestRoutineResults 0x03
#define MaintenanceReset 0x62F1
#define MaintenanceReset 0xE420
#define CheckMemory 0x0202
#define CheckProgrammingPreconditions 0x0203
#define ECU_selftest 0xDF01
......
/******************************************************************************
文 件 名;UDS_ISO14229_Services.c
功能描述;ISO 14229 规范规定的诊断服务服务器端服务实现函数库文件
作 者;张暄
版 本;V1.0
日 期;2016.11.1
件 名;UDS_ISO14229_Services.c
功能描述;ISO 14229 规范规定的诊断服务服务器端服务实现函数库文件
者;张暄
本;V1.0
期;2016.11.1
******************************************************************************/
//#include "Include.h"
//#include "Const.h"
......@@ -167,48 +167,48 @@ INT8U EraseMemoryFF[128];
INT8U APPFLAG;
DiagSendDataRes PosRes;
DiagSendDataNeg NegRes;
uint8_t S3_ServerEN; // 扩展会话5s定时器使能开关
uint16_t S3_ServerCnt; //扩展会话定时器计数器
uint8_t S3_Server_refresh; //刷新扩展会话S3时间标志
uint16_t S19DataCntOfReceive; //S19数据的接收总长度
uint8_t S3_ServerEN; // 扩展会话5s定时器使能开关
uint16_t S3_ServerCnt; //扩展会话定时器计数器
uint8_t S3_Server_refresh; //刷新扩展会话S3时间标志
uint16_t S19DataCntOfReceive; //S19数据的接收总长度
SRecord_t srcd;
//uint16_t CheckSum;
uint8_t BlockSCT; //BlockSequenceCounter (1,2,...255,0)
uint8_t REC_DLlen; //已经接收到的数据个数(多少字节)
uint8_t DTCControlType; //DTC记录控制开关 0
uint8_t BlocKCnt; //S19 传输的block数目
uint8_t RequestTransfer; //请求下载的标志
//uint32_t SectorAddress; //扇区地址
uint32_t EraseAddress; //擦除地址
uint8_t ControlType; // 通信控制的类型
uint8_t CommunicationType; // 通信控制的类型
uint8_t Wait10s; //27服务尝试失败需要等待10秒
uint8_t REC_DLlen; //已经接收到的数据个数(多少字节)
uint8_t DTCControlType; //DTC记录控制开关 0
uint8_t BlocKCnt; //S19 传输的block数目
uint8_t RequestTransfer; //请求下载的标志
//uint32_t SectorAddress; //区地址
uint32_t EraseAddress; //除地址
uint8_t ControlType; // 通信控制的类型
uint8_t CommunicationType; // 通信控制的类型
uint8_t Wait10s; //27服务尝试失败需要等待10秒
uint8_t wait10cnt = 0;
uint8_t Wait10sFlag; //等待10秒标志
uint8_t DiagLockFlag; //27服务解锁标志
//uint8_t AttemptCnt; //27服务尝试次数
//uint8_t RequestSeedCnt; //请求种子的次数
uint8_t SeedkeyValidFlag; //置1 表示秘钥生效
uint32_t ValidSeedKey1; //表示有效的秘钥
//uint32_t ValidSeedKey4; //表示有效的秘钥
uint32_t ValidSeedKey2; //表示有效的秘钥
uint8_t Wait10sFlag; //等待10秒标志
uint8_t DiagLockFlag; //27务解锁标志
//uint8_t AttemptCnt; //27务尝试次数
//uint8_t RequestSeedCnt; //请求种子的次数
uint8_t SeedkeyValidFlag; //置1 表示秘钥生效
uint32_t ValidSeedKey1; //表示有效的秘钥
//uint32_t ValidSeedKey4; //表示有效的秘钥
uint32_t ValidSeedKey2; //表示有效的秘钥
uint16_t SeedHigh;
uint16_t SeedLow;
uint8_t Services27_01_Requested;
uint8_t noDataLenth;
uint8_t Time10sLock;
uint16_t EngineSpeed; //发动机转速
uint8_t MotorPosition; //电机位置
uint8_t DisplayColor; //需要显示的颜色
uint8_t ControlMotor; //需要控制的是哪个电机
uint16_t EngineSpeed; //动机转速
uint8_t MotorPosition; //机位置
uint8_t DisplayColor; //需要显示的颜色
uint8_t ControlMotor; //需要控制的是哪个电机
uint16_t ESpeedVal; //转速
uint16_t VspeedVal; //车速
uint8_t TempSeg; //水温
uint16_t ESpeedVal; //
uint16_t VspeedVal; //车速
uint8_t TempSeg; //
uint8_t BuzzerStatus; //蜂鸣器状态
uint8_t BuzzerStatus; //蜂鸣器状态
uint8_t SessionType = 1; //会话类型
uint8_t SessionType = 1; //话类型
uint8_t IO_Group_1;
uint8_t IO_Group_2;
uint8_t IO_Group_3;
......@@ -220,32 +220,32 @@ uint8_t IO_MASK_4;
uint8_t Error;
uint32_t DFLASHeep_adr;
INT16U MYeturnCode;
uint8_t seed[4];//用于27服务存放种子可以为局部变量
uint32_t RANDOM;//用于随机数计算 必须为全局变量
uint8_t seed[4];//用于27服务存放种子可以为局部变量
uint32_t RANDOM;//用于随机数计算 必须为全局变量
const uint8_t XorArray[4] = {0x31, 0x23, 0x56, 0x71};
uint8_t UDS_ISO14229_Transfer[250];
uint8_t ContrlorResumeofSOC; //soc控制
uint8_t ContrlorResumeofSOC; //soc控制
uint8_t SocSeg; //Soc
uint8_t ContrlorResumeofEspeed; //转速控制
uint16_t ESpeedValNUM; //转速
uint8_t ContrlorResumeofVspeed; //车速控制
uint16_t VspeedValNUM; //车速
//----hyq--20190827 定义变量
uint8_t ContrlorResumeofGAS1 ; //气压1
uint8_t ContrlorResumeofEspeed; //转速控制
uint16_t ESpeedValNUM; //
uint8_t ContrlorResumeofVspeed; //速控制
uint16_t VspeedValNUM; //车速
//----hyq--20190827 定义变量
uint8_t ContrlorResumeofGAS1 ; //压1
uint8_t ContrlorResumeofLamp; //所有报警灯测试
uint8_t LampWarningStatus; //灯光状态
uint8_t ContrlorResumeofLamp; //所有报警灯测试
uint8_t LampWarningStatus; //灯光状
uint8_t ContrlorResumeofBuzzer; //蜂鸣器控制
uint8_t ContrlorResumeofGauge; //所有表头控制
uint8_t ContrlorResumeofLCD; //LCD控制
uint8_t ContrlorResumeofIO; //IO控制
uint8_t ContrlorResumeofIOLast; //IO控制
uint8_t ContrlorResumeofBuzzer; //蜂鸣器控制
uint8_t ContrlorResumeofGauge; //所有表头控制
uint8_t ContrlorResumeofLCD; //LCD控制
uint8_t ContrlorResumeofIO; //IO控制
uint8_t ContrlorResumeofIOLast; //IO控制
uint8_t ContrlorResumeofTEMP; //水温表控制
uint8_t ContrlorResumeofTEMP; //水温表控制
uint8_t CAN_NORMAL_TT;
uint8_t CAN_NORMAL_2SFF;
uint8_t CAN_DTC_OFF;
......@@ -256,14 +256,14 @@ uint8_t CANNetRxOFF = 0;
uint8_t CoCanTxOff = 0;
Diag27Data diag27;
uint8_t UPDOWNFLAG;
uint8_t CJINF[18]; //存储厂家信息(18位ASSIC字符串)(保存在EEPROM但不备份)
uint8_t CJINF[18]; //存储厂家信息(18位ASSIC字符串)(保存在EEPROM但不备份)
_DTC DiagDtc[cnDTCslen];
RecDTC_WaitBusoff_STRUCT RecDTC_Wait_NoBusoff[cnDTCslen];
INT8U HIGH_VOLTAGE;
INT8U LOW_VOLTAGE;
INT8U BUS_OFF_FLAG;
INT8U VoltageACKFF;
//DTC定时器
//DTC时器
extern INT8U GUIIconSeatbeltRStatus;
extern INT8U GUIIconDRLGStatus;
extern INT8U GUIIconSVSYStatus;
......@@ -389,9 +389,9 @@ INT8U D_P_FLASH_Program ( INT8U mTYPE, INT32U address, INT16U *ptr, INT8U numb
ptr++;
}
cli(); //我加的
cli(); //我加
CallFnCmdInRam();//asm JSR Send_Command; //equal to FSTAT_CCIF=1; while(FSTAT_CCIF==0)asm JSR Send_Command;
sei(); //我加的
sei(); //我加
if ( ( FSTAT & ( FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK ) ) != 0 )
return ACCESS_ERROR;
......@@ -401,7 +401,7 @@ INT8U D_P_FLASH_Program ( INT8U mTYPE, INT32U address, INT16U *ptr, INT8U numb
//==============================================================================
//DFLASH_Erase_Verify_Section
//
//入口:address 为全局地址, number_of_words 为要校验的字单元个数
//入口:address 为全局地址, number_of_words 为要校验的字单元个数
//==============================================================================
INT8U DFLASH_Erase_Verify_Section ( INT32U address, INT16U number_of_words )
{
......@@ -481,13 +481,13 @@ uint8_t PP_FLASH_N_Program ( uint32_t address, uint8_t *ptr, uint8_t number_of
uint32_t DFLASH_Read_Word ( INT32U address )
{
INT16U Data16;
//获取逻辑地址
//获取逻辑地址
uint32_t LogicAddress = address - DFLASH_FirstAddress;
//DFLASH的PAGE寄存器设置
//DFLASH的PAGE寄存器设置
EPAGE = (uint8_t)(LogicAddress / 0x400);
//在PAGE中的相对地址
//在PAGE中的相对地址
LogicAddress %= 0x400;
//将全局地址转化为逻辑地址
//将全局地址转化为逻辑地址
Data16 = ( *(volatile unsigned short * )(0x800 + LogicAddress));
return Data16;
}
......@@ -721,7 +721,7 @@ INT8U DFLASH_Erase_Sector ( INT32U address )
//==============================================================================
//DFLASH_N_Program
//
//入口:address 为全局地址
//入口:address 为全局地址
//
// 1<=number_of_words<=128
//==============================================================================
......@@ -731,7 +731,7 @@ INT8U DFLASH_N_Program ( INT32U address, INT16U *ptr, INT8U number_of_words )
for ( ;; )
{
//复位看门狗
//复位看门狗
__RESET_WATCHDOG();
if ( number_of_words >= 4 )
......@@ -757,13 +757,13 @@ INT8U DFLASH_N_Program ( INT32U address, INT16U *ptr, INT8U number_of_words )
}
//====================================================
//从FLASH中读N个字节数据到RAM (mLEN必须为偶数)
//从FLASH中读N个字节数据到RAM (mLEN必须为偶数)
//====================================================
void ReadNbyteFrDFalsh ( INT16U *mP, INT16U mLEN )
{
INT8U i;
INT16U k;
__RESET_WATCHDOG(); //复位看门狗定时器
__RESET_WATCHDOG(); //复位看门狗定时器
k = mLEN / 2;
for ( i = 0; i < k; i++ )
......@@ -773,16 +773,16 @@ void ReadNbyteFrDFalsh ( INT16U *mP, INT16U mLEN )
}
}
//====================================================
//写N个字节数据到FLASH (mLEN必须为偶数)
//写N个字节数据到FLASH (mLEN必须为偶数)
//====================================================
void WriteNbyteToDFalsh ( INT16U *mP, INT16U mLEN )
{
__RESET_WATCHDOG(); //复位看门狗定时器
__RESET_WATCHDOG(); //复位看门狗定时器
MYeturnCode = DFLASH_N_Program ( DFLASHeep_adr, mP, mLEN / 2 );
DFLASHeep_adr = DFLASHeep_adr + mLEN;
}
//读取改写APP部分程序标志位
//读取改写APP部分程序标志位
void WRITE_BZ_inDFLAH2Sector ( INT16U bz )
{
INT8U mRUL = 0;
......@@ -793,7 +793,7 @@ void WRITE_BZ_inDFLAH2Sector ( INT16U bz )
}
//========================================================
//从FLASH中读诊断协议27内容参数到RAM
//从FLASH中读诊断协议27内容参数到RAM
//========================================================
void Read_27_DATA_FROM_FLASH ( void )
{
......@@ -821,19 +821,19 @@ void Read_27_DATA_FROM_FLASH ( void )
}
}
//========================================================
//写 诊断协议2E内容 参数到FALSH
//写 诊断协议2E内容 参数到FALSH
//========================================================
void Write_27_DATA_TO_FLASH ( void )
{
INT16U m16;
//擦除27服务flash存储扇区
MYeturnCode = DFLASH_Erase_Sector ( DFLASH_LockAddress ); //擦除第3个扇区(256字节)
//清除失败退出函数
//擦除27服务flash存储扇区
MYeturnCode = DFLASH_Erase_Sector ( DFLASH_LockAddress ); //擦除第3个扇区(256字节)
//清除失败退出函数
if ( MYeturnCode != OK )
return;
DFLASHeep_adr = DFLASH_LockAddress + 2;
//将数据写入到falsh中
//将数据写入到falsh中
WriteNbyteToDFalsh ( ( INT16U * ) &diag27, sizeof ( diag27 ) );
m16 = 0x7AA7;
MYeturnCode = DFLASH_N_Program ( DFLASH_LockAddress, &m16, 1 );
......@@ -864,49 +864,49 @@ service primitives are specified:
******************************************************************************/
/******************************************************************************
每一个服务由三个函数实现;
每一个服务由三个函数实现;
1. 函数名; <service_name>_Indication
<service_name> 统一命名为 UDS_Service_<SI>
功 能;应用层通过该函数向诊断服务实现函数请求服务并将相关数据传送给诊断服
务实现函数
1. 函数名; <service_name>_Indication
<service_name> 统一命名为 UDS_Service_<SI>
功 能;应用层通过该函数向诊断服务实现函数请求服务并将相关数据传送给诊断服
务实现函数
The indication primitive is used by the application layer, to
indicate an internal event which is significant to the ECU
diagnostic application and pass data about the requested diagnostic
service to the server function of the ECU diagnostic application.
参 数;A_TA_type ;源地址类型,物理寻址或功能寻址
A_Length ;传输的数据的长度
A_Data ;传输的数据
返回值;无
2. 函数名; <service_name>_Response
<service_name> 统一命名为 UDS_Service_<SI>
功 能;该函数由诊断服务实现函数发起,用于向应用层发送诊断服务函数生成的反
馈数据
参 数;A_TA_type ;源地址类型,物理寻址或功能寻址
A_Length ;传输的数据的长度
A_Data ;传输的数据
返回值;无
2. 函数名; <service_name>_Response
<service_name> 统一命名为 UDS_Service_<SI>
功 能;该函数由诊断服务实现函数发起,用于向应用层发送诊断服务函数生成的反
馈数据
The response primitive is used by the server function in the ECU
diagnostic application, to initiate the service and pass response
data provided by the requested diagnostic service to the
application layer.
参 数;RspType ;反馈类型 POSITIVE_RSP 正反馈
NEGATIVE_RSP 负反馈
A_TA_type ;目标地址类型,发送数据请使用 DIAG_ID_Tx
A_Length ;传输的数据的长度
A_Data ;传输的数据
返回值;无
3. 函数名; <service_name>_Rsp_Confirm
<service_name> 统一命名为 UDS_Service_<SI>
功 能;反馈确认函数由应用层发起,用于向诊断服务实现方告知前一次向应用层发送
反馈数据的传输结果
参 数;RspType ;反馈类型 POSITIVE_RSP 正反馈
NEGATIVE_RSP 负反馈
A_TA_type ;目标地址类型,发送数据请使用 DIAG_ID_Tx
A_Length ;传输的数据的长度
A_Data ;传输的数据
返回值;无
3. 函数名; <service_name>_Rsp_Confirm
<service_name> 统一命名为 UDS_Service_<SI>
功 能;反馈确认函数由应用层发起,用于向诊断服务实现方告知前一次向应用层发送
反馈数据的传输结果
The response-confirm primitive is used by the application layer
to indicate an internal event, which is significant to the server
application, and pass communication results of an associated
previous service response to the server function in the ECU
application.
参 数;A_TA_type ;目标地址类型
A_Result ;传输结果 A_OK 正确传输
A_ERR 传输失败
返回值;无
参 数;A_TA_type ;目标地址类型
A_Result ;传输结果 A_OK 正确传输
A_ERR 输失败
返回值;无
******************************************************************************/
void Randomcnt ( void )
{
......@@ -956,7 +956,7 @@ void S3_ServerCNT ( void )
S3_ServerCnt++;
if ( S3_ServerCnt > S3_SERVER ) //S3超时
if ( S3_ServerCnt > S3_SERVER ) //S3
{
S3_ServerCnt = 0;
S3_ServerEN = 0;
......@@ -965,12 +965,12 @@ void S3_ServerCNT ( void )
DiagLockFlag = 0;
ContrlorResumeofIO = 0;
ContrlorResumeofSOC = 0; //soc控制
ContrlorResumeofSOC = 0; //soc控制
SocSeg = 0; //Soc
ContrlorResumeofEspeed = 0; //转速控制
ESpeedValNUM = 0; //转速
ContrlorResumeofVspeed = 0; //车速控制
VspeedValNUM = 0; //车速
ContrlorResumeofEspeed = 0; //转速控制
ESpeedValNUM = 0; //
ContrlorResumeofVspeed = 0; //速控制
VspeedValNUM = 0; //车速
ContrlorResumeofLamp = 0;
// ISD_Stop_Loop();
......@@ -1010,20 +1010,20 @@ void UDS_Service_10_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
Service10DiagDataLength = A_Length;
S3_ServerCnt = 0;
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service10DiagDataLength != 1 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x10, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回会22负反馈
//获取数据
//供电电压异常,车速大于0,返回会22负反馈
//取数据
for ( i = 0; i < Service10DiagDataLength; i++ )
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
//判断子服务是否支持
//判断子服务是否支持
switch(UDS_ISO14229_Transfer[0]){
case 0x81 :
case 0x01 :
......@@ -1033,10 +1033,10 @@ void UDS_Service_10_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
S3_ServerCnt = 50;
SeedkeyValidFlag = 0;
DiagLockFlag = NormalKeyLock;
//切换到默认会话
//切换到默认会话
SessionType = DefaultSession;
}
//10 01需要正反馈 10 81不需要正反馈
//10 01需要正反馈 10 81不需要正反馈
if ( UDS_ISO14229_Transfer[0] == 0x01 )
{
UDS_Service_Response ( 0x10, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );;
......@@ -1046,7 +1046,7 @@ void UDS_Service_10_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
case 0x82 :
case 0x02 :
//会话不支持,返回7E负反馈
//会话不支持,返回7E负反馈
if( DefaultSession ==SessionType ){
if(FunorPhy == DIAG_ID_Rx_FUN )
return ;
......@@ -1061,50 +1061,50 @@ void UDS_Service_10_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
for(i = 0; i < 500; ++i){
nop();
}
WRITE_BZ_inDFLAH2Sector ( 0x3AA3 ); //进入编程模式
WRITE_BZ_inDFLAH2Sector ( 0x3AA3 ); //进入编程模式
}else {
WRITE_BZ_inDFLAH2Sector ( 0x8AA8 ); //进入编程模式
WRITE_BZ_inDFLAH2Sector ( 0x8AA8 ); //进入编程模式
}
COPCTL = 0x01; //enable watchdog
ARMCOP = 0x00;
//相同会话不进行操作
//相同会话不进行操作
break;
case 0x83 :
case 0x03 :
//相同会话不进行操作
//相同会话不进行操作
if( ExtendedDiagnosticSession !=SessionType )
{
//重置扩展会话的定时器
//重置扩展会话的定时器
S3_Server_refresh = 1;
S3_ServerEN = 1;
S3_ServerCnt = 0;
SeedkeyValidFlag = 0;
// DiagLockFlag = NormalKeyLock;
//切换到扩展会话
//切换到扩展会话
SessionType = ExtendedDiagnosticSession;
}
DiagLockFlag = NormalKeyLock; //重新进入
DiagLockFlag = NormalKeyLock; //新进入
//10 03需要正反馈 10 83不需要正反馈
//10 03需要正反馈 10 83不需要正反馈
if ( UDS_ISO14229_Transfer[0] == 0x03 )
{
UDS_Service_Response ( 0x10, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
}
break;
default ://子功能不支持,返回12负反馈
default ://子功能不支持,返回12负反馈
if(FunorPhy == DIAG_ID_Rx_FUN )
return ;
NegRes.code = subFunctionNotSupported; //返回sub Function 不支持
NegRes.code = subFunctionNotSupported; //返回sub Function 不支持
UDS_Service_Response ( 0x10, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
}
}
/*void CalculateKey ( uint32_t Seed ) //根据seed计算得出key值 分别计算出Level1 和 Level4 的值
/*void CalculateKey ( uint32_t Seed ) //根据seed计算得出key值 分别计算出Level1 和 Level4 的值
{
uint8_t i;
uint8_t xorArray[4]={0x74,0xF7,0x15,0x17 };
......@@ -1206,7 +1206,7 @@ SeedkeyValidFlag = 1;
//安全访问
//全访问
void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
// uint16_t i;
......@@ -1219,28 +1219,28 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
uint16_t tempbuffer;
uint32_t Diag_Id = 0;
Diag_Id = A_TA_type;;
//不支持功能寻址
//不支持功能寻址
if ( Diag_Id == DIAG_ID_Rx_FUN )
return;
//供电电压异常,车速大于0,返回22负反馈
//供电电压异常,车速大于0,返回22负反馈
//不支持默认会话,返回7F负反馈
//不支持默认会话,返回7F负反馈
if ( SessionType == DefaultSession )
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
S3_ServerCnt = 0;
//获取数据长度
//获取数据长度
Service27DiagDataLength = A_Length;
//获取数据
//取数据
(void) memcpy(UDS_ISO14229_Transfer,A_Data,Service27DiagDataLength);
//不支持除27 01和27 02以外的子服务,返回12负反馈
//不支持除27 01和27 02以外的子服务,返回12负反馈
if ( ( UDS_ISO14229_Transfer[0] != 0x01 ) && ( UDS_ISO14229_Transfer[0] != 0x02 ) && ( UDS_ISO14229_Transfer[0] != 0x05 ) && ( UDS_ISO14229_Transfer[0] != 0x06 ))
{
NegRes.code = subFunctionNotSupported;
......@@ -1248,7 +1248,7 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}
//不支持除27 01和27 02以外的子服务,返回12负反馈
//不支持除27 01和27 02以外的子服务,返回12负反馈
if ( (( UDS_ISO14229_Transfer[0] == 0x01 ) || ( UDS_ISO14229_Transfer[0] == 0x02 )) && (SessionType != ExtendedDiagnosticSession))
{
NegRes.code = subfunctionNotSupportinActiveSession;
......@@ -1263,28 +1263,28 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}
//判断子服务类型
//判断子服务类型
switch ( UDS_ISO14229_Transfer[0] )
{
case 0x01:
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service27DiagDataLength != 1 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//判断等待10s是否完成
//判断等待10s是否完成
if(Wait10sFlag==1)
{ //超过最大尝试次数3次,或者连续4次发送请求种子而没有发送正确的秘钥 需要等待10秒 才可以进行一次尝试
NegRes.code=requiredTimeDelayNotExpired;//延时10秒时间未达到
{ //超过最大尝试次数3次,或者连续4次发送请求种子而没有发送正确的秘钥 需要等待10秒 才可以进行一次尝试
NegRes.code=requiredTimeDelayNotExpired;//延时10秒时间未达到
UDS_Service_Response(0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
return;
}
//请求标志位置1
//请求标志位置1
Services27_01_Requested = 1;
//如果安全服务已解锁则不发送种子
//如果安全服务已解锁则不发送种子
if ( DiagLockFlag == Level1UnLock|| DiagLockFlag == Level2UnLock )
{
UDS_ISO14229_Transfer[0] = 0x01;
......@@ -1295,20 +1295,20 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
else
{
//请求次数+1
//将27服务状态写入flash
//错误密钥达到最大次数,返回36负反馈
if ( diag27.RequestSeedCnt > 2 ) //错误超过二次,需要等待10秒
//请求次数+1
//将27服务状态写入flash
//错误密钥达到最大次数,返回36负反馈
if ( diag27.RequestSeedCnt > 2 ) //错误超过二次,需要等待10秒
{
//将请求标志位清空
//将请求标志位清空
Services27_01_Requested = 0;
Wait10sFlag = 1; //10秒计时器打开
wait10cnt = 0; //10秒计时器重置
NegRes.code = requiredTimeDelayNotExpired; //最大次数
Wait10sFlag = 1; //10计时器打开
wait10cnt = 0; //10计时器重置
NegRes.code = requiredTimeDelayNotExpired; //最大次数
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//如果当前种子无效,则生成一个种子
//如果当前种子无效,则生成一个种子
if ( SeedkeyValidFlag == 0 )
{
tempbuffer = ( uint16_t ) ( RANDOM );
......@@ -1324,79 +1324,79 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[4] = 0x71 + SeedHigh; //S4
(void) memcpy(DigKeyValue.Msg, UDS_ISO14229_Transfer+1,4);
//根据种子计算密钥,为解锁做准备
//根据种子计算密钥,为解锁做准备
CalculateKey ( DigKeyValue.Value,MASK1_Safe );
}
UDS_Service_Response ( 0x27, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
break;
case 0x02:
//数据长度不对,返回13负反馈
//数据长度不对,返回13负反馈
if ( Service27DiagDataLength != 5 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//请求序列错误,返回24负反馈
//请求序列错误,返回24负反馈
if ( Services27_01_Requested != 1 )
{
NegRes.code = requestSequenceError; //序列不对
NegRes.code = requestSequenceError; //列不对
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
(void) memcpy(DigKeyValue.Msg, UDS_ISO14229_Transfer+1,4);
//将请求标志位清空
//将请求标志位清空
Services27_01_Requested = 0;
if(DiagLockFlag == Level1UnLock){
if(DigKeyValue.Value == 0x00000000){
//清空level 1尝试次数
//清空level 1尝试次数
diag27.attemptcnt = 0;
//清空level 1请求种子次数
//清空level 1请求种子次数
diag27.RequestSeedCnt = 0;
UDS_Service_Response ( 0x27, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer );
}else{
//种子失效
//种子失效
SeedkeyValidFlag = 0;
//重新上锁
//重新上锁
DiagLockFlag = 0;
//level 1尝试次数+1
//level 1试次数+1
diag27.attemptcnt = diag27.RequestSeedCnt;
diag27.RequestSeedCnt++;
//将27服务状态写入flash
//将27服务状态写入flash
Write_27_DATA_TO_FLASH();
//尝试次数超过设定值,开启10s定时器尝试次数减1,返回36负反馈
//尝试次数超过设定值,开启10s定时器尝试次数减1,返回36负反馈
if ( diag27.attemptcnt >= 2 )
{
Wait10sFlag = 1; //10秒计时器打开
Wait10sFlag = 1; //10计时器打开
wait10cnt = 0;
NegRes.code = exceedNumberOfAttempts; //最大次数
NegRes.code = exceedNumberOfAttempts; //最大次数
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//无效密钥,返回35负反馈
//无效密钥,返回35负反馈
NegRes.code = invalidKey;
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
}
}else{
//如果种子有效并且获取的密钥和计算的一致则解锁安全模式
//如果种子有效并且获取的密钥和计算的一致则解锁安全模式
// if ( ( DigKeyValue.Value == ValidSeedKey1 ) && ( SeedkeyValidFlag == 1 ) )
if ( ( DigKeyValue.Value == ValidSeedKey1 ) && ( SeedkeyValidFlag == 1 ))
{
//安全服务解锁 0
//全服务解锁 0
DiagLockFlag = Level1UnLock;
//清空level 1尝试次数
//清空level 1尝试次数
diag27.attemptcnt = 0;
//清空level 1请求种子次数
//清空level 1请求种子次数
diag27.RequestSeedCnt = 0;
//SeedkeyValidFlag = 1;
UDS_ISO14229_Transfer[0] = 0x02;
UDS_Service_Response ( 0x27, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer );
//将27服务状态写入flash
//将27服务状态写入flash
Write_27_DATA_TO_FLASH();
}
else
......@@ -1407,31 +1407,31 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
#endif
//种子失效
//种子失效
SeedkeyValidFlag = 0;
//level 1尝试次数+1
//level 1试次数+1
diag27.attemptcnt = diag27.RequestSeedCnt;
diag27.RequestSeedCnt++;
//将27服务状态写入flash
//将27服务状态写入flash
Write_27_DATA_TO_FLASH();
//尝试次数超过设定值,开启10s定时器尝试次数减1,返回36负反馈
//尝试次数超过设定值,开启10s定时器尝试次数减1,返回36负反馈
if ( diag27.attemptcnt >= 2 )
{
Wait10sFlag = 1; //10秒计时器打开
Wait10sFlag = 1; //10计时器打开
wait10cnt = 0;
NegRes.code = exceedNumberOfAttempts; //最大次数
NegRes.code = exceedNumberOfAttempts; //最大次数
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//无效密钥,返回35负反馈
//无效密钥,返回35负反馈
NegRes.code = invalidKey;
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
}
break;
//子功能不支持,返回12负反馈
//子功能不支持,返回12负反馈
default:
NegRes.code = subFunctionNotSupported;
UDS_Service_Response ( 0x27, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
......@@ -1442,15 +1442,15 @@ void UDS_Service_27_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
extern uint8_t BLPWMDutyCycle;
extern uint8_t GUIIconDRLGStatus;
/*************************************************************************************
诊断服务执行步骤;
1、获取数据长度,判断数据长度是否有误
2、获取目标地址类型,判断功能寻址和物理寻址
3、根据长度获取数据。判断数据是否符合要求
4、根据数据判断子服务是否符合要求
诊断服务执行步骤;
1、获取数据长度,判断数据长度是否有误
2、获取目标地址类型,判断功能寻址和物理寻址
3、根据长度获取数据。判断数据是否符合要求
4、根据数据判断子服务是否符合要求
***************************************************************************************/
extern INT32U BD83790A;
//DID读取服务
//DID取服务
void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
uint16_t i;
......@@ -1468,14 +1468,14 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
S3_ServerCnt = 0;
Service22DiagDataLength = A_Length;
//数据长度异常,发挥13负反馈
//数据长度异常,发挥13负反馈
if ( Service22DiagDataLength != 2 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x22, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回22负反馈
//供电电压异常,车速大于0,返回22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
......@@ -1485,7 +1485,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
NegRes.code = 0;
//获取数据
//取数据
for ( i = 0; i < Service22DiagDataLength; i++ )
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
......@@ -1525,7 +1525,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 14, UDS_ISO14229_Transfer );
break;
case 0xF1A0:
// memset(UDS_ISO14229_Transfer+2,0x20,16); //Ĭ��ֵ�ո�
// memset(UDS_ISO14229_Transfer+2,0x20,16); //???????
UDS_ISO14229_Transfer[ 2] = 'S';
UDS_ISO14229_Transfer[ 3] = 'W';
UDS_ISO14229_Transfer[ 4] = ':';
......@@ -1539,7 +1539,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 12, UDS_ISO14229_Transfer );
break;
case 0xF191:
//memcpy(UDS_ISO14229_Transfer+2,diag.F191,sizeof(diag.F191)); //Ĭ��ֵ�ո�
//memcpy(UDS_ISO14229_Transfer+2,diag.F191,sizeof(diag.F191)); //???????
UDS_ISO14229_Transfer[ 2] = 'H';
UDS_ISO14229_Transfer[ 3] = 'W';
UDS_ISO14229_Transfer[ 4] = ':';
......@@ -1578,24 +1578,24 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[11] = 28;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 12, UDS_ISO14229_Transfer );
break;
//����ˢд���ں��豸����Ϣ
//?????д??????豸?????
case 0xF184:
//memcpy(UDS_ISO14229_Transfer+2,NVMConfigF184.Data,sizeof(NVMConfigF184.Data));
memcpy(UDS_ISO14229_Transfer+2,DiagBootData.D_F184,sizeof(DiagBootData.D_F184));
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 9, UDS_ISO14229_Transfer );
break;
//��������ʶ����Ϣ
//??????????????
case 0xF183:
memcpy(UDS_ISO14229_Transfer+2,DiagBootData.D_F183,sizeof(DiagBootData.D_F183)); //Ĭ��ֵ�ո�
memcpy(UDS_ISO14229_Transfer+2,DiagBootData.D_F183,sizeof(DiagBootData.D_F183)); //???????
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 12, UDS_ISO14229_Transfer );
break;
//����������Ϣ
//???????????
case 0x3200:
memcpy(UDS_ISO14229_Transfer+2,Diag2eData.D_3200,sizeof(Diag2eData.D_3200));
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 18, UDS_ISO14229_Transfer );
break;
//�����
//?????
case 0x3201:
Value = NVM_ODO_VALUE * 10;
UDS_ISO14229_Transfer[ 2] = Value >> 16;
......@@ -1603,7 +1603,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[ 4] = Value;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
break;
//�����
//С?????
case 0x3202:
Value = DATA_TRIPA * 10;
UDS_ISO14229_Transfer[ 2] = Value >> 16;
......@@ -1611,7 +1611,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[ 4] = Value;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
break;
//�ƶ�Һλ��
//????λ??
case 0x3203:
if(TelltaleLCDFlag.Sig.LCD23 == 0)
{
......@@ -1624,7 +1624,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[ 2] = Value;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
break;
//���ݰ�ȫ��״̬
//??????????
case 0x3204:
if(LINE_IN_SEATBELT_SIGNAL == 1) {
Value = 0;
......@@ -1634,12 +1634,12 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[ 2] = Value;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
break;
//��̱�������
//??????????
case 0x3205:
UDS_ISO14229_Transfer[ 2] = 1;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
break;
//��������״̬
//??????????
case 0x3206:
if(TelltaleLCDFlag.Sig.LCD06 == 1) {
Value = 0;
......@@ -1649,7 +1649,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[ 2] = Value;
UDS_Service_Response ( 0x22, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
break;
//����Һλ��
//?????λ??
case 0x3207:
if(BD83790A & BD8379_D9)
{
......@@ -1663,7 +1663,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
default:
if(Diag_Id == DIAG_ID_Rx_FUN )
return ;
NegRes.code = requestOutOfRange; //返回31负反馈
NegRes.code = requestOutOfRange; //返回31负反馈
UDS_Service_Response ( 0x22, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
......@@ -1674,7 +1674,7 @@ void UDS_Service_22_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
//通讯控制
//通讯控制
void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
uint16_t i;
......@@ -1682,7 +1682,7 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
uint32_t FunorPhy;
FunorPhy = A_TA_type;
S3_ServerCnt = 0;
//只支持扩展会话,返回7F负反馈
//只支持扩展会话,返回7F负反馈
if ( SessionType != ExtendedDiagnosticSession )
{
if(FunorPhy == DIAG_ID_Rx_FUN )
......@@ -1693,22 +1693,22 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
Service28DiagDataLength = A_Length;
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service28DiagDataLength != 2 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x28, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回会22负反馈
//供电电压异常,车速大于0,返回会22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
UDS_Service_Response ( 0x10, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}*/
//获取数据
for ( i = 0; i < Service28DiagDataLength; i++ ) //长度不固定 要收数据
//取数据
for ( i = 0; i < Service28DiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
......@@ -1716,31 +1716,31 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
switch(UDS_ISO14229_Transfer[0])
{
//使能收发
//使能收发
case 0x80:
case enableRxAndTx:
// CommunicationType=UDS_ISO14229_Transfer[0];
// ControlType=enableRxAndTx;
//发动机运行,返回22负反馈
//发动机运行,返回22负反馈
/* if ( EngineSpeed >= 400 )
{
NegRes.code = conditionsNotCorrect;
UDS_Service_Response ( 0x28, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
} */
//所有应用报文
//所有应用报文
if( 1 == UDS_ISO14229_Transfer[1])
{
Com_RxStart();
Com_TxStart();
}
//所有网络管理报文
//所有网络管理报文
else if (2 == UDS_ISO14229_Transfer[1])
{
CANNetRxOFF = 0;
CANNetTxOFF = 0;
}
//所有应用报文和所有网络管理报文
//所有应用报文和所有网络管理报文
else if( 3 == UDS_ISO14229_Transfer[1] )
{
Com_RxStart();
......@@ -1748,7 +1748,7 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
CANNetRxOFF = 0;
CANNetTxOFF = 0;
}
//请求超出范围,返回31负反馈
//请求超出范围,返回31负反馈
else
{
// if(FunorPhy == DIAG_ID_Rx_FUN )
......@@ -1762,25 +1762,25 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response(0x28, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer);
break;
//禁止收发
//禁止收发
case 0x83:
case disableRxAndTx:
//CommunicationType=UDS_ISO14229_Transfer[0];
//ControlType=disableRxAndEnableTx;
//所有应用报文
//所有应用报文
if( 1 == UDS_ISO14229_Transfer[1])
{
Com_TxStop();
Com_RxStop();
}
//所有网络管理报文
//所有网络管理报文
else if (2 == UDS_ISO14229_Transfer[1])
{
CANNetRxOFF = 1;
CANNetTxOFF = 1;
}
//所有应用报文和所有网络管理报文
//所有应用报文和所有网络管理报文
else if( 3 == UDS_ISO14229_Transfer[1] )
{
Com_TxStop();
......@@ -1788,7 +1788,7 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
CANNetRxOFF = 1;
CANNetTxOFF = 1;
}
//请求超出范围,返回31负反馈
//请求超出范围,返回31负反馈
else
{
......@@ -1802,7 +1802,7 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response(0x28, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer);
break;
//子功能不支持,返回12负反馈
//子功能不支持,返回12负反馈
default:
if(FunorPhy == DIAG_ID_Rx_FUN )
return ;
......@@ -1813,7 +1813,7 @@ void UDS_Service_28_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
//DTC记录控制
//DTC录控制
void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
uint16_t i;
......@@ -1822,7 +1822,7 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
FunorPhy = A_TA_type;
S3_ServerCnt = 0;
//只支持扩展会话,返回7F负反馈
//只支持扩展会话,返回7F负反馈
if ( SessionType == DefaultSession )
{
if(FunorPhy == DIAG_ID_Rx_FUN )
......@@ -1831,9 +1831,9 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x85, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//获取数据长度
//获取数据长度
Service85DiagDataLength = A_Length;
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service85DiagDataLength != 1 )
{
NegRes.code = incorrectMessageLength;
......@@ -1841,7 +1841,7 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}
//供电电压异常,车速大于0,返回会22负反馈
//供电电压异常,车速大于0,返回会22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
......@@ -1849,14 +1849,14 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}*/
//获取数据
for ( i = 0; i < Service85DiagDataLength; i++ ) //长度不固定 要收数据
//取数据
for ( i = 0; i < Service85DiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
//子服务判断
//子服务判断
switch ( UDS_ISO14229_Transfer[0] )
{ //01 01 开启DTC设置
{ //01 01 开启DTC设置
case 0x81:
case DTCSettingOn:
......@@ -1867,7 +1867,7 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x85, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer );
break;
//02 02 关闭DTC设置
//02 02 关闭DTC设置
case 0x82:
case DTCSettingOff:
DTCControlType = DTCSettingOff;
......@@ -1878,7 +1878,7 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
break;
default ://子功能不支持,返回12负反馈
default ://子功能不支持,返回12负反馈
if(FunorPhy == DIAG_ID_Rx_FUN )
return ;
NegRes.code = subFunctionNotSupported;
......@@ -1888,7 +1888,7 @@ void UDS_Service_85_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
//例程控制
//程控制
void UDS_Service_31_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
uint8_t Service31DiagDataLength;
......@@ -1900,10 +1900,10 @@ void UDS_Service_31_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
//uint32_t SectorAddress;
FunOrPhy = A_TA_type;
S3_ServerCnt = 0;
//只支持物理寻址
//只支持物理寻址
if ( DIAG_ID_Rx_FUN == FunOrPhy )
return;
//供电电压异常,车速大于0,返回22负反馈
//供电电压异常,车速大于0,返回22负反馈
//if ( EngineSpeed >= 400 )
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
......@@ -1911,150 +1911,64 @@ void UDS_Service_31_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}*/
//只能编程会话?返回7F负反馈
if ( SessionType != ProgrammingSession )
//只能编程会话?返回7F负反馈
if ( SessionType != ExtendedDiagnosticSession )
{
NegRes.code = serviceNotSupportedInActiveSession;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//安全访问被拒绝,返回33负反馈
if ( DiagLockFlag == BootKeyLock )
//安全访问被拒绝,返回33负反馈
if ( DiagLockFlag == NormalKeyLock )
{
NegRes.code = securityAccessDenied; //安全模式未解锁
NegRes.code = securityAccessDenied; //安全模式未解锁
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//获取数据长度
//获取数据长度
Service31DiagDataLength = A_Length;
//数据长度异常,返回13负反馈
if ( Service31DiagDataLength < 3 )
//数据长度异常,返回13负反馈
if ( Service31DiagDataLength != 3 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//获取数据
//取数据
for ( i = 0; i < Service31DiagDataLength; i++ )
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
if(UDS_ISO14229_Transfer[0] != 1)
{
NegRes.code = subFunctionNotSupported;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
RoutineID = ( ( uint16_t ) UDS_ISO14229_Transfer[1] << 8 ) | ( uint16_t ) UDS_ISO14229_Transfer[2];
switch ( RoutineID )
{
case MaintenanceReset:
switch(UDS_ISO14229_Transfer[0]){
case 0x01:
wdt_reset();
//NVM_USER_SETTINGS_SERVICE=5000;
//NVM_Data_Update(NVM_USER_SETTINGS);
UDS_ISO14229_Transfer[3] = RoutineCompletedSuccessfully;
UDS_Service_Response ( 0x31, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
break;
case 0x02:
break;
case 0x03:
break;
default://请求超出范围,返回31负反馈
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
}
break;
case CheckMemory:
switch(UDS_ISO14229_Transfer[0]){
case 0x01:
if(Service31DiagDataLength == 7){
checkSum = (((uint32_t)(UDS_ISO14229_Transfer[3])) << 24) | (((uint32_t)(UDS_ISO14229_Transfer[4])) << 16) | (((uint32_t)(UDS_ISO14229_Transfer[5])) << 8)| (((uint32_t)(UDS_ISO14229_Transfer[6])));
if(checkSum == 0xECF05989){
UDS_ISO14229_Transfer[3] = RoutineCompletedSuccessfully;
UDS_Service_Response ( 0x31, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
}else{
UDS_ISO14229_Transfer[3] = RoutineCompletedUnsuccessfully;
UDS_Service_Response ( 0x31, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
}
}else{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
}
break;
case 0x02:
break;
case 0x03:
break;
default://请求超出范围,返回31负反馈
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
}
break;
case CheckProgrammingPreconditions:
switch(UDS_ISO14229_Transfer[0]){
case 0x01:
UDS_ISO14229_Transfer[3] = RoutineCompletedSuccessfully;
//执行ECU自检函数 返回值 0x04成功 0x05失败 待添加
UDS_Service_Response ( 0x31, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
break;
case 0x02:
break;
case 0x03:
break;
default://请求超出范围,返回31负反馈
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
}
break;
case EraseMemory:
switch(UDS_ISO14229_Transfer[0]){
case 0x01:
WRITE_BZ_inDFLAH2Sector ( 0x3AA3 ); //进入编程模式
COPCTL = 0x01; //enable watchdog
ARMCOP = 0x00;
break;
case 0x02:
break;
case 0x03:
break;
default://请求超出范围,返回31负反馈
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
}
break;
case CheckProgrammingDependencies:
switch(UDS_ISO14229_Transfer[0]){
case 0x01:
UDS_ISO14229_Transfer[3] = RoutineCompletedSuccessfully;
UDS_Service_Response ( 0x31, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
break;
case 0x02:
break;
case 0x03:
break;
default://请求超出范围,返回31负反馈
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
}
break;
//子功能不支持,返回12负反馈
case MaintenanceReset: //功能预留
//wdt_reset();
//NVM_USER_SETTINGS_SERVICE=5000;
//NVM_Data_Update(NVM_USER_SETTINGS);
UDS_ISO14229_Transfer[3] = RoutineCompletedSuccessfully;
UDS_Service_Response ( 0x31, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
break;
default:
NegRes.code = subFunctionNotSupported;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
break;
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x31, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
break;
}
}
//请求下载服务
//求下载服务
void UDS_Service_34_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
uint16_t i;
......@@ -2068,16 +1982,16 @@ void UDS_Service_34_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if ( FunOrPhy == DIAG_ID_Rx_FUN )
return;
if ( SessionType != ProgrammingSession ) //只支持编程会话模式
if ( SessionType != ProgrammingSession ) //只支持编程会话模式
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
UDS_Service_Response ( 0x34, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
if ( DiagLockFlag == BootKeyLock )
{
NegRes.code = securityAccessDenied; //安全模式未解锁
NegRes.code = securityAccessDenied; //安全模式未解锁
UDS_Service_Response ( 0x34, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -2086,25 +2000,25 @@ void UDS_Service_34_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if ( Service34DiagDataLength != 10 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x34, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回会22负反馈
//供电电压异常,车速大于0,返回会22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
UDS_Service_Response ( 0x10, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}*/
for ( i = 0; i < Service34DiagDataLength; i++ ) //长度不固定 要收数据
for ( i = 0; i < Service34DiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
if ( ( UDS_ISO14229_Transfer[0] != 0 ) || ( UDS_ISO14229_Transfer[1] != 0x44 ) )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x34, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -2115,7 +2029,7 @@ void UDS_Service_34_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x34, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
}
//数据下载服务
//据下载服务
void UDS_Service_36_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
uint16_t i;
......@@ -2130,20 +2044,20 @@ void UDS_Service_36_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if ( FunOrPhy == DIAG_ID_Rx_FUN )
return;
if ( SessionType != ProgrammingSession ) //只支持编程会话模式
if ( SessionType != ProgrammingSession ) //只支持编程会话模式
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持 7F
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持 7F
UDS_Service_Response ( 0x36, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
if ( DiagLockFlag == BootKeyLock )
{
NegRes.code = securityAccessDenied; //安全模式未解锁 33
NegRes.code = securityAccessDenied; //安全模式未解锁 33
UDS_Service_Response ( 0x36, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回会22负反馈
//供电电压异常,车速大于0,返回会22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
......@@ -2152,7 +2066,7 @@ void UDS_Service_36_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}*/
Service36DiagDataLength = A_Length;
for ( i = 0; i < Service36DiagDataLength; i++ ) //取数据
for ( i = 0; i < Service36DiagDataLength; i++ ) //数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
......@@ -2161,7 +2075,7 @@ void UDS_Service_36_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if ( UDS_ISO14229_Transfer[0] != BlocKCnt )
{
NegRes.code = wrongBlockSequenceCounter; //请求序列错误 73
NegRes.code = wrongBlockSequenceCounter; //求序列错误 73
UDS_Service_Response ( 0x36, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -2176,7 +2090,7 @@ void UDS_Service_36_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x36, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer );
}
//请求下载服务
//求下载服务
void UDS_Service_37_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
// uint16_t i;
......@@ -2190,13 +2104,13 @@ void UDS_Service_37_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
S3_ServerCnt = 0;
if ( SessionType != ProgrammingSession ) //只支持编程会话模式
if ( SessionType != ProgrammingSession ) //只支持编程会话模式
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持 7F
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持 7F
UDS_Service_Response ( 0x37, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回会22负反馈
//供电电压异常,车速大于0,返回会22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
......@@ -2205,24 +2119,24 @@ void UDS_Service_37_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}*/
//if(RequestTransfer!=Download)
//{
// NegRes.code=requestSequenceError;//会话模式不支持
// NegRes.code=requestSequenceError;//会话模式不支持
// UDS_Service_Response(0x37, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
// return;
//}
//Service37DiagDataLength=A_Length;
//if(Service37DiagDataLength!=1)
//{
// NegRes.code=incorrectMessageLength;//数据长度不对
// NegRes.code=incorrectMessageLength;//数据长度不对
// UDS_Service_Response(0x37, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
// return;
//}
//for(i=0; i<Service37DiagDataLength; i++) //长度不固定 要收数据
//for(i=0; i<Service37DiagDataLength; i++) //长度不固定 要收数据
//{
// UDS_ISO14229_Transfer[i]=*(A_Data+i);
//}
//if(UDS_ISO14229_Transfer[0]!=00)
//{
// NegRes.code=subFunctionNotSupported;//数据长度不对
// NegRes.code=subFunctionNotSupported;//数据长度不对
// UDS_Service_Response(0x37, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
// return;
//}
......@@ -2238,23 +2152,23 @@ void UDS_Service_3E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
FunorPhy = A_TA_type;
Service3EDiagDataLength = A_Length;
S3_ServerCnt = 0;
//数据长度不对,返回13负反馈
//数据长度不对,返回13负反馈
if ( Service3EDiagDataLength != 1 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x3E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//获取子服务信息
for ( i = 0; i < Service3EDiagDataLength; i++ ) //长度不固定 要收数据
//获取子服务信息
for ( i = 0; i < Service3EDiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
//子服务不是00和80的,返回12负反馈不支持
//子服务不是00和80的,返回12负反馈不支持
if ( ( UDS_ISO14229_Transfer[0] != 0 ) && ( UDS_ISO14229_Transfer[0] != 0x80 ) )
//if ( UDS_ISO14229_Transfer[0] != 0 )
{
//吉利要求不响应
//吉利要求不响应
if(FunorPhy == DIAG_ID_Rx_FUN )
return ;
NegRes.code = subFunctionNotSupported;
......@@ -2263,7 +2177,7 @@ void UDS_Service_3E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
S3_Server_refresh = 1;
//3E 00有正反馈,3E 80没有正反馈
//3E 00有正反馈,3E 80没有正反馈
if ( UDS_ISO14229_Transfer[0] == 0x00 )
{
UDS_Service_Response ( 0x3E, POSITIVE_RSP, DIAG_ID_Tx, 1, UDS_ISO14229_Transfer );
......@@ -2279,39 +2193,39 @@ void UDS_Service_11_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
FunorPhy = A_TA_type;
S3_ServerCnt = 0;
Service11DiagDataLength = A_Length;
//供电电压异常,车速大于0,返回22负反馈
//供电电压异常,车速大于0,返回22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
UDS_Service_Response ( 0x11, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}*/
//不支持默认会话,返回7F负反馈
//不支持默认会话,返回7F负反馈
/*
if ( ( SessionType == DefaultSession ) )
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
UDS_Service_Response ( 0x11, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
*/
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service11DiagDataLength != 1 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x11, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//获取子功能
for ( i = 0; i < Service11DiagDataLength; i++ ) //长度不固定 要收数据
//获取子功能
for ( i = 0; i < Service11DiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
//1.6版本不用支持11 02和11 82服务
//1.6版本不用支持11 02和11 82服务
// if ( ( UDS_ISO14229_Transfer[0] == 0x01 ) || ( UDS_ISO14229_Transfer[0] == 0x03 ) || ( UDS_ISO14229_Transfer[0] == 0x81 ) || ( UDS_ISO14229_Transfer[0] == 0x83 ))
if(( UDS_ISO14229_Transfer[0] == 0x01 )|| ( UDS_ISO14229_Transfer[0] == 0x81 )) //仅支持01子功能
if(( UDS_ISO14229_Transfer[0] == 0x01 )|| ( UDS_ISO14229_Transfer[0] == 0x81 )) //仅支持01子功能
{
//将会话类型重置
//会话类型重置
SessionType = 1;
if( UDS_ISO14229_Transfer[0] == 0x01 ){
......@@ -2330,18 +2244,18 @@ void UDS_Service_11_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
// return;
}
else//子功能不支持,返回12负反馈
else//子功能不支持,返回12负反馈
{
if ( FunorPhy == DIAG_ID_Rx_FUN )
return;
NegRes.code = subFunctionNotSupported; //子功能不支持
NegRes.code = subFunctionNotSupported; //子功能不支持
UDS_Service_Response ( 0x11, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
}
//故障码存储列表
//故障码存储列表
const uint32_t DTC_CODE_TABLE[] =
{
......@@ -2354,7 +2268,7 @@ const uint32_t DTC_CODE_TABLE[] =
U010087,
};
//=================================================
//根据序号输出3个字节的DTC码
//根据序号输出3个字节的DTC码
//=================================================
void GJXHOUTDTCCODE ( INT8U xh )
{
......@@ -2368,7 +2282,7 @@ void GJXHOUTDTCCODE ( INT8U xh )
}
//============================================
//每次开ACC后初始化DTC STATUS
//每次开ACC后初始化DTC STATUS
//============================================
void INIT_DTC_STATUS_IGN_ON ( void )
{
......@@ -2388,7 +2302,7 @@ void INIT_DTC_STATUS_IGN_ON ( void )
DiagLockFlag = 0;
ContrlorResumeofIO = 0; //IO控制
ContrlorResumeofIO = 0; //IO控制
IO_Group_1 = 0;
......@@ -2407,11 +2321,11 @@ void INIT_DTC_STATUS_IGN_ON ( void )
CANNetTxOFF = 0;
//for ( i = 0; i < cnDTCslen; i++ )
// DTC_STATUS[i] = DTC_STATUS[i] | 0x50; //第4,6 BIT置1
// DTC_STATUS[i] = DTC_STATUS[i] | 0x50; //第4,6 BIT置1
}
//===========================================================
//修改DTC状态记录
//出口:DTCstatusCHGFF=1表示DTC记录有改变(需要存储到EEPROM中)
//修改DTC状态记录
//出口:DTCstatusCHGFF=1表示DTC记录有改变(需要存储到EEPROM中)
//===========================================================
void ChangeDTCs_ST_PRG ( INT8U pos, INT8U status )
......@@ -2472,14 +2386,14 @@ void ChangeDTCs_ST_PRG ( INT8U pos, INT8U status )
//========================================
//如果DTC记录有改变则存入EEPROM中 100ms
//如果DTC记录有改变则存入EEPROM中 100ms
//========================================
void SaveDTCsToEEPROM ( void )
{
uint8_t i;
if ( isNeedSaveDTC ) //DTC��¼�иı�?,YES
if ( isNeedSaveDTC ) //DTC????и???,YES
{
isNeedSaveDTC = 0;
......@@ -2494,7 +2408,7 @@ void SaveDTCsToEEPROM ( void )
//=========================================
//+++++++++100MS+++++++++++
//
//CAN进入NORMAL状态2S计时
//CAN进入NORMAL状态2S计时
//=========================================
void CAN_NORMAL_TIME_PRG ( void )
{
......@@ -2502,11 +2416,11 @@ void CAN_NORMAL_TIME_PRG ( void )
{
CAN_NORMAL_TT++;
if ( CAN_NORMAL_TT == 50 ) // 2S?,YES //ACC 6S
if ( CAN_NORMAL_TT == 50 ) // 2S?,YES //有ACC 6S
{
CAN_NORMAL_TT = 0;
CAN_NORMAL_2SFF = 1; // =1表示CAN进入NORMAL超过2S
CAN_NORMAL_2SFF = 1; // =1表示CAN进入NORMAL超过2S
}
}
}
......@@ -2535,7 +2449,7 @@ uint8_t getBusoffStatus(void)
{
if ( GetBusOffState_NotNM( ) )
{
setDTCEnableTimer(BusOffDTCEnableTimer);//busoff����¼�������ʱ��
setDTCEnableTimer(BusOffDTCEnableTimer);//busoff???????????????
}
return GetBusOffState_NotNM( );
}
......@@ -2596,7 +2510,7 @@ void setDTCEnableTimer(uint16_t Timer)
}
}
/*��ȡ30��״̬*/
/*???30????*/
uint8_t getPowerStatus(void)
{
uint8_t enResult = NormalVottage;
......@@ -2653,12 +2567,12 @@ uint8_t getPowerStatus(void)
}
//2ms����
//2ms????
void CanLoseDetected ( void )
{
if( CAN_DTC_OFF == 0 )
{
//��ѹ�ж�
//????ж?
if(getKL15Status())
{
......@@ -2847,35 +2761,35 @@ void UDS_Service_19_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
Service19DiagDataLength = A_Length;
__RESET_WATCHDOG();
S3_ServerCnt = 0;
//不支持编程会话,返回7F负反馈
//不支持编程会话,返回7F负反馈
if ( SessionType == ProgrammingSession )
{
NegRes.code = serviceNotSupportedInActiveSession;
UDS_Service_Response ( 0x19, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service19DiagDataLength < 1 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x19, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//获取数据
//取数据
for ( i = 0; i < Service19DiagDataLength; i++ )
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
//执行子服务
//执行子服务
switch ( UDS_ISO14229_Transfer[0] )
{
//通过状态掩码报告DTC的数
//通过状态掩码报告DTC的数
case 0x01:
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service19DiagDataLength != 2 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x19, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -2895,24 +2809,24 @@ void UDS_Service_19_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[4] = ( INT8U ) ( DTCnum & 0x00FF );
UDS_Service_Response ( 0x19, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
break;
//通过状态掩码报告DTC
//通过状态掩码报告DTC
case 0x02:
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service19DiagDataLength != 2 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x19, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
DTCSnapshotRecordNumber = UDS_ISO14229_Transfer[1];
DTCcnt = 2;
//返回DTC码(高位、中位、低位)和和DTC状态
//返回DTC码(高位、中位、低位)和和DTC状态
for ( i = 0; i < cnDTCslen; i++ )
{
if ( DiagDtc[ i ].Status.Flag & UDS_ISO14229_Transfer[1] )
{
GJXHOUTDTCCODE ( i ); //根据序号输出3个字节的DTC码
GJXHOUTDTCCODE ( i ); //根据序号输出3个字节的DTC码
UDS_ISO14229_Transfer[DTCcnt] = CJINF[0];
DTCcnt++;
UDS_ISO14229_Transfer[DTCcnt] = CJINF[1];
......@@ -2927,12 +2841,12 @@ void UDS_Service_19_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x19, POSITIVE_RSP, DIAG_ID_Tx, DTCcnt, UDS_ISO14229_Transfer );
break;
//报告支持的DTC */
//报告支持的DTC */
case 0x0A: //Only available if more than 1 DTC exist
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service19DiagDataLength != 1 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x19, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -2943,17 +2857,17 @@ void UDS_Service_19_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
else
{
NegRes.code = requestOutOfRange; //数据长度不对
NegRes.code = requestOutOfRange; //数据长度不对
UDS_Service_Response ( 0x19, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
*/
DTCcnt0A = 2;
//返回DTC码(高位、中位、低位)和和DTC状态
//返回DTC码(高位、中位、低位)和和DTC状态
for ( i = 0; i < cnDTCslen; i++ )
{
__RESET_WATCHDOG();
GJXHOUTDTCCODE ( i ); //根据序号输出3个字节的DTC码
GJXHOUTDTCCODE ( i ); //根据序号输出3个字节的DTC码
UDS_ISO14229_Transfer[DTCcnt0A] = CJINF[0];
DTCcnt0A++;
UDS_ISO14229_Transfer[DTCcnt0A] = CJINF[1];
......@@ -2966,7 +2880,7 @@ void UDS_Service_19_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_ISO14229_Transfer[1] = 0x09;
UDS_Service_Response ( 0x19, POSITIVE_RSP, DIAG_ID_Tx, DTCcnt0A, UDS_ISO14229_Transfer );
break;
//子功能不支持,返回12负反馈
//子功能不支持,返回12负反馈
default:
if(FunorPhy == DIAG_ID_Rx_FUN )
return ;
......@@ -2984,7 +2898,7 @@ void UDS_Service_19_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t *A_Data )
{
//每个写入之后 要写入到EEPROM
//每个写入之后 要写入到EEPROM
uint16_t i;
uint16_t DID;
uint8_t Service2EDiagDataLength;
......@@ -2995,21 +2909,21 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if ( DiagIDNum == DIAG_ID_Rx_FUN )
return;
if ( SessionType == DefaultSession ) //不支持默认会话
if ( SessionType == DefaultSession ) //不支持默认会话
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持 7F
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持 7F
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
for ( i = 0; i < Service2EDiagDataLength; i++ ) //长度不固定 要收数据
for ( i = 0; i < Service2EDiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
if ( Service2EDiagDataLength <= 2 )
{
NegRes.code = incorrectMessageLength; //数据长度不对 13
NegRes.code = incorrectMessageLength; //数据长度不对 13
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3018,20 +2932,20 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
switch ( DID ) //已经使用了2个数据长度,写入内容从[2]开始
switch ( DID ) //已经使用了2个数据长度,写入内容从[2]开始
{
case 0xF1A8:
if(DiagLockFlag!=Level1UnLock)
{
NegRes.code=securityAccessDenied;//未解锁 33
NegRes.code=securityAccessDenied;//解锁 33
UDS_Service_Response(0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
return;
}
if ( Service2EDiagDataLength != 20 + 2 )
{
NegRes.code = incorrectMessageLength; //数据长度不对 13
NegRes.code = incorrectMessageLength; //数据长度不对 13
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3047,7 +2961,7 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
else
{
NegRes.code = requestOutOfRange; //数据不正确 0x31 数据超出范围
NegRes.code = requestOutOfRange; //数据不正确 0x31 数据超出范围
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
......@@ -3058,14 +2972,14 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if(DiagLockFlag!=Level1UnLock)
{
NegRes.code=securityAccessDenied;//未解锁
NegRes.code=securityAccessDenied;//解锁
UDS_Service_Response(0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
return;
}
if ( Service2EDiagDataLength != 17 + 2 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3073,7 +2987,7 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
{
if((UDS_ISO14229_Transfer[i + 2] < 0x20) || (UDS_ISO14229_Transfer[i + 2] > 0x7F))
{
NegRes.code = requestOutOfRange; //���ݳ��Ȳ���
NegRes.code = requestOutOfRange; //??????????
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3088,14 +3002,14 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
if(DiagLockFlag!=Level1UnLock)
{
NegRes.code=securityAccessDenied;//未解锁 33
NegRes.code=securityAccessDenied;//解锁 33
UDS_Service_Response(0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
return;
}
if ( Service2EDiagDataLength != 16 + 2 )
{
NegRes.code = incorrectMessageLength; //数据长度不对 13
NegRes.code = incorrectMessageLength; //数据长度不对 13
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3106,14 +3020,14 @@ void UDS_Service_2E_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
case 0xF1FA:
if(DiagLockFlag!=Level1UnLock)
{
NegRes.code=securityAccessDenied;//��� 33
NegRes.code=securityAccessDenied;//δ???? 33
UDS_Service_Response(0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, (uint8_t*)(&NegRes.code));
return;
}
if ( Service2EDiagDataLength != 6 + 2 )
{
NegRes.code = incorrectMessageLength; //���ݳ��Ȳ��� 13
NegRes.code = incorrectMessageLength; //?????????? 13
UDS_Service_Response ( 0x2E, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3142,21 +3056,21 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
// uint32_t TempBuffer;
DiagIDNum = A_TA_type;
S3_ServerCnt = 0;
NegRes.code = serviceNotSupported; //功能不支持
NegRes.code = serviceNotSupported; //功能不支持
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
#ifndef TESTDIAG
//不支持功能寻址
//不支持功能寻址
if ( DiagIDNum == DIAG_ID_Rx_FUN )
return;
//只支持扩展会话模式,返回7F负反馈
//只支持扩展会话模式,返回7F负反馈
if ( SessionType != ExtendedDiagnosticSession )
{
NegRes.code = serviceNotSupportedInActiveSession;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//安全模式未解锁,返回33负反馈
//安全模式未解锁,返回33负反馈
if(DiagLockFlag!=Level1UnLock)
{
NegRes.code=securityAccessDenied;
......@@ -3164,14 +3078,14 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}
Service2FDiagDataLength = A_Length;
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength < 3 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//供电电压异常,车速大于0,返回22负反馈
//供电电压异常,车速大于0,返回22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
......@@ -3182,8 +3096,8 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
//获取数据
for ( i = 0; i < Service2FDiagDataLength; i++ ) //长度不固定 要收数据
//取数据
for ( i = 0; i < Service2FDiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
......@@ -3192,12 +3106,12 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
switch ( ControlDataIdentifier )
{
//蜂鸣器
//蜂鸣器
case 0x62E1:
//不再控制ECU
//再控制ECU
if ( UDS_ISO14229_Transfer[2] == 0x00 )
{
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength != 3 )
{
NegRes.code = incorrectMessageLength;
......@@ -3209,17 +3123,17 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
return;
}
//控制ECU
//控制ECU
else if ( UDS_ISO14229_Transfer[2] == 0x03 )
{
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength != 4 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//蜂鸣器使用雷达音-----响
//蜂鸣器使用雷达音-----响
if ( UDS_ISO14229_Transfer[3] == 0xFF )
{
BuzzerStatus = 1;
......@@ -3227,7 +3141,7 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
return;
}
//蜂鸣器使用雷达音-----不响
//蜂鸣器使用雷达音-----不响
else if ( UDS_ISO14229_Transfer[3] == 0x00 )
{
BuzzerStatus = 0;
......@@ -3236,7 +3150,7 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}
}
else //申请超出限制,返回31负反馈
else //申请超出限制,返回31负反馈
{
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
......@@ -3244,12 +3158,12 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
break;
//指针测试
//针测试
case 0x62E2:
//不再控制ECU
//再控制ECU
if ( UDS_ISO14229_Transfer[2] == 0x00 )
{
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength != 3 )
{
NegRes.code = incorrectMessageLength;
......@@ -3264,78 +3178,78 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
return;
}
//控制ECU
//控制ECU
else if( UDS_ISO14229_Transfer[2] == 0x03 )
{
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength != 5 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//车速表控制
//速表控制
if( UDS_ISO14229_Transfer[3] == 0x01 )
{
ContrlorResumeofVspeed = Contrl;
ContrlorResumeofIO = Contrl;
//零刻度
//刻度
if( UDS_ISO14229_Transfer[4] == 0x00 )
{
VspeedValNUM = 0;
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
return;
}
//半刻度
//刻度
else if( UDS_ISO14229_Transfer[4] == 0x01 )
{
VspeedValNUM = 700;
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
return;
}
//满刻度
//刻度
else if( UDS_ISO14229_Transfer[4] == 0x02 )
{
VspeedValNUM = 1400;
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
return;
}
else//申请超出限制,返回31负反馈
else//申请超出限制,返回31负反馈
{
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
}
//转速表控制
//转速表控制
else if(UDS_ISO14229_Transfer[3] == 0x02)
{
ContrlorResumeofEspeed = Contrl;
ContrlorResumeofIO = Contrl;
//零刻度
//刻度
if( UDS_ISO14229_Transfer[4] == 0x00 )
{
ESpeedValNUM = 0;
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
return;
}
//半刻度
//刻度
else if( UDS_ISO14229_Transfer[4] == 0x01 )
{
ESpeedValNUM = 1250;
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
return;
}
//满刻度
//刻度
else if( UDS_ISO14229_Transfer[4] == 0x02 )
{
ESpeedValNUM = 2500;
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 5, UDS_ISO14229_Transfer );
return;
}
else//申请超出限制,返回31负反馈
else//申请超出限制,返回31负反馈
{
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
......@@ -3356,12 +3270,12 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
return;
}
break;
//报警灯测试
//警灯测试
case 0x62E4:
//不再控制ECU
//再控制ECU
if ( UDS_ISO14229_Transfer[2] == 0x00 )
{
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength != 3 )
{
NegRes.code = incorrectMessageLength;
......@@ -3373,17 +3287,17 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 3, UDS_ISO14229_Transfer );
return;
}
//控制ECU
//控制ECU
else if ( UDS_ISO14229_Transfer[2] == 0x03 )
{
//长度异常,返回13负反馈
//长度异常,返回13负反馈
if ( Service2FDiagDataLength != 4 )
{
NegRes.code = incorrectMessageLength;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//关闭报警灯
//关闭报警灯
ContrlorResumeofLamp = Contrl;
ContrlorResumeofIO = Contrl;
......@@ -3402,7 +3316,7 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
return;
}
//开启报警灯
//开启报警灯
else if( UDS_ISO14229_Transfer[3] == 0xFF )
{
LampWarningStatus = Contrl;
......@@ -3417,7 +3331,7 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
UDS_Service_Response ( 0x2F, POSITIVE_RSP, DIAG_ID_Tx, 4, UDS_ISO14229_Transfer );
return;
}
else//申请超出限制,返回31负反馈
else//申请超出限制,返回31负反馈
{
NegRes.code = requestOutOfRange;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
......@@ -3425,7 +3339,7 @@ void UDS_Service_2F_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
}
}
break;
//DID不支持,返回12负反馈
//DID不支持,返回12负反馈
default:
NegRes.code = subFunctionNotSupported;
UDS_Service_Response ( 0x2F, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
......@@ -3442,35 +3356,35 @@ void UDS_Service_14_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
uint32_t ClearDTCGroup;
Service14DiagDataLength = A_Length;
S3_ServerCnt = 0;
//供电电压异常,车速大于0,返回22负反馈
//供电电压异常,车速大于0,返回22负反馈
/*if (( HIGH_VOLTAGE )||( LOW_VOLTAGE )||(DATA_VEHICLE_SPEED_DISPLAYING>0))
{
NegRes.code = conditionsNotCorrect;
UDS_Service_Response ( 0x14, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}*/
//数据长度异常,返回13负反馈
//数据长度异常,返回13负反馈
if ( Service14DiagDataLength != 3 )
{
NegRes.code = incorrectMessageLength; //数据长度不对
NegRes.code = incorrectMessageLength; //数据长度不对
UDS_Service_Response ( 0x14, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
//不支持编程会话,返回7E负反馈
//不支持编程会话,返回7E负反馈
/*if ( SessionType == ProgrammingSession )
{
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
NegRes.code = serviceNotSupportedInActiveSession; //会话模式不支持
UDS_Service_Response ( 0x14, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}*/
//获取数据
for ( i = 0; i < Service14DiagDataLength; i++ ) //长度不固定 要收数据
//取数据
for ( i = 0; i < Service14DiagDataLength; i++ ) //长度不固定 要收数据
{
UDS_ISO14229_Transfer[i] = * ( A_Data + i );
}
ClearDTCGroup = ( ( ( uint32_t ) UDS_ISO14229_Transfer[0] << 16 ) | ( ( uint32_t ) UDS_ISO14229_Transfer[1] << 8 ) | ( ( uint32_t ) UDS_ISO14229_Transfer[2] ) );
//如果接收的是14 FF FF FF,清除诊断信息
//如果接收的是14 FF FF FF,清除诊断信息
if ( ClearDTCGroup == 0xffffff )
{
//ClearAllDTC();
......@@ -3486,9 +3400,9 @@ void UDS_Service_14_Indication ( uint32_t A_TA_type, uint16_t A_Length, uint8_t
isNeedSaveDTC = 1;
SaveDTCsToEEPROM();
}
else//如果不是接收的不是14 FF FF FF,返回31负反馈
else//如果不是接收的不是14 FF FF FF,返回31负反馈
{
NegRes.code = requestOutOfRange; //子功能不支持
NegRes.code = requestOutOfRange; //子功能不支持
UDS_Service_Response ( 0x14, NEGATIVE_RSP, DIAG_ID_Tx, 1, ( uint8_t * ) ( &NegRes.code ) );
return;
}
......@@ -3504,12 +3418,12 @@ void HandleOf2FServices ( void ) //lgh
ContrlorResumeofIOLast = Resume;
ContrlorResumeofIO = 0;
ContrlorResumeofSOC = 0; //soc控制
ContrlorResumeofSOC = 0; //soc控制
SocSeg = 0; //Soc
ContrlorResumeofEspeed = 0; //转速控制
ESpeedValNUM = 0; //转速
ContrlorResumeofVspeed = 0; //车速控制
VspeedValNUM = 0; //车速
ContrlorResumeofEspeed = 0; //转速控制
ESpeedValNUM = 0; //
ContrlorResumeofVspeed = 0; //速控制
VspeedValNUM = 0; //车速
ContrlorResumeofLamp = 0;
//ISD_Stop_Loop();
IO_Group_1 = 0;
......
......@@ -29,8 +29,8 @@ extern void Data_Fuel_Consumption_Count_ISR(void);
void WDT_Init(void)
{
//配置看门狗
wdt_reset();
COPCTL = WDT_PERIOD; //配置看门狗定时周期
//wdt_reset();
//COPCTL = WDT_PERIOD; //配置看门狗定时周期
// PLLCTL_PCE = 1; //看门狗在Pseudo Stop模式下持续运行
}
......
......@@ -77,22 +77,22 @@ NV_AUTO_ID=1
[Recent HI-WAVE FindProcedure Search]
Search0=CoCAN_Init_Mode_Tx_ISR
Search1=Popups_Management_Service
Search2=Analog_Signal_Conversion_Service
Search3=IO_Management_Service
Search4=Drive_Info_Display_Update_Service
Search5=Startup_Animation_Play_Service
Search6=GUI_ADAS_Display
Search7=Power_Management_Service
Search8=BL_Management_Service
Search9=IGN_OFF_State_Keep
Search10=Telltales_Management
Search11=UDS_Service_27_Indication
Search12=Popups_Polling
Search13=Power_IGN_On_Init
Search14=DoCAN_Get_N_PDU
Search15=DoCAN_Receive_And_Assemble_N_USData
Search0=UDS_Service_31_Indication
Search1=CoCAN_Init_Mode_Tx_ISR
Search2=Popups_Management_Service
Search3=Analog_Signal_Conversion_Service
Search4=IO_Management_Service
Search5=Drive_Info_Display_Update_Service
Search6=Startup_Animation_Play_Service
Search7=GUI_ADAS_Display
Search8=Power_Management_Service
Search9=BL_Management_Service
Search10=IGN_OFF_State_Keep
Search11=Telltales_Management
Search12=UDS_Service_27_Indication
Search13=Popups_Polling
Search14=Power_IGN_On_Init
Search15=DoCAN_Get_N_PDU
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Data:1 < ADDXPR ONLY_ADD_IF_NEW "FuelResistanceV"
Data:1 < ADDXPR ONLY_ADD_IF_NEW "hyqhyq"
Data:1 < ADDXPR ONLY_ADD_IF_NEW "AnalogFuelSensorRes"
Data:1 < ADDXPR ONLY_ADD_IF_NEW "NVMConfig3300.Sig.S10 "
Data:1 < ADDXPR ONLY_ADD_IF_NEW "NVMConfig3300.Sig.S1 "
Data:1 < ADDXPR ONLY_ADD_IF_NEW "NVMConfig3300.Sig.S26 "
Data:1 < ADDXPR ONLY_ADD_IF_NEW "NVMConfig3300.Sig.S25 "
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment