6.5 协议控制信息规范
6.5.1 N_PCI
每个N_PDU由N_PCI来标识

Hex value | Description |
0 | 单帧 对于未分段的消息,网络层协议提供了网络协议的优化实现,其消息长度仅嵌入在PCI字节中。 SingleFrame(SF)用于支持单个CAN帧的消息传输。 |
1 | 首帧 第一帧(FF)只能用于支持无法在单个CAN帧中传输的消息,即分段消息。分段消息的第一帧被编码为FF。接收到FF后,接收网络层实体应开始组装分段消息。 |
2 | 连续帧 发送分段数据时,FF之后的所有连续帧都被编码为连续帧(CF)。接收到CF后,接收网络层实体应将接收到的数据字节集合起来,直到接收到整个消息。接收实体应在无误地接收到消息的最后一帧后,将组装好的消息传递到相邻的上层协议层。 |
3 | 流控帧 流量控制(FC)的目的是调节CF N_pdu发送到接收器的速率。指定了三种不同类型的FC协议控制信息来支持此功能。类型由协议控制信息的字段FlowStatus(FS)表示,如下所述。 |
4-F | 保留 ISO 15765的本部分保留了该值范围。 |
6.5.2 单帧N_PCI参数定义
6.5.2.1 SF N_PCI byte

例如Tester发送数据:
03 01 31 51 55 55 55 55
服务端回复:
06 41 31 1D E6 51 01 55
首字节06,高四位为0,即N_PCItype = 0表示是单帧,低四位表示SF_DL,即单帧数据长度为6,其后的41 31 1D E6 51 01为此帧传输的数据,55为填充字节
6.5.2.2 SF_DL错误处理
- 如果网络层接收到SF_DL等于0(0)的SF,则网络层将忽略接收到的SF N_PDU。
- 如果网络层在正常寻址时收到SF_DL大于7的SF,或者在扩展寻址或混合寻址时收到SF_DL大于6的SF,则网络层应忽略收到的SF N_PDU。
6.5.3 首帧N_PCI参数定义
6.5.3.1 FF N_PCI bytes

例如Tester发送请求数据:
07 01 0B 0C 0D 0E 0F 10
服务端回复:
10 0F 41 0B 21 0C 0C 38
首字节为10,高四位为1,即N_PCItype = 1 ,表示首帧,首字节低四位和第二字节一起构成数据长度,Byte#1的低4位为FF_DL的最高位,所以此处为00F,即FF_DL = 00F,长度为15,后面的41 0B 21 0C 0C 38为前6个数据,后面还有9个数据在连续帧里面。
请求端在接收到首帧后应该立即发送流控帧,服务端接收到流控帧后才会继续发送剩下的数据。
注:FF_DL的值只有在扩展帧或者混合地址时才能为7,否则有效值只能为8-0xFFF.
6.5.3.3 FF_DL错误处理
- 如果网络层接收到的FF的FF_DL大于可用的接收器缓冲区大小,那么这将被认为是一个错误条件。网络层应中止消息接收,并发送一个参数为FlowStatus = Overflow的FC N_PDU。
- 如果网络层在使用正常寻址时收到一个FF_DL小于(8)8的FF,或者在使用扩展或混合寻址时收到一个FF_DL小于7的FF,则网络层应忽略收到的FF N_PDU,不发送FC N_PDU。
6.5.4 连续帧N_PCI参数定义
6.5.4.1 CF N_PCI byte

连续帧只在流控帧后面出现,不会单独出现。例如Tester和服务端有如下交互:
请求端发送1:
07 01 0B 0C 0D 0E 0F 10
服务端回复1(首帧):
10 0F 41 0B 21 0C 0C 38
请求端发送2(流控帧):
30 00 01 55 55 55 55 55
服务端回复2(连续帧):
21 0D 00 0E 8C 0F 4D 10
22 01 4E 55 55 55 55 55
服务端回复2的内容即为连续帧,回复的第一帧首字节21,高四位为2,即N_PCItype = 2表示为,流控帧,首字节低四位为1,即SN = 1,表示连续帧的第二帧,回复的第二帧首字节低四位为2,即SN=2,表示连续帧的第二帧
首帧10 0F 41 0B 21 0C 0C 38中00F表示此次传输数据总长度为15,41 0B 21 0C 0C 38为前6字节数据
回复的连续帧第一帧21 0D 00 0E 8C 0F 4D 10加粗字节为7-13字节数据,连续帧第二帧22 01 4E 55 55 55 55 55加粗字节为14-15字节数据,最终拼接起来,接收到的数据为**41 0B 21 0C 0C 38 0D 00 0E 8C 0F 4D 10 01 4E **
6.5.4.2 SN参数定义
参数SN在CF N_PDU中用来指定连续帧的顺序
- 对于所有分段消息,SN应以零(0)开始。FF应该被赋值为0(0),它在N_PCI字段中不包含显式的SequenceNumber,但是应该被视为段号0(0)。
- 紧跟着FF的第一个CF的SN应设置为1(1)。
- 在分段消息传输过程中,每传输一个新的CF, SN应增加1(1)。
- SN值不受FC帧的影响。
- 当SN达到十五(15)的值时,它将回绕并为下一个CF设置为零(0)。
6.5.4.3 SN错误处理
如果接收到带有错误序列号的CF N_PDU消息,则应在网络层中进行适当的错误处理。 消息接收将被中止,并且网络层将向相邻的上层发起一个N_USData.indication服务调用,其参数为<N_Result> = N_WRONG_SN。
6.5.5 流控帧参数定义
6.5.5.1 FlowControl N_PCI bytes

