1. Link Traning 流程
DP Sink 内部有一组标准寄存器,称为 DPCD(DisplayPort Configuration Data)。当 DisplayPort Source 和 Sink 建立连接后,Source 会通过 AUX(Auxiliary)通道读取和配置 Sink 的 DPCD 寄存器,从而完成链路训练。
调试时最常关注三个区域:
| DPCD 地址 | 作用 |
|---|---|
0x0000 ~ 0x000F |
Sink Capability |
0x0100 ~ 0x010F |
Link Configuration |
0x0200 ~ 0x020F |
Link Status |
整个 Link Training 过程主要包括以下几个阶段:

1.1. 读取 DPCD Capability
Sink 通过 HPD (Hot Plug Detect) 引脚的高电平通知 Source 当前的连接状态。Source 检测到 HPD 信号后,通过 AUX (Auxiliary) 通道 读取 Sink 端的 DPCD (DisplayPort Configuration Data) 寄存器,从而获取 Sink 的核心链路能力。
1.1.1 核心配置参数
-
Lane Count (通道数)
- 核心定义:DisplayPort 物理层中用于传输高速视音频数据的差分对(对线)数量。
- 规格配置 :DP 标准允许灵活配置为 1 Lane、2 Lanes 或 4 Lanes。
-
Link Rate (链路速率)
- 核心定义:单条 Lane 上每秒传输的原始数据比特率,决定单通道的数据吞吐率。
- 常见规格 :
- RBR (Reduced Bit Rate): 1.62 Gbps / Lane
- HBR (High Bit Rate): 2.70 Gbps / Lane
- HBR2 (High Bit Rate 2): 5.40 Gbps / Lane
- HBR3 (High Bit Rate 3): 8.10 Gbps / Lane
-
Voltage Swing (电压摆幅)
- 核心定义:差分信号正负峰值之间的电压差,决定了信号的绝对基准幅度。
- DP 规格 :分为 Level 0 ~ Level 3 (对应差分峰峰值约
400mV到1200mV)。
-
Pre-emphasis (预加重)
- 核心定义:一种高频补偿技术。对高频跳变信号(0 变 1 或 1 变 0 的第一个 Bit)进行瞬间电压放大,而对连续不变的低频信号进行物理衰减。
- DP 规格 :分为 Level 0 ~ Level 3 (对应约
0dB到9.5dB的高频增强)。
1.2 Clock Recovery(时钟恢复)阶段 - Sink 能否从数据流中恢复时钟
由于 DP 物理接口不包含独立的物理时钟线,接收端(Sink)必须通过内置的锁相环(PLL)从发送端(Source)的时序数据流中提取并恢复出同步时钟。本阶段是整个链路训练(Link Training)的基础第一步。
1.2.1 发送 TPS1
首先,Source 根据 Sink 的能力确定本次 Link Training 使用的 Lane Rate ,并从最低的 Voltage Swing 和 Pre-emphasis 组合开始。
确定训练参数后,Source 通过 AUX 通道向 Sink 的 DPCD 寄存器 0x0102(TRAINING_PATTERN_SET)写入 TPS1 配置 ,通知 Sink 进入 Clock Recovery 阶段。
完成配置后,Source 在 Main Link 上发送 TPS1 训练序列,Sink 开始尝试从接收到的数据流中恢复时钟。
1.2.2 Voltage Swing 和 Pre-emphasis 组合
DP 通常定义 4 个 Voltage Swing 和 Pre-emphasis 等级:
| Level | Voltage Swing | Pre-emphasis |
|---|---|---|
| 0 | 最低 | 最低 |
| 1 | 更高 | 更高 |
| 2 | 更高 | 更高 |
| 3 | 最高 | 最高 |
Voltage Swing 和 Pre-emphasis 不能任意组合,传统 DP Link Training 中要求:
Voltage Swing Level + Pre-emphasis Level ≤ 3
因此,有效的组合包括:
| Voltage Swing | Pre-emphasis 可选范围 |
|---|---|
| 0 | 0 ~ 3 |
| 1 | 0 ~ 2 |
| 2 | 0 ~ 1 |
| 3 | 0 |
例如,初始训练通常从:
Voltage Swing = Level 0
Pre-emphasis = Level 0
开始。
1.2.3 检查 Clock Recorvery 状态
Source 发送 TPS1 一段时间后,通过 AUX 通道读取 Sink 的 DPCD Link Status 寄存器:
0x0202 → LANE0_1_STATUS
0x0203 → LANE2_3_STATUS
其中,各 Lane 的 CR_DONE 用于表示 Clock Recovery 是否完成。
| DPCD 地址 | Lane | Bit 0 | Bit 1 | Bit 2 | Bit 4 | Bit 5 | Bit 6 |
|---|---|---|---|---|---|---|---|
0x0202 |
Lane 0 | CR_DONE |
CHANNEL_EQ_DONE |
SYMBOL_LOCKED |
--- | --- | --- |
0x0202 |
Lane 1 | --- | --- | --- | CR_DONE |
CHANNEL_EQ_DONE |
SYMBOL_LOCKED |
0x0203 |
Lane 2 | CR_DONE |
CHANNEL_EQ_DONE |
SYMBOL_LOCKED |
--- | --- | --- |
0x0203 |
Lane 3 | --- | --- | --- | CR_DONE |
CHANNEL_EQ_DONE |
SYMBOL_LOCKED |
如果所有Lane的CR_DONE都为1则表示:Sink 已经成功从 Source 的数据流中恢复出时钟,Clock Recovery 完成。随后进入下一阶段。
1.3 通道均衡(Channel Equalization)
当 Clock Recovery 成功后,进入 通道均衡(Channel Equalization) 阶段。
此时继续使用 Clock Recovery 阶段确定的 Lane Rate、Voltage Swing和 Pre-emphasis 参数。Source 通过 AUX 通道向 DPCD 寄存器 0x0102(TRAINING_PATTERN_SET)写入对应的训练模式,然后在 Main Link 上发送 TPS2、TPS3 或 TPS4 中的一种训练序列。
Sink 接收到训练序列后,会对信号进行分析,检测高速信号经过传输通道后产生的失真,并通过内部 Equalizer 调整接收参数。
与此同时,Sink 会通过 DPCD 状态寄存器向 Source 反馈通道均衡的结果。Source 主要读取 DPCD 0x0202 和 0x0203 中各 Lane 的 LANEx_CHANNEL_EQ_DONE 状态位,用于判断对应 Lane 是否完成通道均衡。
当所有正在使用的 Lane 的 CHANNEL_EQ_DONE 均为 1 时,表示所有 Lane 均已完成 Channel Equalization,可以进入后续的 Symbol Lock 和 Inter-Lane Alignment 阶段。
1.4 符号锁定与 Lane 间对齐(Symbol Lock and Inter-Lane Alignment)
1.4.1 符号锁定 (Symbol Lock)
DP 使用特定的数据编码方式,Sink 需要从接收到的高速数据流中准确识别 Symbol Boundary(符号边界)。
当 Sink 成功完成符号锁定后,会在 DPCD 0x0202 和 0x0203 中设置对应的 LANEx_SYMBOL_LOCKED 状态位。表示对应 Lane 已完成符号锁定。
1.4.2 Lane 间对齐 (Inter-Lane Alignment)
对于多 Lane DP 链路,仅仅保证每个 Lane 独立工作还不够。
由于不同 Lane 经过的物理通道存在差异,各 Lane 到达 Sink 的时间可能不同。因此,Sink 还需要对不同 Lane 的数据进行延迟调整,使各 Lane 的数据重新同步。
这一过程称为 Inter-Lane Alignment(Lane 间对齐)。
Sink 通过 DPCD 0x0204(LANE_ALIGN_STATUS_UPDATED)反馈 Lane 间对齐状态,其中:
DPCD 0x0204 Bit 0 = INTERLANE_ALIGN_DONE
当:
INTERLANE_ALIGN_DONE = 1
表示所有使用中的 Lane 已经完成对齐。
1.5 视频流传输(Video Stream Transmission)
当上述所有 Link Training 步骤均成功完成后,表示 Source 与 Sink 之间的 DP Main Link 已经建立。
Source 通过读取 DPCD 0x0202(LANE0_1_STATUS)、0x0203(LANE2_3_STATUS)以及 0x0204(LANE_ALIGN_STATUS_UPDATED),确认各 Lane 的最终训练状态以及 Lane 间对齐状态。
确认训练成功后,Source 通过 AUX 将 DPCD 0x0102(TRAINING_PATTERN_SET)设置为 0,退出 Training Pattern。随后停止发送 TPS,并开始在 Main Link 上传输正常的 DisplayPort 视频数据。
2 AUX 信号采集
AUX 是低幅度的差分信号,普通逻辑分析仪的数字输入无法直接识别。
因此,需要先对 AUX 信号进行电平处理和整形,将差分模拟信号转换为逻辑分析仪可以识别的数字信号。
这里使用一块带有 Comparator(比较器) 的 STM32 开发板,通过 MCU 内部比较器对 AUX+ 和 AUX− 进行差分比较,将 AUX 信号转换成数字波形。
2.1 配置 STM32 Comparator
选择 COMP1 进行配置。

