网络层目的
N_PDU(network protocol data unit),即网络层协议数据单元,相关协议规范参考 ISO 15765-2
网络层最重要的目的就是把数据转换成符合标准的单一数据帧(符合can总线规范的),从而进行数据传输。报文信息每次最多传输4095个字节(基于can),但是单帧长度最多为8个字节,此时需要将报文进行拆分传输。
诊断报文ID
每一个ECU都有2个CAN的诊断帧ID,分别对应物理寻址的收与发。通常由主机厂来确定不同ECU的这两个特定的诊断ID。比如0x701对应接收Tester的消息,0x709对应发给Tester的消息。
N_PDU 格式
N_PDU 格式 | ||
---|---|---|
地址信息 | 协议控制信息 | 数据区 |
N_AI(Address Information) | N_PCI(Protocol Control Information) | N_Data |
- N_AI 包含了目标地址、源地址、可能还有远程地址等所有与地址有关的信息,通常就是指CAN报文的ID
- N_PCI 协议控制信息,表示帧类型:SF,FF,CF,FC 和 数据长度
- N_DATA 数据
对于CAN诊断通信,我们可以通过分析每个CAN帧数据域的第一个字节来确定它属于四种不同类型中的哪一种。
诊断报文的分类:单帧、多帧
在传输协议(TP,Transport Protocol)层面,我们将诊断消息分为两大类:单帧和多帧。
- 单帧消息(Single Frame):单帧消息只包含一个N_PCI,即单帧。它们适用于较小的诊断消息,可以在单个CAN帧中传输完整的诊断数据。
- 多帧消息(Multi-Frame):多帧消息分为三种不同的N_PCI类型,包括首帧、流控制帧和连续帧。这些消息用于传输较大的诊断数据,需要分成多个CAN帧来传输。
- 首帧(First Frame):首帧包含了诊断数据的一部分,并提供了有关数据总长度的信息。
- 连续帧(Consecutive Frame):连续帧包含了较大诊断数据的剩余部分,根据流控制帧中的信息,发送方可以持续发送这些帧。
- 流控制帧(Flow Control Frame):流控制帧用于通知发送方可以继续发送数据帧的数量。
N_PDU类型 | N_PCI (Byte1 - Byte 8) CAN2.0为例 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | ... | Byte 8 | ||||
Bit 7-4 | Bit 3-0 | |||||||||
单帧(SF) | N_PCI Type = 0 | SF_DL <= 7 | N_Data | |||||||
首帧(FF) | N_PCI Type = 1 | 7 < FF_DL <= 4095 | N_Data | |||||||
首帧(FF) | N_PCI Type = 1 | 0 | 0 | 4095 < FF_DL | N_Data | |||||
连续帧(CF) | N_PCI Type = 2 | SN (0-F循环计数) | N_Data | |||||||
流控帧(FC) | N_PCI Type = 3 | FS | BS | STmin | reserve |
-
SF_DL :单帧的数据长度
-
FF_DL :首帧的数据长度
-
FS (Flow State) 流状态:
- 0 : 继续发送
- 1 : 等待; 当FS=1时,流控帧称为 等待流控帧,等待一个新的流控帧
- 2 : 溢出,即第一帧中的FF_DL信息的长度超过接受实体缓冲区的大小),将会引起发送终止发送
-
BS 表示 发送方被允许连续发送 连续帧
CF
的次数。 特殊情况下,如果该值为0,则表示发送连续帧没有限制,如果值为8,表示发送方最多能连续发送8帧CF就会继续收到接收方的流控帧; -
STmin 表示 发送方被允许发送 连续帧
CF
与连续帧CF
之间的最小间隔时间。 如果值为0,表示对于发送方发送CF的最小时间没有要求。0 ~ 7F 表示0 ~ 127ms;F1 ~ F9的单位为100us,其中F1表示100us,F9表示900us -
SN (0-F循环计数),但是第一帧连续帧的值是从 1 开始
FC.Wait帧(FS=1)发送次数的最大值(N_WFTmax)
该变量用于避免在通信发送方出现潜在错误挂起的时候,后者可能会持续等待。该参数用于对等通信并不被传递,因此不包含在FC的协议数据单元里。
- N_WFTmax参数应当指示一组能有多少个FC N_PDU WT能被接收者接收。
- N_WFTmax参数的上限由用户根据系统时钟定义。
- N_WFTmax参数仅由接收网络实体在接收信息的时候使用。
- 如果N_WFTmax参数值设置为0,即不允许使用等待流 控制帧。