MIPI UniPro v2.0 Specification: Data Link Layer (L2)
本文完整整理了MIPI联盟2022年2月19日发布的《UniPro Specification v2.0》第6章内容,涵盖数据链路层的服务定义、接口原语、帧结构、核心协议机制、初始化流程及管理信息库(MIB)等全部技术细节,可直接用于技术学习与参考。
6 数据链路层(L2)Data Link Layer (L2)
本章的核心目标是定义概念性的数据链路层服务和数据链路层协议的特性与行为。本章不规定具体的实现方式或产品形态,也不限制系统内数据链路层及其接口的实现方案。
图60展示了数据链路层使用的服务接入点(SAP)模型。数据链路层通过两个按流量类别划分的服务接入点(DL_TCx_SAP)向网络层提供服务;同时,数据链路层依赖PHY适配层通过PA_SAP提供的服务。数据链路层管理服务接入点(DL_LM_SAP)用于向设备管理实体(DME)提供配置和控制接口。

图60 数据链路层SAP模型 Figure 60 Data Link Layer SAP Model
6.1 数据链路层服务功能与特性
Data Link Layer Service Functionality and Features
数据链路层的核心服务是保证用户数据在数据链路层服务用户之间透明、可靠地传输。底层通信资源的使用方式对数据链路层服务用户完全透明。
发送方向关键特性
-
帧组帧
-
可选的帧抢占功能
-
触发PHY初始化
-
流量控制
-
支持最多2个流量类别,采用基于优先级的仲裁机制,流量类别0(TC0)为强制实现
-
CRC生成
-
出错时重传帧
接收方向关键特性
-
帧解帧
-
接收被抢占帧的能力
-
生成流量控制信用信息
-
支持2个流量类别的接收
-
CRC校验
-
检测各类错误并自主响应
-
自动确认所有未确认的帧
6.2 来自PHY适配层的假设服务
Services Assumed from PHY Adapter Layer
数据链路层假设PHY适配层提供以下服务,以完成对上层的服务交付:
-
发送和接收控制符号
-
发送和接收数据符号
-
PHY初始化
6.3 DL_TCx_SAP
数据链路层通过DL_TCx_SAP向服务用户提供服务。每个流量类别使用专用的服务接入点传输数据,定义了两个SAP:DL_TC0_SAP和DL_TC1_SAP,流量类别由所使用的SAP标识。
发送端通过DL_TCx_SAP将DL_SDU传递给数据链路层,传输至对端数据链路层;接收端数据链路层将接收到的数据以DL_SDU的形式交付给上层。
6.3.1 数据传输原语
Data Transfer Primitives
DL_TCx_SAP的数据传输原语如下表所示:
表30 DL_TCx_SAP数据传输原语 Table 30 DL_TCx_SAP Data Transfer Primitives
|
名称 Name |
请求 Request |
指示 Indication |
响应 Response |
本地响应 Local Response |
确认 Confirm |
本地确认 Local Confirm |
|
DL_DATA |
6.3.1.1 |
6.3.1.3 |
6.3.1.4 |
- |
- |
6.3.1.2 |
DL_TCx_SAP原语的参数定义如下表所示:
表31 DL_TCx_SAP原语参数 Table 31 DL_TCx_SAP Primitive Parameters
|
名称 Name |
类型 Type |
有效范围 Valid Range |
值 Value |
描述 Description |
|
DL_SDU |
字节流 byte stream |
1 ~ DL_MTU |
- |
指定通过DL_TCx_SAP传输的、发送前或接收后的数据长度 |
|
L2ResultCode |
枚举 Enumeration |
- |
SUCCESS=0NO_PEER_TC=1 |
指示DL_DATA.req请求的结果 |
6.3.1.1 DL_DATA.req
该原语用于通过数据链路层的指定流量类别发送DL_SDU,流量类别由所使用的SAP确定。用户可发送长度为1~DL_MTU字节的任意整数长度数据。
-
语义:
DL_DATA.req( DL_SDU ) -
生成时机:数据链路层服务用户需要发送DL_SDU时生成该原语
-
接收效果:数据链路层服务提供者收到该原语后,将DL_SDU传输至对端数据链路层
6.3.1.2 DL_DATA.cnf_L
该原语通知数据链路层服务用户,服务提供者(本层L2)已准备好接收新的DL_DATA.req原语。
-
语义:
DL_DATA.cnf_L( L2ResultCode ) -
生成时机:
-
若
DL_PeerTCxPresent = TRUE(对端设备实现了该TC),则L2ResultCode设为SUCCESS -
若
DL_PeerTCxPresent = FALSE(对端设备未实现该TC),则L2ResultCode设为NO_PEER_TC,此时DL_DATA.req提供的DL_SDU将被忽略,不会放入发送逻辑缓冲区,也不会在链路上发送
-
-
接收效果:
-
在发送DL_DATA.req之后、收到对应的DL_DATA.cnf_L之前,服务用户不得发送新的DL_DATA.req
-
服务用户可在复位后,或收到上一个DL_DATA.req对应的DL_DATA.cnf_L后,立即发送新的DL_DATA.req
-
6.3.1.3 DL_DATA.ind
本地接收端数据链路层服务提供者通过该原语,将接收到的DL_SDU通过对应流量类别的SAP交付给数据链路层服务用户。DL_SDU长度为1~DL_MTU字节。
-
语义:
DL_DATA.ind( DL_SDU ) -
生成时机:数据链路层服务提供者在本地接收端收到DL_PDU时生成该原语,且仅在数据链路层初始化完成后(见6.7节)才会交付DL_SDU
-
接收效果:数据链路层服务用户收到该原语后,应消耗对应SAP关联流量类别的DL_SDU
6.3.1.4 DL_DATA.rsp_L
该原语通知服务提供者,数据链路层服务用户(上层L3)已准备好接收新的DL_DATA.ind原语。
-
语义:
DL_DATA.rsp_L( ) -
生成时机:数据链路层服务用户响应DL_DATA.ind原语,指示其可以接收并处理新的DL_PDU
-
接收效果:
-
在发送DL_DATA.ind之后、收到对应的DL_DATA.rsp_L之前,数据链路层不得发送新的DL_DATA.ind
-
数据链路层仅可在复位后,或收到上一个DL_DATA.ind对应的DL_DATA.rsp_L后,发送新的DL_DATA.ind
-
6.4 DL_LM_SAP
数据链路层管理(DL_LM)SAP提供三类服务原语:配置原语、控制原语和状态原语。设备管理实体(DME)通过DL_LM_SAP上的原语配置、控制数据链路层,并获取其状态信息。
-
配置原语:用于访问数据链路层特有的配置信息,这些信息存储在数据链路层管理信息库(DL_MIB)中,DL_MIB位于DL_LM实体内部。不允许并发访问DL_MIB,数据链路层属性定义见6.8节
-
控制原语:提供对数据链路层的直接控制,由DME生成,可并发执行
-
状态原语:指示数据链路层的状态信息,由数据链路层生成,可并发执行
6.4.1 配置原语
Configuration Primitives
DME使用DL_LM_GET和DL_LM_\*SET配置原语分别读取和写入DL_MIB中的配置属性值。GET和SET原语均为带对应确认原语的请求原语,前缀为DL_LM。
表32 DL_LM配置原语 Table 32 DL_LM Configuration Primitives
|
名称 Name |
请求 Request |
指示 Indication |
本地响应 Local Response |
响应 Response |
本地确认 Local Confirm |
确认 Confirm |
|
DL_LM_GET |
6.4.1.1 |
- |
- |
- |
6.4.1.2 |
- |
|
DL_LM_SET |
6.4.1.3 |
- |
- |
- |
6.4.1.4 |
- |
|
DL_LM_CAPABILITY_SET |
6.4.1.5 |
- |
- |
- |
6.4.1.6 |
- |
表33 DL_LM配置原语参数 Table 33 DL_LM Configuration Primitive Parameters
|
名称 Name |
类型 Type |
有效范围 Valid Range |
值 Value |
描述 Description |
|
MIBattribute |
- |
整数 0x2000~0x2FFF,该范围内的MIB属性定义见6.8节 |
- |
MIB属性的地址 |
|
MIBvalue |
- |
变量,定义见6.8节 |
- |
MIB属性的值 |
|
ConfigResultCode |
枚举 Enum |
- |
SUCCESS=0INVALID_MIB_ATTRIBUTE=1INVALID_MIB_ATTRIBUTE_VALUE=2READ_ONLY_MIB_ATTRIBUTE=3 |
指示请求的结果 |
|
AttrSetType |
枚举 Enum |
- |
NORMAL=0STATIC=1 |
选择设置属性的实际值(NORMAL)还是复位值(STATIC) |
|
DLCreditUnitMode |
枚举 Enum |
- |
CREDIT_UNIT_32=0CREDIT_UNIT_128=1 |
定义请求的信用单位模式 |
6.4.1.1 DL_LM_GET.req
该原语请求获取由MIBattribute标识的指定DL_MIB属性的信息。
-
语义:
DL_LM_GET.req( MIBattribute ) -
生成时机:DME需要从DL_MIB获取信息时生成
-
接收效果:DL_LM实体尝试从DL_MIB中检索请求的属性值,并通过
DL_LM_GET.cnf_L返回结果
6.4.1.2 DL_LM_GET.cnf_L
该原语报告DL_MIB信息请求的结果。
-
语义:
DL_LM_GET.cnf_L( ConfigResultCode, MIBvalue ) -
生成时机:数据链路层响应DME的
DL_LM_GET.req生成该原语,ConfigResultCode取值如下:
表34 DL_LM_GET.cnf_L ConfigResultCode取值 Table 34 DL_LM_GET.cnf_L ConfigResultCode ValuesConfigResultCode
条件 Condition
SUCCESS
请求成功,即DL_LM_GET.req指定的MIB属性可读取,此时DL_LM将MIBvalue设为该属性的值
INVALID_MIB_ATTRIBUTE
DL_LM_GET.req指定的MIB属性无效或未实现,此时MIBvalue的值未定义
-
接收效果:DME获知操作结果;若ConfigResultCode为
SUCCESS,则MIBvalue携带属性值;其他情况下MIBvalue未定义
6.4.1.3 DL_LM_SET.req
该原语尝试将指定的DL_MIB属性设置为MIBvalue指定的值。
-
语义:
DL_LM_SET.req( AttrSetType, MIBattribute, MIBvalue ) -
生成时机:DME需要设置DL_MIB属性值时生成
-
接收效果:DL_LM尝试在其数据库中设置指定MIB属性的值,并通过
DL_LM_SET.cnf_L返回结果
6.4.1.4 DL_LM_SET.cnf_L
该原语报告设置DL_MIB属性值的尝试结果。
-
语义:
DL_LM_SET.cnf_L( ConfigResultCode ) -
生成时机:数据链路层响应DME的
DL_LM_SET.req生成该原语,ConfigResultCode取值如下:
表35 DL_LM_SET.cnf_L ConfigResultCode取值 Table 35 DL_LM_SET.cnf_L ConfigResultCode ValuesConfigResultCode
条件 Condition
SUCCESS
请求成功,即DL_LM_SET.req指定的MIB属性已被设置为指定的MIBvalue
INVALID_MIB_ATTRIBUTE
DL_LM_SET.req指定的MIB属性无效或未实现;若AttrSetType为STATIC,则指定的属性不支持设置其复位值
READ_ONLY_MIB_ATTRIBUTE
DL_LM_SET.req指定的MIB属性存在,但为只读属性
INVALID_MIB_ATTRIBUTE_VALUE
DL_LM_SET.req指定的MIB属性存在且可写,但MIBvalue的值超出了该属性的实现范围或有效范围
-
接收效果:向DME确认
DL_LM_SET.req在数据链路层的成功或失败,对DME无进一步影响
6.4.1.5 DL_LM_CAPABILITY_SET.req
该原语由DME发出,请求第2层更新特定的能力属性。
-
语义:
DL_LM_CAPABILITY_SET.req( DLCreditUnitMode ) -
生成时机:在UniPro启动过程中(见9.11.2节),当DME希望数据链路层更新特定能力属性时生成
-
接收效果:数据链路层根据
DLCreditUnitMode参数指示的模式,更新DL_MTU、DL_SYMBOL_MTU和DL_CreditUnitSize属性(见表49),然后发出DL_LM_CAPABILITY_SET.cnf_L原语
6.4.1.6 DL_LM_CAPABILITY_SET.cnf_L
该原语由第2层发出,通知DME能力属性已更新完成。
-
语义:
DL_LM_CAPABILITY_SET.cnf_L( ) -
生成时机:数据链路层响应DME的
DL_LM_CAPABILITY_SET.req,在完成DL_MTU、DL_SYMBOL_MTU和DL_CreditUnitSize属性更新后生成 -
接收效果:DME获知数据链路层能力更新过程完成,继续执行启动流程
6.4.2 控制原语
Control Primitives
本节定义的服务原语用于控制数据链路层。
表36 DL_LM_SAP控制原语 Table 36 DL_LM_SAP Control Primitives
|
名称 Name |
请求 Request |
指示 Indication |
本地响应 Local Response |
响应 Response |
本地确认 Local Confirm |
确认 Confirm |
|
DL_LM_RESET |
6.4.2.1 |
- |
- |
- |
6.4.2.2 |
- |
|
DL_LM_ENABLE_LAYER |
6.4.2.3 |
- |
- |
- |
6.4.2.4 |
- |
|
DL_LM_LINKSTARTUP |
6.4.2.5 |
- |
- |
- |
6.4.2.6 |
- |
|
DL_LM_HIBERNATE_ENTER |
6.4.2.7 |
- |
- |
- |
6.4.2.8 |
- |
|
DL_LM_HIBERNATE_EXIT |
6.4.2.9 |
- |
- |
- |
6.4.2.10 |
- |
|
DL_LM_PRE_HIBERNATE_EXIT |
6.4.2.11 |
- |
- |
- |
6.4.2.12 |
- |
表37 DL_LM_SAP控制原语参数 Table 37 DL_LM_SAP Control Primitive Parameters
|
名称 Name |
类型 Type |
有效范围 Valid Range |
值 Value |
描述 Description |
|
ResetLevel |
枚举 Enum |
- |
COLD=0WARM=1 |
定义请求的复位级别 |
6.4.2.1 DL_LM_RESET.req
该原语请求复位数据链路层。
-
语义:
DL_LM_RESET.req( ResetLevel ) -
生成时机:DME需要复位数据链路层时生成
-
接收效果:
-
数据链路层将发送器和接收器复位至上电复位状态和值
-
TCx实体丢弃所有正在处理和位于任何逻辑缓冲区中的DL_SDU
-
在复位/启动完成前,数据链路层不执行数据发送或接收操作
-
COLD复位:复位整个数据链路层,包括统计信息
-
WARM复位:复位数据链路层,但保留统计信息(若存在)
-
6.4.2.2 DL_LM_RESET.cnf_L
该原语用于UniPro复位流程(见9.11.1节)。
-
语义:
DL_LM_RESET.cnf_L( ) -
生成时机:在启动流程中,数据链路层使用该原语向DME指示其已退出复位,准备执行L2初始化协议(见6.7节)
-
接收效果:DME获知数据链路层已退出复位
6.4.2.3 DL_LM_ENABLE_LAYER.req
该原语启动UniPro启动流程要求的L2初始化协议(见6.7节)。
-
语义:
DL_LM_ENABLE_LAYER.req( ) -
生成时机:作为UniPro启动流程的一部分(见9.11.2节),在数据链路层退出复位且PHY适配层准备就绪后,由DME生成
-
接收效果:数据链路层进入准备接收AFC帧的状态(作为L2初始化协议的一部分),达到该状态后,通过
DL_LM_ENABLE_LAYER.cnf_L向DME指示
6.4.2.4 DL_LM_ENABLE_LAYER.cnf_L
该原语用于UniPro启动流程(见9.11.2节),向DME指示数据链路层已准备好执行L2初始化协议。
-
语义:
DL_LM_ENABLE_LAYER.cnf_L( ) -
生成时机:数据链路层达到可启动L2初始化协议的状态后生成
-
接收效果:DME获知启动流程中数据链路层已准备好执行L2初始化协议
6.4.2.5 DL_LM_LINKSTARTUP.req
该原语通过启动数据链路层初始化,尝试建立与对端设备的链路(见6.7节)。
-
语义:
DL_LM_LINKSTARTUP.req( ) -
生成时机:DME希望建立与对端设备的链路时生成
-
接收效果:启动数据链路层初始化;初始化完成后,数据链路层进入正常运行状态,并通过
DL_LM_LINKSTARTUP.cnf_L向DME指示
6.4.2.6 DL_LM_LINKSTARTUP.cnf_L
该原语用于UniPro启动流程(见9.11.2节),向DME指示数据链路层初始化已完成,网络层可使用该层。
-
语义:
DL_LM_LINKSTARTUP.cnf_L( ) -
生成时机:数据链路层初始化完成后生成
-
接收效果:DME获知数据链路层初始化已完成
6.4.2.7 DL_LM_HIBERNATE_ENTER.req
该原语请求数据链路层进入休眠状态。
-
语义:
DL_LM_HIBERNATE_ENTER.req( ) -
生成时机:DME希望休眠数据链路层时生成
-
接收效果:
-
数据链路层首先进入冻结状态,所有定时器停止运行,并保留以下属性的值:
DL_TC0TXFCThreshold、DL_FC0ProtectionTimeOutVal、DL_TC0ReplayTimeOutVal、DL_AFC0ReqTimeOutVal、DL_AFC0CreditThreshold、DL_TC0OutAckThreshold、
DL_TC1TXFCThreshold、DL_FC1ProtectionTimeOutVal、DL_TC1ReplayTimeOutVal、DL_AFC1ReqTimeOutVal、DL_AFC1CreditThreshold、DL_TC1OutAckThreshold、
DL_MTU、DL_SYMBOL_MTU、DL_CreditUnitSize、DL_TC0TxMaxSDUSize、DL_TC1TxMaxSDUSize、
DL_TC0RxInitCreditVal、DL_TC1RxInitCreditVal、DL_TC0TxBufferSize、DL_TC1TxBufferSize -
即将进入休眠前,数据链路层通过
DL_LM_HIBERNATE_ENTER.cnf_L向DME指示其意图,然后进入休眠状态
-
6.4.2.8 DL_LM_HIBERNATE_ENTER.cnf_L
该原语用于指示数据链路层即将进入休眠状态。
-
语义:
DL_LM_HIBERNATE_ENTER.cnf_L( ) -
生成时机:数据链路层响应
DL_LM_HIBERNATE_ENTER.req,指示其正在进入休眠状态 -
接收效果:DME获知数据链路层完成了进入休眠所需的所有必要操作
6.4.2.9 DL_LM_HIBERNATE_EXIT.req
该原语请求数据链路层退出休眠状态,返回正常运行。
-
语义:
DL_LM_HIBERNATE_EXIT.req( ) -
生成时机:DME希望唤醒数据链路层时生成
-
接收效果:
-
数据链路层转换至复位状态,恢复进入休眠状态时保留的所有属性值
-
然后使能自身,最后启动数据链路层初始化
-
初始化完成后,生成
DL_LM_HIBERNATE_EXIT.cnf_L,向DME指示其已返回正常运行
-
6.4.2.10 DL_LM_HIBERNATE_EXIT.cnf_L
该原语用于向DME指示数据链路层已退出休眠状态,返回正常运行。
-
语义:
DL_LM_HIBERNATE_EXIT.cnf_L( ) -
生成时机:数据链路层响应
DL_LM_HIBERNATE_EXIT.req,指示其已不再休眠并返回正常运行 -
接收效果:DME获知数据链路层完成了退出休眠所需的所有必要操作
6.4.2.11 DL_LM_PRE_HIBERNATE_EXIT.req
对该原语的支持是可选的;但若实现支持,则必须按本节描述实现。
该原语用于请求数据链路层停止或准备停止休眠,并准备返回正常运行。退出休眠需使用DL_LM_HIBERNATE_EXIT.req原语。
-
语义:
DL_LM_PRE_HIBERNATE_EXIT.req( ) -
生成时机:当DME需要在正式退出休眠前,让数据链路层先做好退出准备时生成
-
接收效果:数据链路层使能
PA_ESCDATA.ind和PA_DATA.ind的处理,为退出休眠状态做准备
6.4.2.12 DL_LM_PRE_HIBERNATE_EXIT.cnf_L
对该原语的支持是可选的;但若实现支持,则必须按本节描述实现。
该原语用于向DME指示数据链路层已做好退出休眠、返回正常运行的准备,且能正确处理来自PA层的PA_ESCDATA.ind和PA_DATA.ind。
-
语义:
DL_LM_PRE_HIBERNATE_EXIT.cnf_L( ) -
生成时机:数据链路层响应
DL_LM_PRE_HIBERNATE_EXIT.req,指示其已为返回正常运行做好准备 -
接收效果:DME获知数据链路层完成了退出休眠前的所有必要准备操作
6.4.3 状态原语
Status Primitives
本节定义的服务原语用于数据链路层提供状态信息。
表38 DL_LM_SAP状态原语 Table 38 DL_LM_SAP Status Primitives
|
名称 Name |
请求 Request |
指示 Indication |
本地响应 Local Response |
响应 Response |
本地确认 Local Confirm |
确认 Confirm |
|
DL_LM_ERROR |
- |
6.4.3.1 |
- |
- |
- |
- |
|
DL_LM_CTRL_NOFRAME |
- |
6.4.3.2 |
- |
- |
- |
- |
|
DL_LM_TC1_NOFRAME |
- |
6.4.3.3 |
- |
- |
- |
- |
|
DL_LM_TC0_NOFRAME |
- |
6.4.3.4 |
- |
- |
- |
- |
|
DL_LM_CTRL_FRAME |
- |
6.4.3.5 |
- |
- |
- |
- |
|
DL_LM_TC1_FRAME |
- |
6.4.3.6 |
- |
- |
- |
- |
|
DL_LM_TC0_FRAME |
- |
6.4.3.7 |
- |
- |
- |
- |
表39 DL_LM_SAP状态原语参数 Table 39 DL_LM_SAP Primitive Parameters
|
名称 Name |
类型 Type |
有效范围 Valid Range |
值 Value |
描述 Description |
|
DLErrorCode |
枚举 Enum |
- |
NAC_RECEIVED=1TCx_REPLAY_TIMER_EXPIRED=2AFCx_REQUEST_TIMER_EXPIRED=3FCx_PROTECTION_TIMER_EXPIRED=4CRC_ERROR=5RX_BUFFER_OVERFLOW=6MAX_FRAME_LENGTH_EXCEEDED=7WRONG_SEQUENCE_NUMBER=8AFC_FRAME_SYNTAX_ERROR=9NAC_FRAME_SYNTAX_ERROR=10EOF_SYNTAX_ERROR=11FRAME_SYNTAX_ERROR=12BAD_CTRL_SYMBOL_TYPE=13PA_INIT_ERROR=14PA_ERROR_IND_RECEIVED=15PA_INIT=16 |
向DME指示数据链路层发生的错误事件 |
6.4.3.1 DL_LM_ERROR.ind
该服务原语向DME指示数据链路层发生了错误事件。
-
语义:
DL_LM_ERROR.ind( DLErrorCode ) -
生成时机:数据链路层检测到错误相关事件时生成,报告以下四类事件:
-
PA_INIT_ERROR:PA_INIT.req失败 -
PA_INIT:数据链路层已向PA层发出PA_INIT.req,或已从PA层收到PA_INIT.ind
-
CRC_ERROR:数据帧或控制帧检测到CRC错误 -
RX_BUFFER_OVERFLOW:接收缓冲区溢出(可能因错误的SOF符号或向未实现的流量类别发送数据导致) -
MAX_FRAME_LENGTH_EXCEEDED:收到的帧有效载荷长度超过DL_MTU -
WRONG_SEQUENCE_NUMBER:收到帧序列号错误的正确帧 -
AFC_FRAME_SYNTAX_ERROR:收到AFC符号后未跟随两个数据符号 -
NAC_FRAME_SYNTAX_ERROR:收到NAC符号后未跟随一个数据符号 -
EOF_SYNTAX_ERROR:收到EOF_EVEN或EOF_ODD符号后未跟随一个数据符号 -
FRAME_SYNTAX_ERROR:收到意外的帧序列 -
BAD_CTRL_SYMBOL_TYPE:收到不支持的数据或控制符号 -
PA_ERROR_IND_RECEIVED:收到PA_ERROR.ind
-
导致帧重传的事件:
NAC_RECEIVED(收到NAC帧)、TCx_REPLAY_TIMER_EXPIRED(TCx重放定时器超时) -
AFC传输可能失败导致的事件:
AFCx_REQUEST_TIMER_EXPIRED(AFCx请求定时器超时)、FCx_PROTECTION_TIMER_EXPIRED(FCx保护定时器超时) -
接收链路上检测到的、导致向对端报告NAC的错误:
-
PHY(重)初始化的尝试或失败:
-
-
接收效果:该指示可用于执行统计相关操作
6.4.3.2 DL_LM_CTRL_NOFRAME.ind
该原语向DME指示数据链路层发送器没有排队等待传输的控制帧。
-
语义:
DL_LM_CTRL_NOFRAME.ind( ) -
生成时机:数据链路层没有新的控制帧要传输时生成
-
接收效果:该指示可用于执行电源管理相关操作
6.4.3.3 DL_LM_TC1_NOFRAME.ind
该原语向DME指示数据链路层发送器中没有流量类别1的新的或未确认的数据帧。
-
语义:
DL_LM_TC1_NOFRAME.ind( ) -
生成时机:没有TC1数据要发送,且所有已发送的TC1帧都已被确认时生成
-
接收效果:该指示可用于执行电源管理相关操作
6.4.3.4 DL_LM_TC0_NOFRAME.ind
该原语向DME指示数据链路层发送器中没有流量类别0的新的或未确认的数据帧。
-
语义:
DL_LM_TC0_NOFRAME.ind( ) -
生成时机:没有TC0数据要发送,且所有已发送的TC0帧都已被确认时生成
-
接收效果:该指示可用于执行电源管理相关操作
6.4.3.5 DL_LM_CTRL_FRAME.ind
该原语向DME指示数据链路层有控制帧(AFC0、AFC1或NAC帧)需要传输。
-
语义:
DL_LM_CTRL_FRAME.ind( ) -
生成时机:有控制帧要传输时生成
-
接收效果:该指示可用于执行电源管理相关操作
6.4.3.6 DL_LM_TC1_FRAME.ind
该原语向DME指示数据链路层发送器中至少有一个流量类别1的新的或未确认的数据帧。
-
语义:
DL_LM_TC1_FRAME.ind( ) -
生成时机:至少有一个TC1数据帧要发送,或并非所有已发送的TC1帧都已被确认时生成
-
接收效果:该指示可用于执行电源管理相关操作
6.4.3.7 DL_LM_TC0_FRAME.ind
该原语向DME指示数据链路层发送器中至少有一个流量类别0的新的或未确认的数据帧。
-
语义:
DL_LM_TC0_FRAME.ind( ) -
生成时机:至少有一个TC0数据帧要发送,或并非所有已发送的TC0帧都已被确认时生成
-
接收效果:该指示可用于执行电源管理相关操作
6.5 协议数据单元的结构与编码
Structure and Encoding of Protocol Data Units
数据链路层PDU(DL_PDU),即帧,由一系列17位符号组成,这些符号分为数据符号和控制符号,分别定义在6.5.1节和6.5.2节。
符号的最高位(第16位)用于区分数据符号和控制符号。这两类符号使用不同的PA层服务原语,使PA层采用适合底层PHY的编码方案。
注意:这并不意味着这些17位符号直接在链路上传输。PHY适配层或PHY层可以使用合适的编码方案对这些符号进行转换。
数据链路层支持两类帧:数据帧和控制帧。
-
数据帧:用于在不同UniPort上的两个数据链路层之间传输数据
-
控制帧:用于流量控制和可靠性保证

