第1章 链路训练概述

什么是链路训练?

说白了,链路训练就是两个以太网接口在物理层“握手”的过程。握手成功,链路才能正常收发数据;握手失败,端口就瘫在那了。

我记得刚入行那会儿,带我的老师傅跟我说:“链路训练没跑通,后面调啥都是白扯。”当时还不以为然,直到自己踩过坑才明白——这句大实话。

链路训练的核心任务很简单:

  • 时钟恢复——接收端从数据流里把时钟“拽”出来。
  • 均衡参数——根据信道质量调整发射/接收端的均衡器系数。
  • 码型同步——双方对数据帧的起始位置达成一致。
  • 能力协商——包括速率、双工模式、流控、EEE等。

当然,不同速率标准(比如1G BASE-T、10G BASE-T、25G/100G SerDes)的具体训练流程不尽相同,但底层逻辑是一致的——发训练帧、收训练帧、交换参数、锁定链路。

为什么链路训练会出问题?

原因多了去了。我遇过的最“冤”的一次是:链路偶尔断开又恢复,查了三天,最后发现是板上一颗电容虚焊导致信号眼图塌了,训练始终无法完成最后的锁定阶段。

常见的问题根源包括:

  1. 物理层参数不匹配——比如某厂商芯片的预强调默认值太高,对端吃不消。
  2. 噪声/干扰超标——PCB走线之间串扰大,训练帧被误码吞掉。
  3. 自动协商(AN)失败——双方对能力广告的解读不一致,导致降级或拒连。
  4. EEE模式冲突——一端开了节能以太网唤醒定时器,另一端没开,低功耗唤醒时链路重训练失败。
  5. 时钟精度越界——本地参考时钟ppm偏差太大,接收端锁相环拉不住。

关键认知:链路训练的失败,往往不是单一原因,而是多个因素叠加的结果。排查时别揪着一棵树不放,要按流程走。

链路训练的主要阶段

我习惯把链路训练分成三个大阶段,你对照着去抓日志、看状态寄存器,心里就有谱了。

阶段 做什么 常见失败点
初始化与能力发现 发送基础训练帧,报告自身能力(速率、FEC、EEE等) 广告帧格式错误、时钟未锁定
均衡与参数交换 调整发射均衡、接收均衡,交换链路质量度量 均衡系数收敛慢、信噪比过低
锁定与验证 双方确认参数一致,发送IDLE符号,链路进入UP状态 超时、误码率超标、EEE握手错位

举个例子,10G BASE-T的链路训练状态机里,有Training、Wait_For_Valid、Locked等多个子态。我曾经调试一个案例,芯片一直卡在Wait_For_Valid,看寄存器发现对端的训练帧差分幅值始终低于门限——后来换了根合格线缆立马搞定。

我的调试小技巧:初期先用示波器看差分信号幅度,眼图张开度至少达到规范要求的70%再去查协议层,能省一半时间。

链路训练与AN、EEE的关系

自动协商(AN)发生在链路训练之前还是之中?很多人搞混。其实在千兆及以下速率,AN是独立阶段,完了才做训练;但在10G及以上,AN已经被整合进训练帧里了——咱们查标准时要注意BASET vs BASE-KR的区别。

EEE(节能以太网)对链路训练的影响更隐蔽。当EEE进入低功耗模式(LPI),收发器会停掉部分电路;唤醒时,需要重新执行一次“快速训练”或“部分重训练”。如果两端EEE计时器不一致,或者唤醒时的训练参数丢失了,吞吐就会异常波动。

注意:很多固件工程师容易忽略EEE的链路重训练超时设置。我曾遇到一个案例,EEE唤醒后重训练超时默认设了10ms,而对端只等了5ms,结果链路在唤醒后一直交替UP/DOWN,吞吐惨不忍睹。

链路训练核心流程 链路训练核心流程 物理层上电/复位 阶段1:初始化与能力发现 发送训练帧 · 报告能力 · 时钟恢复 阶段2:均衡与参数交换 调整TX/RX均衡 · 交换链路质量度量 收敛? 重训练/回退速率 进入阶段3 阶段3:锁定与验证 发送IDLE · 误码率检查 · 链路UP 重训练路径 成功路径 EEE唤醒分支

训练失败时的“三板斧”

在我做过的几十个训练异常排查项目中,有三步操作几乎每次都能快速定位问题方向,分享给你:

  1. 看状态寄存器——先读PHY的链路训练状态机寄存器,卡在哪个子态一清二楚。
  2. 抓训练帧——用示波器或逻辑分析仪抓差分线上的训练帧,看看幅度、抖动、编码是否正确。
  3. 对比两侧参数——把对端PHY的能力广告寄存器和本端列出来,肉眼找差异。

避坑指南:我曾经犯过一个低级错误——两侧PHY芯片都是同一家供应商,但固件版本不同,导致EEE唤醒定时器微调参数不一致。从那以后,我坚持做系统横向时把固件版本号也写进测试报告。

嗯,链路训练的概念就这些。理解了这个“握手”过程,后面的AN和EEE模式影响你会看得更透。咱们实战中碰到的多数怪问题,归根到底都是这个阶段没走利索。