- 勾选 Input+, 选择Input-信号为INM
- 勾选 ExternalOutput,表示将比较结果输出到外部。
比较器的基本工作原理是:
- Input+ > Input- → 输出高电平
- Input+ < Input- → 输出低电平

将待测试的 AUX 差分信号分别连接到 STM32:
- AUX+ → COMP1_INM (PA0)
- AUX− → COMP1_INP (PA1)
再将 比较器输出信号 COMP1_OUT(PA6) 接入 Logic Analyzer。
生成代码后,在程序中启动 COMP1:
HAL_COMP_Start(&hcomp1);
启动比较器后,AUX+ 和 AUX− 的差分电压经过比较器进行比较,原本的模拟差分信号就被转换成数字电平变化,随后即可使用 Logic Analyzer 进行采集。
2.2 AUX 信号电平处理
为了让 STM32 内部比较器能够可靠地处理 AUX 信号,这里采用 交流耦合 + 直流偏置 的方式对输入信号进行处理。
首先,通过电容进行交流耦合,隔离 AUX 信号中的直流电平,只保留信号的变化部分。
然后,通过电阻网络增加一个直流偏置,将比较器输入端的共模工作点设置在电源电压中间附近:
3.3 V / 2 ≈ 1.65 V
这样,经过处理后的 AUX 信号会以约 1.65 V 为中心上下摆动,同时 AUX+ 和 AUX− 之间的差分变化仍然可以被比较器检测到。
下面是具体的电路:

