简介
UDS (Unified Diagnostic Services,统一的诊断服务)诊断协议是ISO 15765和ISO 14229定义的一种汽车通用诊断协议,位于OSI模型中的应用层,它可在不同的汽车总线(例如CAN, LINFlexray, Internet)上实现。UDS协议的应用层定义是ISO 14229-1,目前大部分汽车厂商均采用UDS on CAN的诊断协议。
协议的目的是建立统一的诊断服务:多种网络,统—诊断
可类比同样处于应用层的http协议,UDS的本质是一系列的服务,通过「请求」和「响应」的形式,对ECU进行测试、检测、诊断等功能。UDS诊断位于应用层,意味着只用关注数据场的部分,而提供差错控制等功能的部分不用关注。
UDS网络层/TP层(ISO 15765-2)的解读
网络层概述
UDS网络层,又称为TP层(Transport Protocol Layer),本文默认描述的是uds on can。其存在的主要目的是为了解决ISO 11898协议中定义的经典CAN数据链路层与ISO 14229协议中定义的应用层,彼此之间数据长度不统一的问题。说的专业一点,主要解决数据链路层和应用层之间的数据长度不统一的问题。如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题。ISO 15765-2 协议由此诞生。
15765-2作为车辆诊断通信的一个组成部分,规范了“传输协议和网络层服务”。
所有的网络层服务都具有相同的通用结构。为了定义这种服务、需要定义三种类型的服务原语
A. 请求服务(Request):用于向网络层传递控制报文信息及要发送的数据,应用于更高层或应用层。如tester向ECU发出数据。
B. 指示服务(Indication):用于向更高层或应用层传递状态信息及接收到的数据,应用于网络层。如ECU收到了tester的数据,传至应用层。
具体说来,Indication前端应该执行的是底层传入数据的处理函数,即读取PDU信息,这一帧具体是SF、FC、CF还是FF。若满足条件,继续向上,即应用层传递。
C. 确认服务(Confirm):被网络层使用,用于向更高层或应用层传递状态信息。如tester收到了ECU方面的数据。
。。。。。这段话,我也没怎么看懂。我的理解是API,Autosr 中的xxx_Rxindicaiton 、xxx_TxIndication、这种应该也是借检了这种思想。
多包传输
再次重申需要解决的主要问题,由于数据帧比较短,CAN数据帧传输8字节,即使CAM FD也仅仅传输64字节,如果一条诊断命令的长度超过数据长度,就需要分包传输,即多帧传输,当然还有流量控制等。
如此就引出了第一个问题的解决方案——四种数据帧
根据ISO 15765规范规定了帧格式:
SF = SingleFrame FF = FirstFrame CF = ConsecutiveFrame FC = FlowControl DL = Data lenth Control
无论单帧还是多帧,每一帧的0号字节的高4位用于区别帧类型(0/1/2/3)
单帧发送
(1)单帧意味着这一帧的数据场部分有效字节数<=8,不足的地方多以0xAA/55/CC等填充(增加跳变);
(2) 对于单帧,0号字节的低4位[SF_DL] 表示DLC,表示的是要读后面多少个数据,表示的是后面有效数据的长度。
eg:
02 10 03 55 55 55 55 55 --->有效数据是 10 03 55 55 55 55 这部分都是填充位,
01 10 03 55 55 55 55 55 --->有效数据是 10
多帧发送
多帧的发送逻辑
首帧--FF
0号字节高4位固定位1,低4位加上1号字节组成DLC,表示多帧传输的数据长度(如果是22/2E读写数据,要包含SID+DID)
流控帧--FC
FC中携带了一些控制信息,发送方按照FC中的控制信息发送。
第零个字节高4位固定为3,低四位表示流状态参数FS
FS:0,CTS表示继续发送;(流量控制)
1,WT表示等待,令发送方停发,直到下一个流控帧到来;
2,OVFLW表示溢出,当接收方接收到首帧,判断FF_DL的长度比缓冲区大时,接收方就会发送。发送方收到后,知道了溢出,就会停止发送。
3-F,保留
1号字节表示BS块大小,即接下来会发送几帧连续帧。当BS=0时,块大小不做限制;
2号字节表示STmin,规定了连续帧发送的最小时间间隔。
连续帧--CF
0号字节高4位固定为2,低4位表示包的连续号SN,后面跟着数据
eg:
诊断寻址
我们的汽车上有许多的ECU ,当上位机连接诊断口,需要对摸个特定的ECU进行诊断的时候我们是不是应该规定一个地址来表示当前ECU,ECU收到响应发送数据的时候也需要向上位机表明是当前的ECU发出的响应。在UDS ON CAN中,我们自然的就把CAN ID 作为这个地址。
有时候我们需要对多个ECU进行诊断,难道我们需要反复发送相同的诊断请求给到不同的ECU吗?
这就提出了物理寻址和功能寻址的两个概念,一般功能寻址ID 是0x7DF。
本文只是简单的描述了ISO15765-2,细节还需要看标准原文。后面会更新autosar 中UDS 协议的框架和实现
本文许多的截图和文字描述都来自下面视频,如有介意联系删除