图61 控制帧与数据帧分类 Figure 61 Control and Data Frames Taxonomy
数据链路层必须支持至少一个流量类别的数据帧;若同时支持两个流量类别,则必须支持具有不同优先级的两个流量类别的数据帧。数据帧始终包含帧起始(SOF)符号、一个或多个数据字节、可选的填充字节、帧结束(EOF_EVEN或EOF_ODD)符号和错误校验符号。每个流量类别的帧长度是灵活的(见6.8节),但最大帧长度限制为DL_SYMBOL_MTU个符号(不包括SOF符号、EOF_EVEN/EOF_ODD符号、COF符号和CRC符号)。
此外,每个流量类别拥有独立的AFC帧,所有流量类别共享一个公共的NAC帧。控制帧与数据帧的区别在于没有SOF和EOF_EVEN/EOF_ODD符号,ESC_DL与控制符号类型共同作为对应控制帧的起始。每个控制帧为固定长度,长度取决于其类型。根据优先级规则(见6.6.4节),控制帧可以在数据帧传输过程中发送,即可以抢占数据帧。
应避免数据链路层帧内出现传输间隙,导致PHY在高速模式下插入PHY空闲符号。
6.5.1 数据符号
Data Symbol
数据链路层使用数据符号传输或接收数据信息。数据链路层中,数据符号的第16位必须设为\'0\'。

