链路训练:USB 高速通信的“握手仪式”

大家好,这一章我们来聊聊 USB 链路训练。

很多工程师刚接触 USB 调试时,会被链路训练搞得晕头转向。我当年也一样。第一次用分析仪抓包,看到满屏幕的 TS1、TS2 序列,完全不知道它们在“聊”什么。后来才明白,这其实就是设备之间建立可靠通信的“握手仪式”。

说白了,链路训练就是链路两端协商出一个双方都满意的通信参数的过程。就像两个人见面,得先确认用哪种语言、说话多快、声音多大,才能开始聊天。

什么是链路训练?

在 USB 3.x 或更高版本中,链路层负责物理层和协议层之间的数据传递。但链路层不能上来就传数据。它得先确保物理层的信号质量足够好,时钟恢复没问题,比特锁定已完成。

这就引出了链路训练。它是一种状态机驱动的流程,目的是让接收端的 CDR(时钟数据恢复)锁定数据流,对齐比特边界,训练自适应均衡器,最终建立稳定的链路。

核心目标: 让链路两端的 RX 和 TX 达到比特级和符号级同步。

我在项目中遇到过很多次,明明 PCB 布线没问题,但 FPGA 就是无法进入 U0 状态。最后查出来,都是链路训练阶段出了岔子——要么均衡器没收敛,要么 TS1 序列被噪声干扰了。

LTSSM 状态机的作用

LTSSM(Link Training and Status State Machine)是链路训练的核心。它是一个协议定义好的状态机,总共有 12 个状态。嗯,其实不必一次全记住。你只需要知道,它负责链路从“不通”到“能用”的全过程。

表:LTSSM 主要状态

状态名 缩写 说明
电气静默 SS.Disabled 链路完全关闭,无信号
轮询 Polling 发送训练序列,检测远端信号
配置 Configuration 协商链路宽度和极性
热重置 Hot Reset 强制复位,重新训练
恢复 Recovery 信号丢失后尝试重新同步
主动 U0 正常工作,传输数据
电气空闲 U1/U2/U3 低功耗省电模式
调试技巧: 分析仪抓到的链路状态序列能直接定位问题。如果反复看到 Polling -> Configuration -> Polling 的循环,那大概率是均衡参数没谈拢。

训练序列:TS1 和 TS2

训练序列就像是链路帧的问候语。TS1 和 TS2 都是 16 字节的特定码型,但表达的信息不同。

TS1 用于初始训练。它包含链路编号和通道编号,还会表明发送端正在请求训练。TS2 则用于参数协商,它会带上均衡器和摆幅的设定值。

我一再跟团队强调,分析 TS1/TS2 时别只看是不是“有信号”。你得看内容。比如,链路两端如果宣告的链路编号不一致,训练就永远完成不了。

表:TS1 和 TS2 关键字段差异

字段 TS1 TS2
链路编号 包含 包含
通道编号 包含 包含
SSC 信息 不包含 包含
速度协商 不包含 包含
均衡器预设 不包含 包含

你想想看,TS1 就像说“你听得到我说话吗?我叫小明”。TS2 则像“我说话声音这么大可以吗?要不调小一点?”

D10.2 码型:训练序列的载体

TS1 和 TS2 本身是符号序列,但底层需要特定的物理码型来保证 CDR 锁定。这个码型就是 D10.2(K28.5 + D10.2 组合)。

D10.2 会产生 010101... 的比特模式,非常适合时钟恢复。我建议在调试时,先观察 D10.2 能否被正确接收。如果 CDR 连 D10.2 都锁不住,链路训练肯定失败。

我曾经遇到过一块板子,高速通道上的端接电阻虚焊,导致信号反射严重。D10.2 能收到,但 TS1 总是校验错误。嗯,这个问题找了整整两天才定位到。

链路训练完整流程

  1. 电气静默: 链路处于休眠状态,无信号。
  2. 轮询: 发送端连续发送 TS1 序列,等待接收端响应。
  3. 配置: 接收端检测到 TS1,也发送 TS1 回应。双方交换链路编号和通道编号。
  4. 速度协商: 使用 TS2 协商 Gen1/Gen2/Gen3 及均衡参数。
  5. 均衡训练: 发送 D10.2,接收端调整 CTLE 和 DFE 系数。
  6. 同步完成: 状态机进入 U0,开始正常数据传送。
避坑指南: 我曾经在 Gen3 链路设计时忽略了一个细节——均衡训练需要发送端配合调整 TX 预加重。如果两端预设不一致,训练会反复失败。调试前,先确认两部分各自的均衡能力。

为了更直观,我画了一张链路训练的流程简图。你看,它从 Polling 开始,经过几个判断节点,才到达 U0。

链路训练流程(LTSSM 关键路径) SS.Disabled Polling Configuration Recovery(均衡训练) U0(数据传输) 失败 训练成功标志 TS1/TS2 握手完成

好了,链路训练的基本概念就是这样。下次你拿到协议分析仪的日志,看到满屏的 TS1、TS2,就知道它们其实是状态机在一步一步地“握手”。

一句话总结: 链路训练 = 状态机控制的过程 + TS1/TS2 握手 + 均衡训练。这三样缺一不可。

我个人觉得,理解链路训练最好的方式就是动手抓一次波形。看看 Polling 阶段有哪些数据,再看看 Configuration 阶段链路两端是怎么讨价还价的。实际观察比看文档更有印象。