1. PHY 链路状态检查:Link Down 常见原因与排查步骤

说实话,干了这么多年车载网络,我遇到的问题里,十个有六个是 Link Down。它就像感冒——症状单一,但病因复杂。有时候你查半天发现只是线头松了,有时候改一天寄存器配置都没用。这节课,我把最常见的坑和我自己的排查习惯整理出来,希望能帮你少走弯路。

为什么 Link Down 特别让人头疼?

PHY 这层,说白了就是把数字信号变成模拟差分信号,然后在铜线上跑。一旦链路起不来,你没法确定问题在「发」还是「收」,也分不清是硬件、配置还是环境干扰。我见过有人拿示波器测了三天,最后发现是 PHY 的复位引脚焊盘虚焊。浪费时间啊。

所以我们需要一套系统化的检查思路,而不是瞎猜。

Link Down 常见原因归类

我习惯先把可能的原因分成四大类,然后再逐个排查。

原因类别典型表现常见具体原因
硬件问题完全无信号,或信号幅度极低线束断路/短路;连接器松动;PCB 走线阻抗不连续(Stub 过长);电源噪声或纹波超标;参考时钟丢失或频率偏差
配置问题PHY 能读到,但 Link 始终 downAuto-Negotiation 未使能;Master/Slave 配置冲突;PHY 地址错误;MDIO 时序不满足
环境干扰有时能 up 有时 down,或低温/高温时 downEMC/EMI 导致信号抖动超标;共模干扰;温度过高引起 PLL 失锁;湿度过大影响差分阻抗
软件/驱动问题上电初始化后 link down,复位后恢复PHY 复位时序太短;MDIO 读回数据一直为 0;中断处理未正确清除 pending 位;MAC 侧速度/双工模式不匹配

我的排查步骤(从物理层往上走)

我个人习惯按照下面的顺序来查,这样可以最快定位根因。

  1. 第一步:确认供电和时钟。 拿万用表测 PHY 电源引脚,我遇到过电压只有 2.8V(要求 3.3V)导致内部 PLL 无法锁定的情况。再用示波器看时钟引脚,频率精度必须在 ±50ppm 以内。
  2. 第二步:示波器看差分信号。 在连接器前端测 MDI 差分对。如果没波形,问题大概率在 PHY 之前的链路;如果波形幅度正常但 link 还是 down,那可能是对方 PHY 没响应。
  3. 第三步:读 PHY 核心寄存器。 通过 MDIO 读取以下寄存器:
// 典型排查寄存器(寄存器地址)
Reg 0x0 (Control)   : 检查 Reset 位 (bit 15) 是否释放,Auto-Neg 使能位 (bit 12)
Reg 0x1 (Status)    : 检查 Link Status (bit 2) 和 Auto-Neg Complete (bit 5)
Reg 0x4/0x5 (AN Advertisement / Link Partner Ability) : 确认两端能力一致
Reg 0x11 (1000BASE-T Status) : Master/Slave 配置是否冲突
Reg 0x1A (PHY Specific Status) : 某些 PHY 厂商自定义的链路状态

小技巧:我习惯读 Reg 0x1 两次,因为有些 PHY 的 Link Status 位是 latch 型的,读一次会清除,第二次才读到最新状态。第一次读如果为 1,说明链路之前 up 过,再 down 是后来发生的。

  1. 第四步:回环测试隔离问题。 把 PHY 配置为 Digital Loopback,让 MAC 发数据给 PHY,然后 PHY 直接返回。如果 MAC 能收到自己的数据,说明 PHY 数字部分和 MDIO 通路没问题;否则就是 PHY 硬件坏了。
  2. 第五步:交叉验证。 把怀疑有问题的板子换到已知正常的测试环境。我曾经遇到过一例,测了半天发现是对方的网关 PHY 配置了强制 100M,而我们的板子是 1000M 强制,两边根本谈不拢。

注意:千万不要跳过第一步直接改寄存器!很多人一上来就调 AN 寄存器,最后发现只是电源纹波大——白白浪费两个小时。我自己吃过这个亏。

一张图看懂排查逻辑

为了方便记忆,我把上面的步骤整理成流程图。你在实际排查时,可以照着这个路径走。

PHY Link Down 排查流程图 观察到 Link Down 电源/时钟检查 示波器看信号 读 PHY 寄存器 回环测试 测电压/纹波/频率 检查复位时序 看 MDI 差分幅度 看抖动和眼图 读 Reg 0/1/4/5/11 确认 AN 和 Master/Slave Digital Loopback MAC 发→PHY 回 交叉验证(换板/换环境) 定位到根因 排查原则:先硬件后软件,先被动后主动 不要碰寄存器,直到确认供电和信号没问题 回环测试是隔离 PHY 自身问题的最快方法 交叉验证能快速区分「板子问题」还是「对端问题」

避坑指南:我踩过的几个坑

  • 寄存器读出来全是 0xFFFF? 我曾经遇到过一次,MDIO 的 pull-up 电阻没焊,导致总线一直高电平,PHY 根本没应答。检查 MDIO 硬件、上拉电阻、时钟线。
  • 复位时序太短。 有些 PHY 要求复位低电平至少保持 1ms,而我当时用 GPIO 直接拉低了 10μs 就释放,结果 PHY 内部状态机没完成初始化。查 PHY 数据手册的复位时序要求。
  • 连接器插针弯了。 嗯,这个听起来低级,但在产线上真遇到过。我建议先肉眼检查连接器,别上来就上示波器。
  • Auto-Negotiation 两端不匹配。 一个设成强制 100M,另一个设成 Auto,结果 Link Partner 协商失败。最好统一用 Auto,或者两边都强制相同的速度和双工。

核心思想:Link Down 排查不是玄学。只要按照供电 → 时钟 → 信号质量 → 寄存器 → 回环 → 交叉验证的顺序走一遍,九成问题都能定位。剩下的那一成,往往是 PHY 本身挂了——直接换芯片吧。

好了,这一节到这儿。你对照那个流程图,下次遇到 Link Down 就不会抓瞎了。记住,别一上来就怀疑软件,先看物理层。