图62 数据链路层数据符号 Figure 62 Data Link Layer Data Symbol
数据链路层使用PHY适配层提供的PA_DATA.req服务原语发送数据符号,并将从PHY适配层PA_DATA.ind服务原语收到的PA_SDU视为数据符号。标识位(第16位)不通过服务原语传递。
6.5.2 控制符号
Control Symbol
数据链路层使用控制符号接收或传输控制信息。控制符号的第15~8位为高字节,第7~0位为低字节。数据链路层中,控制符号的第16位必须设为\'1\'。
数据链路层使用PHY适配层提供的PA_ESCDATA.req服务原语发送控制符号,并将从PHY适配层PA_ESCDATA.ind服务原语收到的PA_SDU视为控制符号。标识位(第16位)不通过服务原语传递。
ESC_DL字符用作数据链路层控制符号标识符,低字节分为控制符号类型字段和参数字段。控制符号类型字段指定控制符号的标识,参数字段为不同控制符号指定不同的参数值。

图63 控制符号定义 Figure 63 Control Symbol Definition
注意:数据和控制符号可由PA层转换为适合PHY的编码方案。若底层PHY支持字符编码,则控制符号标识符(控制符号的高字节)可转换为特殊的PHY字符。由于此类特殊PHY字符的数量有限,数据链路层应尽量减少控制符号标识符的数量。
当前定义的控制符号高字节如下表所示,未定义的值保留供将来使用。数据链路层不得使用保留值,若收到保留值则应丢弃。
表40 控制符号高字节编码 Table 40 Control Symbol MS Byte Encoding
|
控制符号高字节 Control Symbol MS Byte |
Tx_Data Bit[16] |
Tx_Data Bits[15:8] |
描述 Description |
|
ESC_DL |
1 |
00000001 |
数据链路层控制符号标识符 |
所有数据链路层控制符号及其对应的控制符号类型和简要描述如下表所示:
表41 控制符号类型字段定义 Table 41 Control Symbol Type Field Definition
|
控制符号 Control Symbol |
类型 Type |
描述 Description |
|
SOF |
0b000 |
帧起始,参数包含流量类别标识符 |
|
EOF_EVEN |
0b001 |
偶数长度L2有效载荷的帧结束,参数指示帧序列号 |
|
EOF_ODD |
0b010 |
奇数长度L2有效载荷的帧结束,参数指示帧序列号 |
|
COF |
0b011 |
被抢占帧的继续,参数包含流量类别标识符 |
|
0b100 |
保留 Reserved |
- |
|
NAC |
0b101 |
否定确认控制帧的起始,参数包含请求对端重新初始化其TX PHY的标志 |
|
AFC |
0b110 |
确认与流量控制帧的起始,参数包含流量类别标识符和AFC类型标识 |
|
0b111 |
保留 Reserved |
- |
剩余值保留供将来使用。发送器不得使用保留的控制符号类型值,收到保留类型值的控制符号应丢弃。
数据链路层控制符号的参数字段定义如下表所示:
表42 控制符号参数字段定义 Table 42 Control Symbols Parameter Field Definition
|
控制符号 Control Symbol |
参数字段 Parameter Field |
|
Bit 4 | |
|
SOF |
TC |
|
EOF_EVEN | |
|
EOF_ODD | |
|
COF |
TC |
|
AFC |
TC |
|
NAC |
保留 Reserved |
数据链路层发送器应将保留位设为\'1\',接收器应忽略保留位。
SOF、COF和AFC控制符号的第4位和第3位用于标识流量类别,用法如下表所示:
表43 流量类别标识 Table 43 Traffic Class Identification
|
TC |
流量类别 Traffic Class |
|
11 |
保留 Reserved |
|
10 |
保留 Reserved |
|
01 |
TC1 |
|
00 |
TC0 |
数据链路层发送器不得使用保留的流量类别值,收到保留TC值的SOF、COF或AFC控制符号应丢弃。
6.5.3 数据帧
Data Frames
数据链路层所有流量类别使用相同的用户数据帧格式,用于封装上层PDU。每个上层PDU必须封装在一个数据链路层帧中,且一个数据帧只能封装一个上层PDU。
数据帧始终以SOF符号开头;SOF符号之后是组成帧SDU(即L3提供的PDU)的所有数据符号作为有效载荷。若帧有效载荷包含奇数个字节,则最后一个数据符号的高字节携带最后一个有效载荷字节,低字节填充0x00。若发生帧抢占,则在恢复帧传输时插入COF符号。数据帧根据有效载荷字节数的奇偶性,分别以EOF_EVEN符号或EOF_ODD符号结束;EOF符号之后是一个数据符号,携带采用CCITT CRC-16标准的帧校验和(见6.6.11节)。
所有数据链路层数据帧遵循以下规则:
-
数据帧受CCITT CRC-16校验和保护
-
仅当CRC校验和正确时,才使用数据帧的信息