3 解码 AUX Channel 信号
3.1 安装 AUX Analyzer
采集到 AUX 的数字波形后,还需要对波形进行协议解析。这里使用开源的 AUX Analyzer 对 DisplayPort AUX Channel 进行解码。
首先下载 AUX Analyzer 扩展包:
https://github.com/Alex-the-Smart/DPAUXAnalyzer/tree/master/compiled/x64
将下载后的文件拷贝到 Logic 软件的 Analyzer 目录:
Logic\resources\windows-x64\Analyzers

重新打开 Logic 软件,在 Analyzer 列表中可以看到 AUX Analyzer。
点击 Add Analyzer,添加 AUX Analyzer。

然后选择需要分析的 Logic Analyzer Channel。

完成配置后,Logic 就可以对采集到的 AUX 数字波形进行协议解码,将原始的高低电平转换成可读的 AUX Read / Write、地址以及数据等信息。
这样,后续就可以直接通过 AUX Analyzer 观察 DisplayPort 的 DPCD 读写、Link Training 以及其他 AUX 通信过程。
4 Native AUX 包格式
- AUX request
| Byte | 位 | 字段 | 含义 |
|---|---|---|---|
| Byte 0 | [7:4] |
Command | 操作类型 |
[3:0] |
Address [19:16] |
地址高 4 位 | |
| Byte 1 | [7:0] |
Address [15:8] |
地址 |
| Byte 2 | [7:0] |
Address [7:0] |
地址 |
| Byte 3 | [7:0] |
LEN | 数据长度 - 1 |
| Byte 4... | Data | Write 时的数据 |
| Command | 含义 |
|---|---|
0x80 |
Native AUX Write |
0x90 |
Native AUX Read |
示例:

| 字节 | 内容 | 含义 |
|---|---|---|
| Byte 0 | 90 |
Native AUX Read |
| Byte 1 | 02 |
Address [15:8] |
| Byte 2 | 02 |
Address [7:0] |
| Byte 3 | 02 |
LEN = 2 → 读取 3 Bytes |
- AUX reply
| Byte | 字段 | 含义 |
|---|---|---|
| Byte 0 | Reply | AUX Reply 状态 |
| Byte 1... | Data | Read 操作返回的数据 |
| Reply | 含义 |
|---|---|
0x00 |
ACK,操作成功 |
0x01 |
NACK |
0x02 |
DEFER,需要稍后重试 |
示例:

| 字节 | 内容 | 含义 |
|---|---|---|
| Reply | 00 |
ACK |
| Data | 77 77 01 |
DPCD 数据 |