[借鉴了此文的部分内容](https://zhuanlan.zhihu.com/p/37063798)
ISO15765-2 标准主要内容是Transport protocol and network layer services,即传输层和网络层的服务,根据ISO7层模型,此层的下一层级是数据链路层和物理层,上一个层级是会话层和应用层。其存在的目的是为了解决ISO 11898协议中定义的经典CAN数据链路层与ISO14229协议中定义的应用层,彼此之间数据长度不统一的问题。经典CAN数据链路层最大能够支持8个字节,但ISO 14229并不仅仅是为了CAN总线设计的,最大容量达到4095个字节。比如VIN码是17个字节,CAN总线必然需要传递3帧才能传完VIN码,那么如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题,ISO 15765-2 协议由此诞生。
基于CAN的UDS诊断服务,通过network protocol data unit,即N_PDU来实现区别的数据传输(The communication between the peer protocol entities of the network layer in different nodes is done by means of exchanging N_PDUs)。两个网络实体之间的通信都必须遵循N_PDU的格式和定义。N_PDU的格式由3个部分组成,N_AI,N_PCI,N_Data ;N_PDU有四种SF N_PDU, FF N_PDU, CF N_PDU, FC N_PDU。
N_AI,网络地址信息,顾名思义就是代表了某个网络实体,使用物理寻址的方式区别,即CAN ID;
N_PCI,网络协议控制信息,规定了N_PDU携带的数据信息的组织形式;
N_DATA,网络数据,即N_PDU所携带的数据内容;
下面详细介绍SF,FF,CF,FC这四种帧类型:
其中SF用于长度不超过7个字节的诊断命令或响应。FF,CF,FC用于传输长度大于7个字节的诊断命令或响应。每个诊断帧的第一个字节的高4bit用于描述该帧的类型。
当诊断报文长度小于等于7时,再加上一个字节的PCI控制信息就是小于等于8,可以在一帧CAN报文上传输,所以不需要进行分包。此时数据域的第一个字节高4bit值为0000,标识这是一个SF帧,低4bit是SF_DL,即DataLength,描述后面有几个字节。如果有没有使用的字节,通常要用0x55或0xAA来填充,因为这两个值的二进制表述其实就是01010101和10101010,这样在CAN总线上可以让信号跳变得更频繁一些,不会出现长时间电平不变的情况,SF的应用场景如下,
如果一帧CAN报文无法承载一条诊断报文,则需要按照下面的流程进行分包发送:
诊断报文的分段发送
首先,发送端要以一个FF开启通信,告诉接收端还有后续的内容要发,FirstFrame使用前两个字节作为PCI信息,第一个字节高4bit为0001,标识这是一个FF,低4bit加上第二个字节用于描述总共发送的数据长度是多少(包括在FF中和在CF中的所有字节数)。
之后接收端发送FC,告诉发送端能以什么样的速度来发送数据,FC第一字节的高4bit为0011,低4bit为FS,即FlowStatus,第二个字节为BS(BlockSize),第三个字节为STmin(SeperateTime)。FlowControl有0,1,2三种状态,分别命名为ContinueToSend (CTS),Wait (WT),Overflow (OVFLW)。如果允许发送端继续发送ConsecutiveFrame,则FlowStatus=0;若要求发送端等一会再发送ConsecutiveFrame,则FlowStatus=1,再下次允许sender发送ConsecutiveFrame时,receiver再发一个FlowStatus=0的FlowControl。如果receiver因为资源问题无法接收sender发送的数据,则发送一个FlowStatus=2的FlowControl。
对于FS,BS,Stmin官方描述如下:
Stmin:
这里注意STmin的定义,是在一个连续帧发送完开始到请求下一个连续帧时的间隔时长。
BS:
FS:
BS指示sender一次可以发送多少个CF,当发送CF数量达到BS时,需要receiver再次以一个FC开启下一波的CF发送。receiver根据自身的接收和处理能力使用STmin指示sender在发送CF时最小的时间间隔是多少,从而实现流控制。CF就是承载FF无法完全承载的剩余数据了,它使用第一个字节用作PCI,高4bit为0010,低4bit用于标识CF的序列号,从1开始,每发送一次CF增加1。
不分段传输的诊断服务举例:
request 02 10 03 55 55 55 55 55
response 06 50 03 00 32 01 F4 AA
这是一个请求进入extended session的最简单的诊断服务,请求和应答都是SF,加粗的0标识了SF,后面的2和6表示了这条诊断报文拥有几个字节的数据。
分段传输的诊断服务举例:
这是一个读取DTC的命令和应答。
03 19 02 08 55 55 55 55 (诊断仪发送的SingleFrame的request)
10 33 59 02 19 01 00 07 (ECU以FirstFrame开始传输的response)
30 00 00 55 55 55 55 55 (诊断仪发送的FC)
21 09 03 05 02 09 05 04 (ECU发送的CF)
22 07 09 05 06 06 09 05 (ECU发送的CF)
23 08 03 08 07 01 05 08 (ECU发送的CF)
24 07 01 06 08 07 01 0C (ECU发送的CF)
25 08 07 01 0D 08 07 03 (ECU发送的CF)
26 07 09 08 01 01 09 09 (ECU发送的CF)
27 01 07 09 AA AA AA AA (ECU发送的CF,此时传输结束)
BS和STmin等于0时,表示接收端可以以最快的速度来接收数据,发送端可以一次发送的CF数量不受限制。
Network layer timing—网络层定时参数
这一部分还要结合15765-3中的内容来看,描述的是会话层时间设置的内容。
- N_USData.request: This service is used to request the transfer of data. If necessary, the network
layer segments the data. - N_USData_FF.indication: This service is used to signal the beginning of a segmented message
reception to the upper layer. - N_USData.indication: This service is used to provide received data to the higher layers.
- N_USData.confirm: This service confirms to the higher layers that the requested service has
been carried out (successfully or not).
P2Can_server : ECU在接收到请求信息后到开始响应的时间要求,一般不超过50ms;
P2*Can_server: ECU在发送否定响应码为0x78的否定响应后开始响应的时间要求,一般不超过5000ms;
S3server: ECU没有收到任何诊断请求信息而保存非默认会话激活状态的时间,一般设置5000ms;
S3client: 诊断设备采用功能地址发出诊断设备在线(3E)请求后保存多个ECU在非默认会话的间隔时间或采用物理寻址发出请求消息保存一个ECU在非默认会话的最大间隔时间,一般不超过5000ms;
错误的N_PDU处理—待续