图64 偶数长度DL_SDU的数据帧 Figure 64 Data Frame with Even Number of DL_SDU Bytes
填充字节始终位于数据帧EOF_ODD符号之前的最后一个数据符号的低字节。发送器应将填充字节设为0,接收器在将其送入CRC校验器后应丢弃该填充字节,且不得将其传递给上层。

图65 奇数长度DL_SDU的数据帧 Figure 65 Data Frame with Odd Number of DL_SDU Bytes

图66 被抢占的数据帧 Figure 66 Data Frame with Preemption
6.5.4 控制帧
Control Frames
所有数据链路层控制帧遵循以下规则:
-
控制帧受CCITT CRC-16校验和保护
-
仅当CRC校验和正确时,才使用控制帧的信息
-
控制帧不得被抢占
6.5.4.1 数据链路层确认与流量控制帧(AFC)
Data Link Layer Acknowledgment and Flow Control Frame
AFC帧用于确认正确接收的数据帧,并交换对应流量类别的流量控制信息。AFC帧始终以AFC控制符号开头,后跟两个数据符号,包含流量类别标识、信用传输请求(CReq)位、帧序列号和流量控制信用值。
确认信息(帧序列号)和流量控制信息(信用值)归属于TC字段标识的流量类别。

图67 AFC帧 Figure 67 AFC Frame
AFC帧用于与对端交换信用信息和确认信息。AFCx符号中的CReq位用于向对端请求对应流量类别的流量控制信息,请求AFC帧传输的规则定义在6.6.9节。
帧序列号为5位,支持对每个流量类别的帧进行单独确认或组确认(最多确认16个连续帧),详见6.6.8.1节。
信用单位的字节大小由DL_CreditUnitSize定义(见表49),AFC帧中的Credit Value字段长度由DL_CreditValSizeBits定义(见表48)。因此:
-
若
DL_CreditUnitSize = 32,则一个AFC帧最多可传达4KB接收缓冲区大小的信用信息 -
若
DL_CreditUnitSize = 128,则一个AFC帧最多可传达16KB接收缓冲区大小的信用信息
流量控制信用表示自启动以来可用的总信用数,而非相对值。在数据链路层初始化阶段,通过AFC帧传达缓冲区的空闲空间,详见6.7节。
发送时保留位应设为\'1\',接收时忽略保留位。
6.5.4.2 数据链路层否定确认控制帧(NAC)
Data Link Layer Negative Acknowledgment Control Frame
当接收器在任何帧中检测到错误(见6.6.10节)、收到序列号错误的数据帧,或反向链路需要重新初始化时,应发送NAC帧。NAC帧长度为2个符号,包含RReq位,用于请求对端重新初始化其TX PHY。

