前言
本章基于DaVinCi禁止功能寻址的办法。DaVinCi默认支持功能寻址,因此需要特殊处理。
一、功能寻址是什么?
诊断报文的CAN identifier分为物理寻址和功能寻址。前者针对整车上一个ECU会指定一个物理寻址ID。
例如物理寻址ID为0x716,功能寻址ID为0x7DF(均由整车厂定义)
物理寻址:通过诊断仪发送物理寻址0x716的报文时,只有被指定的某个ECU可以接收到这个报文,类似单播模式。
功能寻址:通过诊断仪发送物理寻址0x7DF的报文时,整车上所有ECU均能收到这个报文,功能类似广播方式。
二、步骤
1.使能制造商函数接口
1)使能函数
2)申明函数名
3)将Service port 连接到诊断模块,保持打开DaVinci Dev。
4)打开DaVinci Dev, 检查是否port生成了
5)DaVinci configurator 编译并生成代码
到此配置已结束。
2.分析函数并填充代码
下图为该函数的函数指针
形参分析:
sid: 诊断服务ID (如0x10,会话控制服务)
reqData: 诊断报文SID后面的数据(指针类型)
reqDataLen: 报文中除SID之外的数据长度(Byte)
reqType: 诊断请求类型,0 - 物理寻址, 1- 功能寻址
srcAddr: 测试地址(指针类型,没使用过)
nrc: 要返回的NRC码(指针类型)
代码如下(示例):
FUNC(Std_ReturnType, AppDiag_CODE) ServiceRequestManufacturerNotification_DcmDslServiceRequestManufacturerNotification_Indication(uint8 SID, P2CONST(uint8, AUTOMATIC, RTE_APPDIAG_APPL_DATA) RequestData, uint16 DataSize, uint8 ReqType, uint16 SourceAddress, P2VAR(Dcm_NegativeResponseCodeType, AUTOMATIC, RTE_APPDIAG_APPL_VAR) ErrorCode) /* PRQA S 0850 */ /* MD_MSR_19.8 */
{
Std_ReturnType returnVal = RTE_E_OK;
if( ReqType == 1u)
{
/* Functional Request */
switch(SID)
{
case 0x27: /* SecurityAccess */
returnVal = RTE_E_ServiceRequestNotification_E_REQUEST_NOT_ACCEPTED;
break;
case 0x2E: /* WriteDataById */
returnVal = RTE_E_ServiceRequestNotification_E_REQUEST_NOT_ACCEPTED;
break;
case 0x2F: /* IoControlById */
returnVal = RTE_E_ServiceRequestNotification_E_REQUEST_NOT_ACCEPTED;
break;
case 0x31: /* RoutineControl */
returnVal = RTE_E_ServiceRequestNotification_E_REQUEST_NOT_ACCEPTED;
break;
default:
break;
}
}
return returnVal;
}
总结
当你发送任何诊断报文,都会先进入这个函数里执行,类似于可以扼杀一切的一个闸门。
例如:你以功能寻址的方式发送 27 01请求seed,这时会先调用这个函数,然后返回RTE_E_ServiceRequestNotification_E_REQUEST_NOT_ACCEPTED。
ECU不会做任何响应,即实现了禁止功能寻址。