本文是对 ISO 15765-2-2011 协议的一些解读。需要指出该协议的最新版为2016版。
UDS网络层,又称为TP层(Transport Protocol Layer)。其存在的目的是为了解决ISO 11898协议中定义的经典CAN数据链路层与ISO 14229协议中定义的应用层,彼此之间数据长度不统一的问题。经典CAN数据链路层最大能够支持8个字节,但ISO 14229并不仅仅是为了CAN总线设计的,最大容量达到4095个字节。比如VIN码是17个字节,CAN总线必然需要传递3帧才能传完VIN码,那么如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题。ISO 15765-2 协议由此诞生。
15765-2作为车辆诊断通信的一个组成部分,规范了“传输协议和网络层服务”。
看下目录:
0 前言与简介
1 适用范围
2 规范性参考文献
3 术语、定义和缩写术语
4 约定
5 文档概述
6 网络层概述
7 网络层服务
8 传输层协议(重点,难点)
9 数据链路层的使用
ISO 15765-2的第一版为ISO 15765-2:2004。ISO 15765的中文含义为道路车辆 - 基于CAN网络的诊断通信(DoCAN),整套协议由以下部分组成:
- 第一部分:一般信息和用例定义
- 第2部分:传输协议和网络层服务
- 第3部分:统一诊断服务的实施(CAN上的UDS )
- 第4部分:与排放有关的系统的要求
ISO15765-2 可以但不限于与ISO 14229-1和ISO 15031-5一起使用,它与车载网络的大多数其他通信需求相兼容。
ISO / IEC 7498-1,信息技术 - 开放系统互连 - 基本参考模型:基本模型
ISO 11898-1,道路车辆 - 控制器局域网(CAN) - 第1部分:数据链路层和物理信令
网络层最主要的目的就是把数据转换成能适应CAN总线规范的单一数据帧,从而进行传输。如果将要传输的报文长度超过了CAN数据帧的长度,则需要将报文信息进行拆分后传输,每次至多可以传输4095个字节长度的报文。
所有的网络层服务都具有相同的通用结构。为了定义这种服务,需要定义三种类型的服务原语:
A. 请求服务(Request):用于向网络层传递控制报文信息及要发送的数据,应用于更高层或应用层。如tester向ECU发出数据。
B. 指示服务(Indication):用于向更高层或应用层传递状态信息及接收到的数据,应用于网络层。如ECU收到了tester的数据,传至应用层。
具体说来,Indication前端应该执行的是底层传入数据的处理函数,即读取PDU信息,这一帧具体是SF、FC、CF还是FF。若满足条件,继续向上,即应用层传递。
C. 确认服务(Confirm):被网络层使用,用于向更高层或应用层传递状态信息。如tester收到了ECU方面的数据。
具体说来,Confirm和Indication很像的是都是从网络层向应用层传递信息,有何区别呢?
在代码的处理中,Confirm的前端应向底层外发Tx数据或超时处理函数,反馈的信息不需要包含数据。而Indication传递的信息则分为两种,一种包含真实数据,另一种不包含。
建设中。。。。。。
这一章一开始就重申了TP层的意义之所在:
网络层协议数据单元(N_PDU,Network_Protocol Data Unit)包含N_AI,N_PCI,N_Data。即地址信息,协议控制信息和数据。
注:这里的N_PCI全称为Protocol Control Information。
网络层协议数据单元(N_PDU)有四种类型,即单帧(SF)、首帧(FF)、连续帧(CF)、流控制帧(FC),用于建立对等实体间的通信。
网络层对于这四种类型的数据单元是通过协议控制信息(N_PCI,Protocol Control Information)进行区分的。每一个N_PDU都只有一个N_PCI。
也就是说,对于CAN诊断来说,我们完全可以通过识别每条CAN帧数据域的首个字节来确定它属于四种类型中的哪类。
N_PCI是TP层最为核心的信息,是TP层区别于其他CAN总线抽象协议的、最为显著的特征。
以下说明仅以乘用车常用的常规寻址举例。
对于TP层来说,我们可以把报文分为单帧和多帧,单帧只有一种N_PCI,即单帧;多帧有三种N_PCI,即首帧、流控制帧、连续帧。代码实现中,主要的工作其实就在多帧的处理和对超时错误(Timeout)的处理上。
0X 单帧(SF):首个字节为0(4bit)+ Data Length(4bit),控制信息占用1个字节
举例:Data 02 10 02 55 55 55 55 55,02表示接收方应知晓,这一个单帧只有2个有效字节。后续的字节是自动填充的无效字节。
单帧PCI通常仅占用1个字节,其他是数据,所以可以后面可以跟着最多7个字节的数据
1X XX 首帧(FF):前两个字节为1(4bit)+ Data Length(12bit),控制信息共占用2个字节。
举例:Data 10 14 2E F1 90 01 02 03,0x014表示,接收方应知晓,这一个多帧组合共有20个字节。
首帧可以携带一个多帧报文的头部6个字节数据
3X 流控制帧(简称流控帧,FC):前三个字节为3(4bit)+流状态(FS,4bit)+块大小(BS,8bit)+最小间隔时间(STmin,8bit),控制信息共占用三个字节。
举例:Data 30 00 14 AA AA AA AA AA,多帧发送方应知晓,这是一个流控帧,允许你方继续发送,CF数量无限制,上一个连续帧的确认接收(ACK)到新的连续帧开始发出的最小间隔时间为20ms。
Flow State 流状态:0为继续发送,Continue To Send(CTS),1为Wait(WT),2为Overflow(OVFLW)。
流控帧仅有3个字节的控制信息,无数据字节
STmin含义的解读
间隔最短时长(STmin)值的含义如下。
2X 连续帧(CF):第一个字节为2+SN(最多16个SN,溢出后从0开始重新计数),控制信息占用1个字节。
我们通常记首帧为0x20,之后的第一个连续帧自然是0x21,之后一直到0x2F,下一个是0x20,循环。
一个连续帧最多可携带7个数据字节
下图是一个传输规则的例子。可以看出,这首先是一个多帧传输,下列CAN帧依次代表的含义是首帧、流控、连续帧、连续帧。
FF-FC-CF-CF
实际截取到的多帧报文
下图是N_PCI字节的概要。N_PCI在不同的类型下占用的字节数是不同的。记忆时可以按照单帧、首帧、连续帧、流控的顺序,与0、1、2、3建立映射关系。这四种类型所占用的字节大小依次是1个、2个、1个、3个。
网络层的主要任务是传递一帧或大于一帧的数据信息。以下是一个被拆分的信息传送的例子。
帧的发送主要有单帧发送和多帧发送两种,在标准地址情况下,单帧SF按照N_PDU格式最多发送和接收7个字节数据(因第一个字节为N_PCI)。
而发送长报文信息时,拆分后的报文信息会通过多个N_PDU进行发送,接收到多个N_PDU信息后进行重组。这些N_PDU包括首帧和连续帧。报文信息接收者可通过流控机制按照自己的接收能力调整传输流量。在正常地址的情况下,一个首帧PDU包括6个字节,一个连续帧PDU包括6或7个字节。当然最后一个连续帧可以少于6或7个字节。
网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数。
多帧传输时序表,划重点
我们对上述信息进行归纳:
N_As超时:发送方没有及时发送N_PDU。
N_Ar超时:接收方没有及时发送N_PDU。
N_Bs超时:发送方没有接收到流控帧。
N_Cr超时:接收方没有收到连续帧。
N_Br超时:接收方没有发出流控帧。
N_Cs:即STmin,发送两个连续帧需要等待的最短时间。
写在最后,朱老大提了一个问题,ISO14229、14230、15765、15031之间的联系和不同之处在哪里。我们看一下下面的两张图。
基于K线
基于CAN线
ISO15031-5是排放相关的应用层协议,它不关心我们使用K线还是CAN线,主要用于监控车辆基本参数,例如监控里程、车速;用于监控排放相关的参数,比如各种尾气的含量,氧含量等等,以此来保证满足各国的标准;用于读取VIN码等车辆参数;读取/清除排放相关的故障码。
ISO14229-1是UDS诊断的应用层协议,通常基于CAN线,主要用于监控车内参数、记录存储故障信息、错误检测、读写数据等。
ISO14230是老式的基于K线的诊断协议,其功能与UDS类似,但是基于的是类似于串行总线的K线,速度慢,易出错,已经被UDS淘汰。
ISO15765有很多子协议,通常基于CAN线,LIN线也支持。可以看做对ISO14229-1和ISO15031-5的支撑。比如本文中的ISO15765-2就负责帮助ISO14229-1处理CAN的短帧数据(小于6或7个字节),使其形成最大4095个字节长度的长帧数据,方便ISO14229-1进行处理。