图68 NAC帧 Figure 68 NAC Frame
发送时保留位应设为\'1\',接收时忽略保留位。
6.6 协议特性
Protocol Features
本节描述数据链路层发送器和接收器的控制流程和数据流程。
6.6.1 PDU组帧特性
PDU Composition Feature
上层PDU始终封装在一个数据链路层帧中,每个上层PDU必须封装在单独的数据链路层帧中。上层应提供长度不超过数据链路层发送最大帧长度的PDU。
数据链路层发送器为每个上层PDU添加SOF控制符号作为头部,添加EOF_EVEN/EOF_ODD控制符号和CRC符号作为尾部。

图69 偶数长度DL_SDU的PDU组帧 Figure 69 Composition of PDU with Even Length DL_SDU
6.6.1.1 帧抢占
Preemption
为减少高优先级帧的传输延迟,并结合上层提升服务质量,数据链路层可在低优先级数据帧正在传输时,插入高优先级帧,该功能称为帧抢占。
-
发送端的帧抢占功能是可选的,由
DL_TxPreemptionCap属性定义 -
接收端必须始终能够接收被抢占和未被抢占的帧
被抢占帧的传输必须以COF符号继续,后跟该流量类别的数据符号或EOF_EVEN/EOF_ODD符号。此外,前一个抢占帧之后可以紧接着发生另一次抢占。

图70 带抢占的PDU组帧(流量类别Y > X) Figure 70 Composition with Preemption (Traffic Class Y > X)
帧抢占时必须遵守以下规则:
-
抢占不得发生在EOF_EVEN/EOF_ODD符号与CRC符号之间
-
抢占不得发生在AFC和NAC帧内部(包括CRC符号)
-
除上述禁止位置外,抢占可发生在任何符号边界
6.6.2 PDU解帧特性
PDU Decomposition Feature
数据链路层接收器从收到的帧中移除对端添加的头部(SOF符号)和尾部(EOF_EVEN/EOF_ODD符号及CRC符号)。若满足以下所有条件,则将DL_SDU交付给上层:
-
帧的CRC校验通过
-
帧序列号符合预期顺序
-
该帧不是之前已经交付给上层的重传帧

图71 偶数长度DL_SDU的PDU解帧 Figure 71 Decomposition with Even Length DL_SDU
若发生帧抢占,则在将帧交付给网络层之前,还需移除所有COF控制符号。若满足上述正确性规则,则将帧的正确完整有效载荷(不含COF符号)交付给上层。

图72 带抢占的PDU解帧 Figure 72 Decomposition with Preemption
6.6.3 缓冲机制
Buffering Mechanism
每个流量类别的发送器必须提供重传能力,在帧传输后保留该帧,直到其被对应流量类别确认。这种保留机制允许在帧传输失败时进行重传。
所有TC缓冲区遵循以下规则:
-
上层PDU必须在帧开始传输前完整地提供给数据链路层
-
数据链路层仅在能够重传该PDU时,才接受上层PDU
对于任何流量类别,数据链路层实现必须能够重传其发送的任何帧,直到该帧被确认。此外,数据链路层实现必须能够接收任何流量类别的最大有效载荷长度(DL_MTU)的帧,且不得向上层交付包含6.4.3.1节定义的任何错误的帧数据。
6.6.4 仲裁方案
Arbitration Scheme
所有帧类型的数据链路层优先级(从高到低)如下表所示:
表44 支持的优先级 Table 44 Supported Priorities
|
优先级 Priority |
数据链路层帧名称 DL Layer Frame Name |
帧类型 Frame Type |
描述 Description |
|
最高 Highest |
NAC |
控制帧 Control |
否定确认控制帧 |
|
- |
AFC1 (promoted) |
控制帧 Control |
由AFC1_REQUEST_TIMER超时、FC1_PROTECTION_TIMER超时、收到CReq=1的AFC1帧,或AFC1_REQUEST_TIMER运行时收到PA_DL_PAUSE.ind触发的AFC1帧 |
|
- |
AFC0 (promoted) |
控制帧 Control |
由AFC0_REQUEST_TIMER超时、FC0_PROTECTION_TIMER超时、收到CReq=1的AFC0帧,或AFC0_REQUEST_TIMER运行时收到PA_DL_PAUSE.ind触发的AFC0帧 |
|
- |
AFC1 |
控制帧 Control |
由其他条件触发的AFC1帧 |
|
- |
TC1 |
数据帧 Data |
流量类别1数据帧 |
|
- |
AFC0 |
控制帧 Control |
由其他条件触发的AFC0帧 |
|
最低 Lowest |
TC0 |
数据帧 Data |
用于延迟要求不严格的流量的流量类别0数据帧 |
6.6.5 链路属性变更
Change of Certain Link Properties
当链路的某些属性(如电源模式、活动通道数等)发生变化时,PHY适配层(L1.5)和数据链路层(L2)之间需要进行协调,以确保属性变更前、变更中和变更后的正常运行。这种协调由PHY适配层通过PA_DL_PAUSE.ind原语发起。
收到PA_DL_PAUSE.ind后:
-
所有数据链路层定时器停止
-
数据链路层可完成当前正在传输的帧
-
数据链路层必须在发出
PA_DL_PAUSE.rsp_L之前,传输所有挂起的、提升优先级的AFC或NAC帧 -
冻结状态必须在任何正在传输的帧传输完成后立即进入
-
进入冻结状态后,生成
PA_DL_PAUSE.rsp_L -
生成
PA_DL_PAUSE.rsp_L后,数据链路层不得向PHY适配层发送任何新符号 -
若没有正在传输的帧,且没有挂起的、提升优先级的AFC或NAC帧,则数据链路层应立即生成
PA_DL_PAUSE.rsp_L

