上一节中,我已经使用RA8D1实现了基于CANFD的DBC协议解析,解释了整车厂的dbc文件。本节来点高端的干货,使用RA8D1实现UDS诊断协议。

终于拿到CANoe了,10多万的仪器,奢侈一下下!!!!!

上面是UDS的常用服务
1。常用的10服务,诊断会话DiagnosticSessionControl (0x10)服务


这里我试用周立功的ZCAN上位机来进行测试验证

代码如下:
void service_10_SessionControl(const uint8_t* msg_buf, uint16_t msg_dlc)
{
uint8_t subfunction = 0;
uint8_t rsp_buf[8];
subfunction = UDS_GET_SUB_FUNCTION(msg_buf[1]);
rsp_buf[0] = USD_GET_POSITIVE_RSP(SID_10);
rsp_buf[1] = subfunction;
rsp_buf[2] = (uint8_t)(P2_SERVER >> 8);
rsp_buf[3] = (uint8_t)(P2_SERVER & 0x00ff);
rsp_buf[4] = (uint8_t)(P2X_SERVER >> 8);
rsp_buf[5] = (uint8_t)(P2X_SERVER & 0x00ff);
switch (subfunction)
{
case UDS_SESSION_STD:
set_current_session((uds_session_t)subfunction);
set_current_sa_lv(UDS_SA_NON);
uds_positive_rsp(rsp_buf, 6);
break;
case UDS_SESSION_PROG:
set_current_session((uds_session_t)subfunction);
set_current_sa_lv(UDS_SA_NON);
uds_positive_rsp(rsp_buf, 6);
uds_timer_start(UDS_TIMER_S3server);
break;
case UDS_SESSION_EXT:
set_current_session((uds_session_t)subfunction);
set_current_sa_lv(UDS_SA_NON);
uds_positive_rsp(rsp_buf, 6);
uds_timer_start(UDS_TIMER_S3server);
break;
default:
uds_negative_rsp(SID_10, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}
2。清除诊断DTC故障代码 ClearDiagnosticInformation (0x14)
也称为14服务

用周立功测试验证

代码如下:
void service_14_ClearDiagnosticInformation(const uint8_t* msg_buf, uint16_t msg_dlc)
{
uint8_t rsp_buf[8];
uint32_t dtc_group = 0;
dtc_group = 0;
dtc_group |= ((uint32_t)msg_buf[1]) << 16;
dtc_group |= ((uint32_t)msg_buf[2]) << 8;
dtc_group |= ((uint32_t)msg_buf[3]) << 0;
if (dtc_group == UDS_DTC_GROUP_ALL)
{
rsp_buf[0] = USD_GET_POSITIVE_RSP(SID_14);
uds_positive_rsp(rsp_buf, 1);
}
else
{
uds_negative_rsp(SID_14, NRC_REQUEST_OUT_OF_RANGE);
}
}
3。通信控制服务28服务
CommunicationControl (0x28)服务

用周立功测试

代码如下:
void service_28_CommunicationControl(const uint8_t* msg_buf, uint16_t msg_dlc)
{
uint8_t subfunction;
uint8_t rsp_buf[8];
uint8_t cc_type;
subfunction = UDS_GET_SUB_FUNCTION(msg_buf[1]);
cc_type = msg_buf[2];
switch (subfunction)
{
case UDS_CC_MODE_RX_TX:
if (cc_type == UDS_CC_TYPE_NORMAL || cc_type == UDS_CC_TYPE_NM || cc_type == UDS_CC_TYPE_NM_NOR)
{
dis_normal_xmit = FALSE;
dis_normal_recv = FALSE;
rsp_buf[0] = USD_GET_POSITIVE_RSP(SID_28);
rsp_buf[1] = subfunction;
uds_positive_rsp(rsp_buf, 2);
}
else
{
uds_negative_rsp(SID_28, NRC_REQUEST_OUT_OF_RANGE);
}
break;
case UDS_CC_MODE_NO_NO:
if (cc_type == UDS_CC_TYPE_NORMAL || cc_type == UDS_CC_TYPE_NM || cc_type == UDS_CC_TYPE_NM_NOR)
{
dis_normal_xmit = TRUE;
dis_normal_recv = TRUE;
rsp_buf[0] = USD_GET_POSITIVE_RSP(SID_28);
rsp_buf[1] = subfunction;
uds_positive_rsp(rsp_buf, 2);
}
else
{
uds_negative_rsp(SID_28, NRC_REQUEST_OUT_OF_RANGE);
}
break;
default:
uds_negative_rsp(SID_28, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}
UDS服务有26条,今天讲不完,先讲这三种,后面继续讲完