流控帧数据交互见6.5.4.1中的流控帧,其数据为:30 00 01 55 55 55 55 55
Byte#1高4位为3,即N_PCItype= 3 ,表示流控帧,低四位为0,即FS = 0,表示发送方可继续发送连续帧
Byte#2为00,即BS = 00,表示发送方可直接连续发送剩余所有连续帧,且中间接收方不再发送流控帧
Byte#3为01,即STmin = 01,表示发送方后续连续帧的时间间隔为1ms
剩余的55都为填充字节。
FS: 流状态
发送方接收到流控帧 FC 的流状态 FS 来判断是否继续发送信息。流状态 FS 参数范围如下图所示:
16进制值 | 说明 |
0 | 继续发送(CTS) 流控帧继续发送参数,通过编码N_PCI第一字节为“0”,表示继续发送,它会促使发送方重新发送连续帧,该值意味着接受者准备好接收最大BS个连续帧 |
1 | 等待(WT) 流控帧等待参数,通过编码N_PCI第1字节为“1“。它会促使发送方继续等待新的流控帧(N_PDU)的到来,并重新设置N_BS定时器 |
2 | 溢出(OVFLW) 流控帧溢出参数,通过编码N_PCI第1字节为”2“。它会促使发送方终止拆分信息的发送,并且做传递参数<N_Result>=N_BUFFER_OVFLW的N_USData.confirm指示服务。该N_PCI流控参数值仅能跟在首帧N_PDU的流控帧中使用,并且仅能在首帧中FF_DL信息的长度超过了接收实体缓冲区大小时使用 |
3 -F | 保留 该范围的值为该协议保留 |
FS 出错处理:如果接收到的 FC N_PDU 信息参数出错,网络层进行出错处理。信息的发送被中止,并且网络层传递一个参数 <N_Rwsult> = <N_INVALID_FS > 的结果通知上传至上层应用。
BS:块大小
允许发送方一次最大可发送连续帧 CF 次数,即一次发送连续帧帧数要小于等于块大小 BS。当块大小为 0 时,发送方可无限发送连续帧直至信息发送完毕,再无流控帧 FC。
STmin:流控帧间隔时间
STmin 是发送方发送连续帧 CF 与连续帧 CF 间的最小间隔时间,即 STmin 的度量是在一个连续帧发送完开始到请求下一个连续帧时的间隔时间。控制信息参数定义如下:
- 00 - 7F:间隔时间范围为:0ms~127ms。该STmin单元的范围00-7F为绝对单位毫秒ms
- 80 - F0:保留。该范围为协议保留
- F1 - F9:间隔时间范围为:100us ~ 900us.该STmin单元的范围F1-F9最小分编为100微秒us,参数值F1代表100us,F9代表900us。
- FA - FF:保留,该范围为该协议保留
注意:如果接收到的 STmin 参数值为保留值,则按照最长的 ST 值,即 7F->127ms,而不是使用接收到的 ST 值。
6.7 网络层定时参数
6.7.1 定时参数