图73 PA_DL_PAUSE.rsp_L生成示例 Figure 73 Generation of PA_DL_PAUSE.rsp_L Example
若在帧传输过程中进入冻结状态,则退出冻结状态并恢复正常运行时,该帧应从中断点继续传输。
PHY适配层通过向数据链路层发送PA_DL_RESUME.ind原语,指示操作已完成。收到该原语后:
-
数据链路层退出冻结状态,恢复正常运行
-
根据仲裁方案发送所有挂起的帧
-
重新使能帧传输,复位并重启所有定时器
-
收到
PA_DL_RESUME.ind恢复运行时,数据链路层不得生成COF符号
6.6.6 TCx数据帧传输
TCx Data Frame Transmission
任何流量类别的数据帧传输必须遵循以下规则:
-
帧必须按照仲裁方案传输,高优先级帧可抢占低优先级数据帧
-
仅当满足以下所有条件时,才可启动数据帧传输:
-
有足够的信用值可发送完整的DL_SDU到对端
-
未确认的帧数量少于16个
-
-
被抢占的数据帧的传输必须以COF符号继续
6.6.7 流量控制
Flow Control
数据链路层采用每个流量类别独立的信用流量控制方案。发送器必须跟踪接收器的空闲逻辑缓冲区空间,仅当对端接收器对应TC有足够的空闲逻辑缓冲区容纳完整帧时,才启动该流量类别的数据帧传输。
信用值仅用于数据帧有效载荷和填充字节,不用于传输SOF、EOF_EVEN、EOF_ODD、COF、CRC符号以及控制帧。
流量控制方案的核心原理:
-
发送器按流量类别跟踪对端RX逻辑缓冲区的可用空间
-
系统基于寄存器实现,寄存器表示自上电/复位以来可用的总信用数
-
通过比较自上电/复位以来使用的总信用数,判断是否可以发送帧
-
信用值是保守的,可能略滞后于接收器的实际可用空间,但永远不会高估,保证系统鲁棒性
-
信用机制具有自修复能力:若AFC帧丢失,下一个更新的AFC帧会自动纠正错误
启动流程中,双方为每个流量类别交换CReq=1的AFC帧,Credit Value字段等于各自接收逻辑缓冲区的大小(以信用单位计)。Credit Value字段的内容取决于DL_CreditUnitSize的值,该值由DL_LM_CAPABILITY_SET.req的DLCreditUnitMode参数确定(见6.4.1.5节)。若数据链路层接收逻辑缓冲区的大小大于AFC帧可传达的最大缓冲区大小,则Credit Value字段应设为128。
每个节点为每个TC维护以下寄存器值:
-
R:存储收到的信用数 -
U:存储使用的总信用数 -
S:存储发送的总信用数 -
A:存储可用的总信用数 -
Part_U:存储U的部分信用数(不足一个信用单位的字节数) -
Part_A:存储A的部分信用数(不足一个信用单位的字节数) -
节点的发送部分处理寄存器R和U
-
节点的接收部分处理寄存器S和A
-
R、U、S的初始值为0
-
A的初始值为接收逻辑缓冲区的大小(以信用单位计),若缓冲区大小不是信用单位大小的整数倍,则向下取整
-
所有信用寄存器的长度为8位,与AFC帧中Credit Value字段的长度相同,采用模256运算,溢出忽略
流量控制的核心规则:
-
收到无错误的对应TC的AFC帧时,用收到的Credit Value字段值替换R的值
-
发送有效载荷或填充字节时,按发送的完整信用单位数递增U,不足一个信用单位的字节数累计在Part_U中;当Part_U超过一个信用单位时,U加1,Part_U减去一个信用单位
-
上层从数据链路层取走有效载荷字节,以及数据链路层丢弃填充字节,会在接收器逻辑缓冲区中创建空闲空间;按创建的完整信用单位数递增A,不足一个信用单位的字节数累计在Part_A中;当Part_A超过一个信用单位时,A加1,Part_A减去一个信用单位
-
发送AFC帧时,将A的值填入AFC的Credit Value字段,同时将S的值替换为A的值
-
数据帧首次传输时,允许发送的最大字节数由以下公式计算:
[
\left[ \left( (R + 2^{DL_CreditValSizeBits} - U) \mod 2^{DL_CreditValSizeBits} \right) \times DL_CreditUnitSize - Part_U \right] \text{ 字节}
]
若帧有效载荷(含填充字节)大于该值,则不得启动传输 -
重传数据帧时,不检查信用值,直接传输;且每个帧的信用值仅在首次传输时计入U和Part_U,重传时不计入
AFC帧的流量控制触发条件:
当满足以下条件时,节点应发送AFC帧:
[
\left[ (A + 2^{DL_CreditValSizeBits} - S) \mod 2^{DL_CreditValSizeBits} \right] > DL_AFCxCreditThreshold
]
若数据链路层发送器有数据帧要发送,但可用信用数少于DL_TCxTXFCThreshold,则在FCx_PROTECTION_TIMER超时后,发送CReq=1的AFCx帧,请求对端发送流量控制信息。
FCx_PROTECTION_TIMER用于防止AFCx帧丢失导致的信用丢失,其超时值为DL_FCxProtectionTimeOutVal。该定时器在以下任一条件满足时复位:
-
自身超时
-
收到无错误的AFCx帧
该定时器在以下所有条件满足时运行:
-
对端节点的TCx存在
-
对应TCx的发送端信用数少于
DL_TCxTXFCThreshold且有数据要发送 -
数据链路层处于初始化阶段,且未收到对应TCx的AFC帧
若发送CReq=1的AFCx帧后,FCx_PROTECTION_TIMER超时仍未收到AFCx帧,则触发PA_INIT.req并使能NAC传输。收到PA_INIT.cnf_L后,先发送对应RReq位的NAC帧,再发送CReq=1的AFCx帧。
注意:响应CReq=1的AFCx帧时,对应AFCx帧的优先级会提升,见6.6.4节。
6.6.8 确认操作
Acknowledgment Operation
本地发送器发送的每个数据链路层数据帧,必须由对端接收器进行单独确认或组确认。对端接收器仅确认状态良好的帧(见6.6.10节)。
若帧的CRC校验和错误或序列号意外,则数据链路层应丢弃整个帧,不进行任何处理,并发送NAC帧。若数据帧无错误(CRC正确且序列号符合预期),则接收器应调度一个包含该帧序列号的确认。
由于确认和流量控制信息在同一个AFC帧中传输,因此AFC帧的生成可能不是立即的,需遵循6.6.9节的AFC帧生成规则。AFC帧包含接收器逻辑缓冲区的当前信用信息,以及对应流量类别最后一个正确接收帧的序列号。当收到AFC帧中的序列号时,所有发送至该序列号(含)的帧均视为已确认。
每个流量类别有独立的AFC帧(AFC0对应TC0,AFC1对应TC1)。
6.6.8.1 帧序列号标识
Frame Sequence Number Identification
每个数据帧使用5位帧序列号,序列号包含在EOF_EVEN/EOF_ODD符号中。每个流量类别独立使用自己的帧序列号,不与其他TC共享。
帧序列号的特性:
-
每个流量类别有独立的帧序列号
-
有效范围:0~31
-
发送对应TC的帧时,序列号递增,并支持回绕机制
-
复位时,每个流量类别的第一个发送数据帧的序列号为0
-
复位时,最后一个正确接收的帧序列号设为31,下一个预期接收的帧序列号为0
-
收到预期序列号的正确数据帧时,序列号递增,并支持回绕机制
递增回绕的序列号机制支持每个流量类别最多16个未确认帧的组确认。该限制是为了保证按序交付和检测重放帧。
6.6.8.2 重传与帧确认超时机制
Retransmission and Frame Acknowledgment Timeout Mechanism
每个流量类别提供专用的重放定时器(TCx_REPLAY_TIMER),用于识别未确认的已发送帧。该定时器在收到已确认帧的AFCx帧但仍有未确认帧时,不得复位。
数据帧重传时,有效载荷和帧序列号必须与原始传输完全相同,重传按仲裁方案处理。重传时所有帧必须顺序发送,即使在重传过程中收到了某个待重传帧的确认,也必须完成所有重传。
若收到的AFCx帧中的序列号不在未确认帧范围内,或大于对应TC最后一个(重)发送的数据帧的序列号,则接受其中的流量控制信息,但丢弃确认信息。
若TCx_REPLAY_TIMER超时仍未收到确认,则触发PA_INIT.req并使能NAC传输。收到PA_INIT.cnf_L后,按以下顺序发送:
-
对应RReq位的NAC帧
-
TC1的AFC帧(含当前流量控制和确认状态)
-
TC1所有未确认的数据帧(若有)
-
TC0的AFC帧(含当前流量控制和确认状态)
-
TC0所有未确认的数据帧(若有)
若在任何数据帧传输过程中检测到NAC帧:
-
若尚未发送EOF_EVEN/EOF_ODD符号,则停止当前数据帧传输
-
若已发送EOF_EVEN/EOF_ODD符号,则不停止该帧
-
若在任何控制帧传输过程中检测到NAC帧,则不停止正在传输的控制帧
NAC帧的接收方执行以下操作:
-
若NAC帧的RReq位为\'1\',则触发PHY适配层的
PA_INIT.req,并等待PA_INIT.cnf_L -
若NAC帧的RReq位为\'0\',则触发PHY适配层的
PA_LANE_ALIGN.req,并等待PA_LANE_ALIGN.cnf_L -
完成上述操作后,按优先级方案发送所有TC的AFC帧和未确认数据帧
接收器通过比较收到的帧序列号与预期序列号,检测重传帧。若收到的序列号不是预期的,则与预期序列号之前的16个序列号比较;若匹配,则识别为重传帧并丢弃。无论是否识别为重传帧,都应为每个正确接收的数据帧调度确认。
重放定时器(TCx_REPLAY_TIMER)在以下任一条件满足时复位:
-
发送TCx数据帧的最后一个符号(CRC符号)
-
收到确认至少一个未确认数据帧的正确AFCx帧
-
收到正确的NAC帧
-
自身超时
该定时器在以下所有条件满足时运行:
-
存在至少一个未确认的已发送TCx数据帧
-
数据链路层未因
PA_INIT.req请求而等待PA_INIT.cnf_L
帧确认定时器(AFCx_REQUEST_TIMER)在以下任一条件满足时复位:
-
收到正确的TCx数据帧
-
收到正确的NAC帧
-
发送AFCx帧
-
自身超时
该定时器在以下条件满足时运行:
-
存在未确认的已接收TCx数据帧
-
数据链路层未因
PA_INIT.req请求而等待PA_INIT.cnf_L
注意:AFCx_REQUEST_TIMER超时会提升对应AFCx帧的优先级,见6.6.4节。

