#include "lin_cfg.h" #include "diagnostic_service_slave.h" #include "diagnostic_DID.h" #include "DMK-BC316-77.h" //extern byte LED_value; const unsigned long serial_number = SERIAL_NUBER_INT; /* for read & write serial_number services */ const unsigned char io_control_status = IO_CONTROL_STATUS_INT; /* for read & set io */ const unsigned int session_control_P3 = SESSION_CONTROL_P3; /* for session control service */ const unsigned int session_control_P3Ex = SESSION_CONTROL_P3Ex; /* for session control service */ const unsigned char DtcStatusByte = DTCSTATUSBTYE_INT ; /* for fault memory */ const unsigned char DtcFormatIdentifier = DTCFORMATIDENTIFER_INT; /* for fault memory */ const unsigned char CountDtc = COUNTDTC_INT; /* for fault memory */ const TYPE_DIAGSERVICEARR DiagServiceCheckArr[DEF_DIAGSERVICE_COUNT]={ {DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER,&diagsrv_read_data_by_identifier},//22 {DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER,&diagsrv_write_data_by_identifier},//2E {DIAGSRV_SESSION_CONTROL_ORDER,&diagsrv_session_control},//10 {DIAGSRV_TESTERPRESENT_ORDER,&diagsrv_tester_present},//3E {DIAGSRV_ECURESET_ORDER,&diagsrv_ECU_reset},//00 {DIAGSRV_COMMUNICATIONCONTROL_ORDER,&diagsrv_communication_control},//28 {DIAGSRV_ROUTINECONTROL_ORDER,&diagsrv_routine_control},//31 {DIAGSRV_ASSIGN_FRAME_ID_RANGE_ORDER,&diagsrv_B7},//B7 }; /**/ volatile l_u8 master_req_dat[MASTER_REQ_LENGTH_MAX]; volatile l_u16 master_req_length; volatile l_u8 slave_resp_dat[MASTER_REQ_LENGTH_MAX]; volatile l_u16 slave_resp_length; l_u8 resetflag=0; void diagsrv_routine_control(void) { ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat); if(master_req_length != 4) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x13;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { if(master_req_dat[1] == 0x01) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x31;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x12;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } } /*clear diagnostic flag */ diag_clear_flag(DIAGSRV_ROUTINECONTROL_ORDER); } void diagsrv_communication_control(void) { ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat); if(master_req_length != 3) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x13;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { if((master_req_dat[1]&0x7f) == 0x00 || (master_req_dat[1]&0x7f) == 0x01) { slave_resp_length = 3; slave_resp_dat[0] = master_req_dat[0] + 0x40; slave_resp_dat[1] = master_req_dat[1]; slave_resp_dat[2] = master_req_dat[2]; /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x31;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } } /*clear diagnostic flag */ diag_clear_flag(DIAGSRV_COMMUNICATIONCONTROL_ORDER); } void diagsrv_ECU_reset(void) { ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat); if(master_req_length != 2) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x13;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { if(master_req_dat[1] == 0x01) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x22;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x31;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } } /*clear diagnostic flag */ diag_clear_flag(DIAGSRV_ECURESET_ORDER); } void diagsrv_tester_present(void) { ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat); if(master_req_length != 2) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x13;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else { if(master_req_dat[1] == 0x00) { slave_resp_length = 2; slave_resp_dat[0] = master_req_dat[0] + 0x40; slave_resp_dat[1] = master_req_dat[1]; /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } else if(master_req_dat[1] == 0x80) { ;//0x80无响应 } else { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x31;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); } } /*clear diagnostic flag */ diag_clear_flag(DIAGSRV_TESTERPRESENT_ORDER); } void diagsrv_read_data_by_identifier(void) { /* Implement code of this service here */ unsigned char i; unsigned int DID_id; ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat); DID_id = master_req_dat[1]; DID_id <<= 8; DID_id |= master_req_dat[2]; if(master_req_length != 3) { slave_resp_length = 3; slave_resp_dat[0] = 0x7F; slave_resp_dat[1] = master_req_dat[0]; slave_resp_dat[2] = 0x13;//否定响应码 /* send a message to master */ ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat); diag_clear_flag(DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER); return; } for(i=0;i10) SoftwareRest(); } else { resetcnt=0; } }