N_As:发送端
- 从请求发送首帧到确认首帧发送完成之间的时间 L_Data.req(FF) -> L_Data.con(FF)
超时时间:1000ms
超时原因:在超时时间内没有发送出N_PDU报文
超时处理:终止报文发送以及用<N_Result> = N_TIMEOUT_A确认报文发送N_USData.confirm
N_Ar:接收端:
- 从请求发送流控帧到确认流控帧发送成功之间的时间 L_Data.req(FC) -> L_Data.con(FC)
超时时间:1000ms
超时原因:在超时时间内没有发送出N_PDU报文
超时处理:终止报文接收以及用<N_Result> = N_TIMEOUT_A指示报文接收N_USData.indication
N_Bs:发送端:
- 从确认发送成功首帧到接收到流控帧的时间 L_Data.con(FF) -> L_Data.ind(FC)
- 从确认发送成功连续帧到接收到流控帧的时间 L_Data.con(CF) -> L_Data.ind(FC)
- 从接收到流控帧到下一次接收到流控帧的时间 L_Data.ind(FC) -> L_Data.ind(FC)
超时时间:1000ms,需满足(N_Br + N_Ar)< (0.9*N_Bs timeout)
超时原因:
- 发送端没有接收到流控帧(丢失或者覆盖)
- 先前接收端没有收到首帧报文或者连续帧报文(丢失或者覆盖)
超时处理:终止报文传输以及使用 <N_Result> = N_TIMEOUT_Bs 确认报文的传输
N_Br:接收端
- 从接收到首帧到请求发送流控帧的时间 L_Data.ind(FF) -> L_Data.req(FC)
- 从接收到连续帧到请求发送流控帧的时间 L_Data.ind(CF) -> L_Data.req(FC)
超时时间1000ms
**N_Cs:**发送端
- 接收到流控帧到下一次发送出连续帧的时间 L_Darta.ind(FC) -> L_Data.req(CF)
- 发送的两个连续帧之间的间隔时间 L_Data.con(CF) -> L_Data.req(CF)
需满足 ( N_Cs + N_As ) < (0.9 * N_Cr timeout)
**N_Cr:**接收端
- 发送完流控帧到接收到连续帧的时间间隔 L_Data.con(FC) -> L_Data.ind(CF)
- 接收到连续帧到下一次接收到连续帧的时间间隔 L_Data.ind(CF) -> L_Data.ind(CF)
超时时间:1000ms
超时原因:
- 接收端没有接收到连续帧(丢失或者覆盖)
- 发送端先前没有接收到首帧报文(丢失或者覆盖)
超时处理:终止报文接收以及使用<N_Result> = N_TIMEOUT_Cr指示报文接收 N_USData.indication
6.7.3 非期望报文
一般规则是,应该忽略一个到达的非期望N_PDU,除了单帧SF N_PDUs以及物理寻址的首帧FF N_PDUs,功能寻址的第一帧报文也被忽略。当忽略接收到的报文时不应该通知上层有报文到达
7.3 N_PDU字段映射
7.3.1 地址格式
网络层数据的交换由三种寻址格式支持:普通寻址、扩展寻址和混合寻址。每种寻址格式需要不同数量的CAN帧数据字节来封装与要交换的数据相关联的寻址信息。因此,在单个CAN帧内传输的数据字节数取决于所选择的寻址格式的类型。
7.3.2 正常地址
对于N_SA、N_TA、N_TAtype和Mtype的每一个组合,都分配一个唯一的CAN标识符。N_PCI和 N_Data置于CAN帧数据域中。见表19。

7.3.3 正常固定地址
普通固定寻址是普通寻址的一种子格式,其中进一步定义了地址信息到CAN标识符的映射。在正常寻址的一般情况下,如上所述,N_AI和CAN标识符之间的通信保持开放。
对于正常的固定寻址,仅允许29位可以标识符。表20和21根据目标地址类型(n_tatype)将地址信息(n_ai)的映射定义到CAN标识符中。N_PCI和N_DATA放在CAN框数据字段中。


7.3.4 扩展地址
对于N_SA,N_TATYPE和MTYPE的每个组合,分配唯一的CAN标识符。n_ta放在CAN框数据字段的第一个数据字节中。n_pci和n_data被放置在CAN帧数据字段的剩余字节中。

7.3.5 混合地址
7.3.5.1 29 bit CAN identifier
如果Mtype设置为远程诊断,则使用混合寻址格式。
表23和24定义了地址信息(N_AI)到29位CAN标识符方案和第一个CAN帧数据字节的映射,具体取决于目标地址类型(N_TAtype)。N_PCI和N_Data是放在CAN帧数据字段的剩余字节中。


7.3.5.2 11 bit CAN identifier
如果Mtype设置为远程诊断,则使用混合寻址格式
表25定义了地址信息(N_AI)到11位CAN标识符方案的映射。对于,每个N_SA、N_TA和N_TAtype组合都分配了一个唯一的CAN标识符。N_AE置于CAN帧数据字段的第一个数据字节中。N_PCI和N_Data放在CAN帧数据字段的剩余字节中。