图78 TC0的帧确认定时器和重放定时器定义 Figure 78 Definition of Frame Acknowledgment Timer and Replay Timer for TC0
6.6.9 AFCx帧传输
AFCx Frame Transmission
所有AFC帧传输规则仅在因DL_LM_LINKSTARTUP.req或DL_LM_HIBERNATE_EXIT.req发送了第一个CReq=1的AFCx帧后才生效。其他情况下,若对端设备未实现TC1(即DL_PeerTC1Present = FALSE),则初始AFC交换后禁用TC1的AFC帧传输。
触发发送CReq=0的AFCx帧的条件:
-
收到NAC帧后
-
TCx_REPLAY_TIMER超时后
-
AFCx_REQUEST_TIMER超时后(此时AFCx帧优先级提升)
-
待确认的帧数超过
DL_TCxOutAckThreshold时:
[
[(32 + currentTCxFrSeqNum - lastAFCxFrSeqNum) \mod 32] > DL_TCxOutAckThreshold
] -
收到重传的数据帧,且其序列号等于最后一个已确认的帧序列号时
-
接收器可用信用数与已发送信用数的差值超过
DL_AFCxCreditThreshold时:
[
[(2^{DL_CreditValSizeBits} + A - S) \mod 2^{DL_CreditValSizeBits}] > DL_AFCxCreditThreshold
] -
收到CReq=1的AFCx帧后(此时AFCx帧优先级提升,即使
DL_PeerTCxPresent = FALSE也需响应) -
AFCx_REQUEST_TIMER运行时收到
PA_DL_PAUSE.ind后(此时AFCx帧优先级提升)
触发发送CReq=1的AFCx帧的条件:
-
FCx_PROTECTION_TIMER超时后(此时AFCx帧优先级提升)
-
初始AFC交换期间发送的第一个AFC帧
6.6.10 NAC帧传输
NAC Frame Transmission
发送NAC帧前,必须先触发PA_LANE_ALIGN.req原语。
当发生以下任一情况时,应发送NAC帧(RReq位根据PA_INIT.cnf_L的PAReverseLinkInitialized参数设置):
-
输入帧检测到CRC错误
-
任何TC的接收缓冲区溢出
-
任何TC收到的帧有效载荷长度超过
DL_SYMBOL_MTU个符号 -
任何TC收到的数据帧序列号不正确(满足公式4)
-
AFC符号后未跟随两个数据符号
-
NAC符号后未跟随一个数据符号
-
EOF_EVEN或EOF_ODD符号后未跟随一个数据符号(即CRC符号)
-
收到
PA_ERROR.ind -
在未启动帧的情况下收到COF、EOF_EVEN或EOF_ODD符号
-
同一流量类别的数据帧正在进行且未被抢占时,收到该TC的SOF符号
-
TC1数据帧正在进行时,收到TC=0的SOF符号
-
同一流量类别的数据帧正在进行且未被抢占时,收到该TC的COF符号
-
收到继续不同TC数据帧的COF符号
-
在抢占帧的CRC之后收到EOF_EVEN、EOF_ODD或数据符号
-
收到字段值无效的DL控制符号(如未定义的控制符号类型或TC)
-
收到意外的帧序列(帧之间收到数据符号)
接收器检测到上述任何错误时,应丢弃所有部分接收的数据帧。发送NAC帧后,NAC传输将被禁用,直到数据链路层收到一个无错误的数据或控制(AFC或NAC)帧。
尽管NAC传输可能被禁用,但当发生以下任一情况时,仍应发送对应RReq位的NAC帧:
-
发送CReq=1的AFCx帧后,等待响应时
FCx_PROTECTION_TIMER超时 -
TCx_REPLAY_TIMER超时
不正确的帧序列号定义:若预期序列号为ExpSeq,收到的序列号为RcvSeq,则当满足以下公式时,RcvSeq为不正确:
[
0 < (32 + RcvSeq - ExpSeq) \mod 32 < 16
]
6.6.11 错误检测机制
Error Detection Mechanism
数据链路层使用CCITT CRC-16标准对所有数据帧和控制帧(AFC和NAC)进行传输错误检测。CRC覆盖从帧的第一个控制符号(SOF、AFC或NAC符号)开始,到CRC符号之前的所有符号(包括任何COF符号)。携带CRC校验和的DL层数据符号的第16位(始终为0)不被CRC覆盖。

图79 CRC覆盖范围 Figure 79 CRC Coverage
CRC-16多项式:
[
G(x) = x^{16} + x^{12} + x^5 + 1
]
发送端CRC计算规则:
-
CRC-16值初始化为
0b1111 1111 1111 1111 -
CRC计算的第一个比特是DL符号的最高位(第16位)
-
计算结果取反得到最终的CRC-16校验和
CRC校验和在DL层数据符号中的位分配如下:

图80 CRC-16校验和在DL层数据符号中的位分配 Figure 80 Bit Allocation for CRC-16 Checksum in DL Layer Data Symbol
接收端CRC计算规则:
-
CRC-16值初始化为
0b1111 1111 1111 1111 -
将帧有效载荷(包括DL层控制符号和数据符号)送入CRC-16计算器
-
若无传输错误,计算结果应与收到的校验和一致
6.6.12 PHY初始化条件
PHY Initialization Condition
当满足以下任一条件时,必须触发PA_INIT.req:
-
收到RReq位为\'1\'的NAC帧
-
发送CReq=1的AFCx帧后,
FCx_PROTECTION_TIMER超时 -
TCx_REPLAY_TIMER超时
若PA_INIT.req成功,则发送NAC帧,数据链路层继续运行。若收到PAResult = FALSE的PA_INIT.cnf_L,则自主错误恢复耗尽,发生致命错误。此时:
-
数据链路层应使用
DL_LM_ERROR.ind( PA_INIT_ERROR )通知DME -
发出该通知后,数据链路层被阻塞,无法发送NAC帧
-
DME应使用
DME_ERROR.ind( DL, PA_INIT_ERROR )通知应用 -
应用收到该通知后,应复位UniPro协议栈
6.7 数据链路层初始化
Data Link Layer Initialization
数据链路层初始化包括初始信用交换,是准备链路执行正常操作的过程。初始信用交换在DME生成DL_LM_LINKSTARTUP.req或DL_LM_HIBERNATE_EXIT.req原语时启动。这两个原语必须在DME通过DL_LM_ENABLE_LAYER.req使能DL且收到DL_LM_ENABLE_LAYER.cnf_L确认后才能调用。
收到DL_LM_LINKSTARTUP.req或DL_LM_HIBERNATE_EXIT.req后,数据链路层首先发送流量类别1的AFC帧(AFC1),然后发送流量类别0的AFC帧(AFC0)。这两个AFC帧的CReq位均设为\'1\',携带的帧序列号和信用值分别为两个流量类别的复位值:
-
最后一个已确认帧序列号:31(见6.6.8节)
-
累计信用数A:接收逻辑缓冲区的大小(以信用单位计,见6.6.7节)
在收到第一个AFCx帧之前,对应的FCx_PROTECTION_TIMER持续运行。FCx_PROTECTION_TIMER的行为、AFC帧传输规则和NAC帧传输规则确保了初始化期间信用交换的可靠性。
初始AFC交换中对端TC存在性的判断:
-
若收到的第一个AFCx帧的流量控制信用值为0,则
DL_PeerTCxPresent = FALSE -
若收到的第一个AFCx帧的流量控制信用值≥10,则
DL_PeerTCxPresent = TRUE -
其他信用值不支持,会导致未定义行为
当每个流量类别都收到一个AFCx帧时,初始信用交换完成,数据链路层初始化完成,L2通过发送DL_LM_LINKSTARTUP.cnf_L原语向DME报告其已进入运行状态。
第一个AFC帧中收到的TCx信用数存储在DL_PeerTCxRxInitCreditVal中,该值减1定义了DL_TCxTXFCThreshold的有效上限(见表47)。
仅支持一个流量类别的UniPro实现必须实现TC0。

图81 初始信用交换示例 Figure 81 Initial Credit Exchange Example
6.8 管理信息库与协议常量
Management Information Base and Protocol Constants
本节定义数据链路层的可读写属性、静态属性和协议常量。所有属性均应可读;具有多个强制值的属性应可写。所有UniPro属性复位为表中指定的默认值,部分属性支持加载持久化值(存储在非易失性存储器、eFuse等中)。
表47 数据链路层(可读写)属性 Table 47 Data Link Layer (gettable, settable) Attributes
|
属性 Attribute |
属性ID Attribute ID |
描述 Description |
类型 Type |
单位 Unit |
有效值 Valid Attribute Value(s) |
强制值 Mandatory Value(s) |
复位值 Reset Value |
|
TC0参数 | |||||||
|
DL_TC0TXFCThreshold¹ |
0x2040 |
触发发送CReq=1的AFC0帧以请求对端流量控制更新的阈值,休眠期间保留 |
整数 Integer |
DL_CreditUnitSize |
1 ~ DL_PeerTC0RxInitCreditVal - 1 |
9 |
9 |
|
DL_FC0ProtectionTimeOutVal |
0x2041 |
FC0_PROTECTION_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留 |
整数 Integer |
µs |
0 ~ 65535 |
- |
8191 |
|
DL_TC0ReplayTimeOutVal |
0x2042 |
TC0_REPLAY_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留 |
整数 Integer |
µs |
0 ~ 65535 |
- |
65535 |
|
DL_AFC0ReqTimeOutVal |
0x2043 |
AFC0_REQUEST_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留 |
整数 Integer |
µs |
0 ~ 65535 |
- |
32767 |
|
DL_AFC0CreditThreshold |
0x2044 |
基于接收器TC0可用信用触发AFC0的阈值,休眠期间保留 |
整数 Integer |
DL_CreditUnitSize |
0 ~ 127 |
0 ~ 8 |
8 |
|
DL_TC0OutAckThreshold |
0x2045 |
TC0的未确认帧数阈值(发送AFC0前可接收的TC0数据帧数),休眠期间保留 |
整数 Integer |
帧 Frame |
0 ~ 15 |
- |
0 |
|
TC1参数 | |||||||
|
DL_TC1TXFCThreshold¹ |
0x2060 |
触发发送CReq=1的AFC1帧以请求对端流量控制更新的阈值,休眠期间保留 |
整数 Integer |
DL_CreditUnitSize |
1 ~ DL_PeerTC1RxInitCreditVal - 1 |
9 |
9 |
|
DL_FC1ProtectionTimeOutVal |
0x2061 |
FC1_PROTECTION_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留 |
整数 Integer |
µs |
0 ~ 65535 |
- |
8191 |
|
DL_TC1ReplayTimeOutVal |
0x2062 |
TC1_REPLAY_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留 |
整数 Integer |
µs |
0 ~ 65535 |
- |
65535 |
|
DL_AFC1ReqTimeOutVal |
0x2063 |
AFC1_REQUEST_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留 |
整数 Integer |
µs |
0 ~ 65535 |
- |
32767 |
|
DL_AFC1CreditThreshold |
0x2064 |
基于接收器TC1可用信用触发AFC1的阈值,休眠期间保留 |
整数 Integer |
DL_CreditUnitSize |
0 ~ 127 |
0 ~ 8 |
8 |
|
DL_TC1OutAckThreshold |
0x2065 |
TC1的未确认帧数阈值(发送AFC1前可接收的TC1数据帧数),休眠期间保留 |
整数 Integer |
帧 Frame |
0 ~ 15 |
- |
0 |
¹ 最大值取决于接收器缓冲区大小
表48 数据链路层协议常量 Table 48 Data Link Layer Protocol Constants
|
属性 Attribute |
描述 Description |
类型 Type |
单位 Unit |
值 Value |
|
DL_MTU_SMALL |
DLCreditUnit32模式下的最大有效载荷长度 |
整数 Integer |
字节 Byte |
288 |
|
DL_MTU_LARGE |
DLCreditUnit128模式下的最大有效载荷长度 |
整数 Integer |
字节 Byte |
1160 |
|
DL_SYMBOL_MTU_SMALL |
DL_MTU_SMALL大小有效载荷的最大符号数(DL_SYMBOL_MTU_SMALL = DL_MTU_SMALL/2) |
整数 Integer |
符号 Symbol |
144 |
|
DL_SYMBOL_MTU_LARGE |
DL_MTU_LARGE大小有效载荷的最大符号数(DL_SYMBOL_MTU_LARGE = DL_MTU_LARGE/2) |
整数 Integer |
符号 Symbol |
580 |
|
DL_CreditValSizeBits |
AFC帧中Credit Value字段的位数 |
整数 Integer |
位 Bit |
8 |
|
DL_CreditUnitSizeSmall |
DLCreditUnit32模式下的一个信用单位大小 |
整数 Integer |
字节 Byte |
32 |
|
DL_CreditUnitSizeLarge |
DLCreditUnit128模式下的一个信用单位大小 |
整数 Integer |
字节 Byte |
128 |
表49 数据链路层(可读,静态)属性 Table 49 Data Link Layer (gettable, static) Attributes
|
属性 Attribute |
属性ID Attribute ID |
描述 Description |
类型 Type |
单位 Unit |
有效值 Valid Attribute Value(s) |
|
DL_TxPreemptionCap |
0x2000 |
两个流量类别的发送端抢占能力 |
布尔 Bool |
- |
TRUE=1, FALSE=0 |
|
DL_MTU² |
0x2007 |
最大有效载荷长度- DLCreditUnit32模式:等于DL_MTU_SMALL- DLCreditUnit128模式:等于DL_MTU_LARGE休眠期间保留 |
整数 Integer |
字节 Byte |
DL_MTU_SMALL, DL_MTU_LARGE |
|
DL_SYMBOL_MTU² |
0x2008 |
DL_MTU大小有效载荷的最大符号数- DLCreditUnit32模式:等于DL_SYMBOL_MTU_SMALL- DLCreditUnit128模式:等于DL_SYMBOL_MTU_LARGE休眠期间保留 |
整数 Integer |
符号 Symbol |
DL_SYMBOL_MTU_SMALL, DL_SYMBOL_MTU_LARGE |
|
DL_CreditUnitSize² |
0x2009 |
一个信用单位的大小- DLCreditUnit32模式:等于DL_CreditUnitSizeSmall- DLCreditUnit128模式:等于DL_CreditUnitSizeLarge休眠期间保留 |
整数 Integer |
字节 Byte |
DL_CreditUnitSizeSmall, DL_CreditUnitSizeLarge |
|
TC0 | |||||
|
DL_TC0TxMaxSDUSize³⁴ |
0x2001 |
TC0发送器最大SDU大小 |
整数 Integer |
符号 Symbol |
1 ~ DL_SYMBOL_MTU |
|
DL_TC0RxInitCreditVal¹³⁴ |
0x2002 |
TC0接收器初始信用值(初始寄存器A的值) |
整数 Integer |
DL_CreditUnitSize |
10 ~ 128 |
|
DL_TC0TxBufferSize³⁴ |
0x2005 |
TC0发送器缓冲区大小 |
整数 Integer |
DL_CreditUnitSize |
10 ~ 128 |
|
DL_PeerTC0Present |
0x2046 |
对端设备支持TC0 |
布尔 Bool |
- |
TRUE=1, FALSE=0 |
|
DL_PeerTC0RxInitCreditVal¹ |
0x2047 |
对端TC0接收器初始信用值(初始寄存器A的值) |
整数 Integer |
DL_CreditUnitSize |
10 ~ 128 |
|
TC1 | |||||
|
DL_TC1TxMaxSDUSize³⁴ |
0x2003 |
TC1发送器最大SDU大小 |
整数 Integer |
符号 Symbol |
1 ~ DL_SYMBOL_MTU |
|
DL_TC1RxInitCreditVal¹³⁴ |
0x2004 |
TC1接收器初始信用值(初始寄存器A的值) |
整数 Integer |
DL_CreditUnitSize |
0, 10 ~ 128 |
|
DL_TC1TxBufferSize³⁴ |
0x2006 |
TC1发送器缓冲区大小 |
整数 Integer |
DL_CreditUnitSize |
0, 10 ~ 128 |
|
DL_PeerTC1Present |
0x2066 |
对端设备支持TC1 |
布尔 Bool |
- |
TRUE=1, FALSE=0 |
|
DL_PeerTC1RxInitCreditVal¹ |
0x2067 |
对端TC1接收器初始信用值(初始寄存器A的值) |
整数 Integer |
DL_CreditUnitSize |
0, 10 ~ 128 |
¹ 最大值取决于接收器缓冲区大小
² 该属性的值在链路启动时确定,降级后的值在DME_LINKSTARTUP.cnf_L(SUCCESS)后生效
³ 数据链路层根据链路启动时确定的降级DLCreditUnitMode转换该属性的值
⁴ 该属性在休眠期间保留
本文整理自MIPI Alliance发布的《Specification for UniPro Version 2.0》(2022-02-19)第6章,版权归MIPI Alliance所有,仅供技术学习交流使用。
486

被折叠的 条评论
为什么被折叠?



