☰
YT8521SH千兆PHY硬件设计:电源复位LED与uboot调试实战
2026/10/6 14:52:38 网站建设 项目流程

做网络产品的嵌入式开发,几乎都会在某个阶段和 PHY 芯片打交道。YT8521SH 是国产 10/100/1000M 自适应以太网 PHY 里用得比较多的一颗,很多项目选它是因为供货稳定、性价比高,而且和主流 MAC 的兼容性做得不错。但这颗芯片想真正跑稳,并不是把原理图从参考设计抄过来就行——电源、复位、LED 这些看似外围的电路,往往会决定 uboot 阶段能不能顺利读到 PHY ID、驱动能不能正常 link 起来。

这篇文章我会从硬件电路设计讲起,一直讲到 uboot 下驱动适配和调试验证,把 YT8521SH 的复位、LED、电源这几个方向逐个拆开,结合我实际做过的板子把过程中的思路、参数计算和踩坑记录整理出来。适合正在做网络接口板卡、交换机、路由器或者需要大流量数据交互的嵌入式产品开发工程师参考,也适合刚接触 PHY 芯片调试、想搞明白“为什么 uboot 读不到 PHY”这类问题的人。

1. 着手前的摸底:YT8521SH 是什么,设计思路怎么定

1.1 芯片定位与整体设计节奏

YT8521SH 是裕太微电子推出的一款单口千兆以太网 PHY,支持 RGMII / MII / RMII 多种 MAC 接口模式,内部集成 DSP 均衡器和自适应均衡功能。它默认工作在千兆模式,也能向下兼容 100M / 10M,支持自动协商。芯片本身不需要额外固件,上电后用 MDIO 总线配置寄存器就可以工作。这和很多传统 PHY 的使用习惯是一致的——硬件上电后 PHY 就有一个默认状态,软件再去修改工作模式。

这个芯片的设计难点不在 PHY 本身,而在周边三件事:电源时序、复位稳定度、LED 和状态引脚的复用。这三件事如果设计时没想清楚,后续 uboot 阶段和内核阶段都会出现莫名其妙的“时好时坏”问题,而且极难排查。

我做这个项目时的节奏是“先硬件后软件,但软件方案反推硬件设计”。说白了,画原理图之前就得想好 uboot 下 MDIO 总线准备怎么初始化、PHY 地址设计成多少、LED 引脚是由 PHY 内部驱动还是由主控 GPIO 控制。这些决定会直接影响原理图上 RXD 引脚的上拉下拉电阻、LED 电路形态,以及复位引脚的接法。如果等板子回来再想软件方案,改板成本就高了。

1.2 开工前的准备清单

YT8521SH 的设计参考最权威的自然是官方 Datasheet 和参考原理图,这两个文件是最低要求。如果拿不到参考原理图,也至少要拿到芯片的管脚定义表,尤其是 RGMII 接口引脚、MDIO/MDC 引脚、LED 引脚以及复位引脚的确切位置。因为这些引脚往往不是按功能顺序排列的,画原理图时容易漏掉串阻或上下拉。

除了芯片手册,还需要准备的工具和资料如下:

  • 示波器,至少 100MHz 带宽,用于测量 PHY 的时钟、复位波形和 MDIO 时序。
  • 支持 MDIO 调试的 uboot 版本,如果 uboot 自带 mii 命令,会省掉很多功夫。
  • 一块能稳定输出 3.3V 和 1.1V / 1.2V(具体看手册)的电源板,用于验证电源设计。
  • 串口终端,用于 uboot 启动日志查看和命令交互。

工具这块可以最后准备,但 uboot 源码最好从一开始就拉下来,哪怕是先看看驱动框架也能帮你理解 MDIO 的寄存器操作流程。

2. 硬件电路设计:电源、复位、LED 三件套逐个拆

2.1 电源部分:多路电压域与上电时序

YT8521SH 的电源我拿到手册后第一反应是:怎么这么多 VDD。实际上它内部有模拟电路、数字核心、I/O 接口,不同部分对电压的要求不一样。绝大多数千兆 PHY 都需要一路 1.1V 左右的核心电压和一路 3.3V 的 I/O 电压,有些还单独给模拟收发前端一路电压。

具体到这颗芯片,我设计的板卡用了两个电源域:3.3V 给 I/O 和大部分外围,1.1V 通过一颗低压差 LDO 从 3.3V 转出来给核心和模拟部分。这里有个关键点:PHY 的数据手册通常会给出一个上电时序要求,常见的说法是“核心电压要先于 I/O 电压到达,且 I/O 电压不能早于核心电压超过一定时间”。如果你把 1.1V 和 3.3V 直接用两个独立的 LDO 供电并且没有时序控制,就可能出现 PHY 内部逻辑错误初始化的问题。

我在最初一版原理图上犯过一个错:3.3V 和 1.1V 各自来自两片 LDO,但 3.3V 的 LDO 使能脚接到了系统总电源,1.1V 的 LDO 使能脚接到了主控 GPIO。结果是上电时 3.3V 先起来,PHY 的 I/O 部分已经工作了,但核心电压还没到,偶尔导致 PHY 的 MDIO 寄存器读取异常。后来我把两级电源改成了一颗带时序控制功能的 DC-DC,或者简单一点,用 RC 延时把 3.3V LDO 的使能脚拉后几毫秒,问题就消失了。

去耦电容的布局优先级也很高。每一路电源引脚旁边都要放一个 0.1uF 的小电容,并且在 PHY 附近放一颗 10uF 左右的钽电容或陶瓷电容做储能。模拟电源和数字电源建议通过磁珠隔离,避免数字噪声串到模拟收发前端造成信号质量下降。磁珠的选择并没有什么玄学,100MHz 阻抗 100 欧姆左右的常规磁珠就够用。

注意:PHY 芯片的电源设计不能只看电压对不对,还要看电流峰值。千兆 PHY 在收发数据时电流变化很快,如果电源路径阻抗过高,会导致 1.1V 电源出现压降尖峰,轻则偶尔丢包,重则在长时间高负载下复位重启。

2.2 复位电路:低电平有效、RC 延时与异步复位同步释放

YT8521SH 的复位引脚一般叫 RESET_N,低电平有效。这意味着复位期间这个引脚要拉低,释放时拉高。很多人觉得复位电路简单,一个 RC 就能搞定,但实际上最容易出问题的就是复位释放的边界问题。

先看最简单的 RC 复位电路:一个电阻从 3.3V 接到 RESET_N,一个电容从 RESET_N 接到 GND。上电时电容充电,RESET_N 保持低电平一段时间,等电容充到阈值以上,复位解除。RC 时间常数大致可以按照 R x C 来计算,我用 10k 欧姆电阻和 0.1uF 电容组合,时间常数约 1ms。这个参数看起来合理,但一定要看 PHY 手册对复位脉冲宽度的要求。有的 PHY 要求复位低电平脉宽最短 1ms,如果你的 RC 参数算出来的低电平时间只有几百微秒,复位就不彻底。

如果主控有足够的 GPIO,我更建议直接用主控 GPIO 控制复位。这样 uboot 启动时可以通过软件拉低再拉高实现精确复位控制。唯一要注意的是,主控 GPIO 上电默认状态如果是高电平,而 PHY 的复位脚恰好通过一个下拉电阻被拉低了,就会导致 PHY 一直处于复位状态。所以用 GPIO 控制复位时,建议加一个小电容和电阻,确保上电瞬间 RESET_N 保持低电平,等主控起来后再由软件释放。

这里还引出一个和 FPGA 设计相关的概念——异步复位同步释放。很多做 FPGA 的人对这四个字很熟,简单说就是复位信号本身是异步的,但在释放时要和时钟同步,避免产生亚稳态。像 PHY 这种芯片虽然不比 FPGA 那么敏感,但复位释放瞬间如果正好赶上 MDIO 总线上的时钟跳变,确实有可能让芯片内部状态机初始化异常。所以,比较稳妥的做法是复位信号通过一个带同步器的逻辑产生,或者在 uboot 的代码里加至少几个毫秒的延时再访问 PHY 寄存器。

提示:复位释放后不是立刻就能访问 PHY 的。YT8521SH 手册里通常会写一个“软件可访问时间”,一般是复位释放后若干毫秒。如果你在 uboot 的 PHY 驱动里没有做这个延时,就会出现第一次 mii 命令读不到 ID、第二次却正常的情况。很多“上电后必须复位一次才能识别 PHY”的怪问题,根源就是延迟不够。

2.3 LED 指示灯电路:驱动能力、限流电阻和状态配置

YT8521SH 一般提供两个 LED 引脚,可以分别配置为 LINK / ACT 指示,也可以配置为速度指示。LED 的设计看似简单,但里面有几个容易忽略的点。

第一,LED 引脚是灌电流驱动还是拉电流驱动,或者说内部结构是开漏还是推挽。不同的 PHY 不一样,YT8521SH 的 LED 引脚驱动能力和输出极性是可以配置的。设计时我建议先按“外部上拉 + 低电平点亮”的方式处理,因为这种方式兼容性更好。具体做法是 LED 正极接 3.3V,负极通过限流电阻接到 PHY 的 LED 引脚,PHY 引脚默认输出高电平不亮,输出低电平点亮。

限流电阻的计算也不难。3.3V 减去 LED 正向压降(约 2.0V,红色 LED 大约 1.8~2.2V),再减去 PHY LED 引脚内部晶体管的饱和压降(约 0.2V),剩下的电压除以想要的工作电流。假设想要 LED 工作电流在 5mA,这个电流对应亮度已经不错了,那么电阻就是 3.3 - 2.0 - 0.2 = 1.1V,除以 5mA,得到 220 欧姆。我用 1k 欧姆的电阻时会发现 LED 偏暗,用 100 欧姆时又太亮且加大电流负担,最后选了 470 欧姆,视觉效果和功耗都比较平衡。

第二,LED 引脚可能和 PHY 的配置引脚复用。YT8521SH 有部分引脚在复位释放时会被当成 PHY 地址配置或模式配置引脚,等复位结束后才切换为 LED 输出功能。这意味着你的原理图上不能只想着接 LED,还要考虑复位期间这些引脚的电平会不会影响 PHY 的模式选择。比如某个 LED 引脚在复位时被采样为主从模式选择,你把它直接接了一个 LED 到地,相当于给这个引脚一个低电平,可能就把 PHY 配置到了非预期的工作模式。解决方法很简单:LED 和 PHY 引脚之间串联一个 1k 左右的电阻,再在 PHY 引脚侧放一个小电容,这样不会影响复位时的电平采样,也不影响 LED 的正常点亮。这一点我在第一版设计时没有注意,导致 PHY 每次上电都进入了错误的接口模式,调试了很久才发现。

3. 从原理图到 uboot:第一步是让 MDIO 通起来

3.1 MDIO 接口与 PHY 地址设定

硬件设计确认后,调试的第一个里程碑不是网络能 ping 通,而是 uboot 能通过 MDIO 读到 PHY 的寄存器内容。MDIO 是 MAC 和 PHY 之间串行管理接口的标准,两根线:MDC 是时钟,MDIO 是数据。MDIO 协议本身是简单的双向半双工串行协议,主控制器发起访问,PHY 根据 PHY 地址和寄存器地址响应。

YT8521SH 的 PHY 地址常见的是 0x00 到 0x1F,具体由引脚电平决定。芯片手册会给出 PHY 地址配置引脚的说明,一般是几个复用引脚在复位期间的电平组合。设计时将需要的地址电平固定即可。我在板卡上把 PHY 地址设成了 0x01,也就是把对应的地址引脚拉高。这个值拍脑袋定的,但有个原则:不要让板卡上两颗 PHY 用同一个地址,否则 MDIO 总线会冲突。

MDIO 总线的上拉电阻也值得留意。MDIO 是双向开漏拓扑,通常需要上拉电阻。上拉电阻值一般取 1k 到 10k 之间,MDC 时钟频率较高时电阻可以取小一些。YT8521SH 的 MDIO 接口时钟我一般用 2.5MHz 左右,既满足协议要求,又不会因为信号完整性问题导致误码。

在 uboot 层面,MDIO 总线的初始化通常由 Ethernet MAC 驱动的 mdio_register 流程完成,核心是提供两个函数:read 和 write。以设计 RGMII 接口为例,MAC 通过一组寄存器模拟 MDC/MDIO 时序,CPU 写几个寄存器就能完成一次 MDIO 读操作。有的主控用 GPIO 模拟 MDIO,但性能会差一些。如果板卡上还有第二颗 PHY,可以把两个 PHY 挂到同一对 MDC/MDIO 线上,只要地址不同就行。

3.2 uboot 基础配置与设备树节点适配

现在的 uboot 已经高度设备树化了,以太网控制器、MDIO 总线、PHY 节点都可以在设备树里描述。适配的流程大致两步:第一,确保 MAC 节点里的 phy-mode 和硬件实际接法一致,比如 RGMII 就写 rgmii-id,RMII 就写 rmii;第二,在 mdio 节点下面添加 PHY 节点,指定 reg 为 PHY 地址。

拿典型的设备树片段来说:

&eth0 { status = "okay"; phy-mode = "rgmii-id"; phy-handle = <&phy0>; mdio { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@1 { reg = <1>; reset-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; reset-delay-us = <10000>; }; }; };

这里的 reset-gpios 和 reset-delay-us 是许多 PHY 驱动都支持的通用属性,uboot 会先拉低复位 GPIO,再延时 10ms,然后拉高并继续等待,最后才访问 PHY。resource-delay-us 就是前面提到的“复位释放后等待时间”,根据 PHY 手册填一个保守值就行。如果主控不支持 GPIO 复位,也可以不加这个属性,但必须在硬件上保证复位释放到 uboot 访问之间有时间差。

设备树配置好后,uboot 编译时还需要确认以太网驱动编译进去了。一般是通过 defconfig 里的 CONFIG_CMD_MII 和对应网卡驱动宏开启,具体看主控平台。

注意:不同主控的 uboot 驱动对 phy-mode 字符串的解析有差异。同样是 rgmii 接口,有的平台需要写成 rgmii-id,有的需要 rgmii-txid。这个字符串决定了 MAC 端是否开启延时,并且直接关系到 RGMII 接口的时钟相位匹配。如果你配错了,链路可能依然能起来,但速度可能只有 100M,或者 ping 大包一直丢。

3.3 验证 PHY 是否被识别:寄存器读取与 mii 命令

uboot 启动到命令行后,第一步先看启动日志里有没有打印 PHY 的信息。如果驱动没有报错,但也没有 PHY 信息,就用 mii 命令手动查看。

在 uboot 命令行下:

mii info

这个命令会列出当前 MDIO 总线上所有能读到的 PHY 地址。如果 YT8521SH 正确上电且复位释放了,应该能看到 address 01 对应的 PHY。接着可以读取 PHY 的 ID 寄存器:

mii read 01 02 mii read 01 03

寄存器 0x02 和 0x03 的内容组合起来就是 PHY 的 32 位 ID。YT8521SH 的 ID 值具体要看手册,但一般前两个字节会有厂商代码特征。看到非 0xFFFF 且非全 0 的值,就说明 MDIO 通路基本正常。如果 mii info 没有发现任何 PHY,优先检查 PHY 地址配置、MDIO 上拉、复位引脚状态和电源电压。

当 uboot 能正常读取 PHY 寄存器后,再考虑让 MAC 驱动自动探测 PHY。这一步通常不需要改代码,只要设备树描述正确,驱动就能自己完成 PHY 的识别和配置。

4. 常见问题排障与驱动适配要点

4.1 读不到 PHY ID 的排查清单

我在初期调试时遇到过很多次“uboot 找不到 PHY”的情况,最终总结成下面这个排查顺序表,基本上能覆盖 90% 的原因。

现象可能原因排查方法
mii info 之后没有任何 PHYPHY 地址引脚配置错误核对复位采样时地址引脚的上下拉电平
mii info 之后只有 0x1F 地址MDIO 总线没上拉或上拉电阻过大示波器量 MDIO 空闲电平,确认不是低电平
能读到 ID 但值为 0x0000PHY 复位未释放或电源异常量 RESET_N 和核心电压,确认时序
能读到 ID 但值很奇怪MDC 时钟频率过高或信号质量差降低 MDC 频率,检查走线长度
可以读到 ID 但 link 不起来RGMII 时钟延时配置不对检查 phy-mode 和 MAC 侧时钟延时寄存器
上电第一次读不到,复位后能读到复位释放后等待时间太短增加 reset-delay-us,或代码里加 mdelay

这里要特别强调一次我的实操经历:有一版板子 mii info 能扫到 PHY,但读 0x02/0x03 全是 0x0000,反复检查电源和复位都没问题。后来用示波器抓 MDIO 波形,发现 PHY 在响应读操作时把 MDIO 拉低了,但 MAC 端采样时刻偏早,导致读到的都是 0。原因是我把 MDC 频率配置得太高,接近 25MHz,PHY 的总线响应时间跟不上。把 MDC 降回 2.5MHz 后一切正常。这个细节在手册里虽然有标注,但不实测很难预判。

4.2 复位和电源两大“经典坑”

先说复位。如果复位引脚上直接接的是一个大电容,上电时充电时间较长,可能导致复位低电平时间过长,影响上电初始化时序。反过来,如果 RC 时间太短,复位脉冲宽度不够,芯片内部的模拟电路没完全复位,就会出现读寄存器偶尔失败的怪症状。比较安全的做法是:RC 时间常数不低于手册要求的最小复位脉宽,同时 uboot 里再叠加一次软件复位(通过 MDIO 的 BMCR 寄存器 bit15 软复位)。软复位之后也要延时,一般 2ms 左右,等待 PHY 内部状态机恢复。

再说电源。有一版样机在 100M 模式下工作正常,千兆模式下经常无规律断链,最后定位到问题出在 1.1V 电源纹波过大,峰值纹波到了 80mV 左右。PHY 内部核心电压对纹波是有要求的,超过一定范围后内部的锁相环和均衡器工作就不稳定。解决办法是加大输出电容、调整 LDO 的补偿网络,并把数字地和模拟地在 PHY 下方单点连接。改完以后纹波降到 30mV 以内,问题消失。

4.3 LED 电路的常见小问题

LED 不亮是最常见的问题,但原因往往很简单:接反了极性。PHY 的 LED 引脚如果是灌电流方式,你就不能把 LED 阳极直接接 PHY 引脚,必须把 LED 阳极接电源、阴极通过电阻接到 PHY。如果极性反了,LED 永远不亮。

LED 常亮的另一个可能是 PHY 检测到了 link 但是没有任何活动。如果芯片处于“一直 link 但没有数据”的状态,LINK 指示灯常亮是正常的。如果希望 LED 闪烁表示活动,需要配置寄存器把 LED 功能设置为 ACT。YT8521SH 的 LED 功能配置不是通过 GPIO 控制的,而是寄存器里有一组模式选择位,按手册配置即可。

另外,有一个项目上的小技巧:LED 引脚的分压会影响 PHY 正常工作,因此建议在 LED 引脚和 PHY 内部之间不要走太长的走线,最好就近接地,避免 LED 线缆成为天线引入噪声,影响 PHY 的灵敏度和误码率。

4.4 驱动适配中的寄存器操作要点

uboot 下的 PHY 驱动最终还是要落到寄存器的读写配置上。YT8521SH 这类 PHY 基础寄存器遵循 IEEE 802.3 标准,0x00 是控制寄存器,0x01 是状态寄存器,这两个地址在任何驱动里都是必须要操作的。

0x00 寄存器最常见的操作是软复位,bit15 置 1 后 PHY 会恢复到默认状态。驱动初始化时通常先做一次软复位,再配置自动协商或强制速度。自动协商通过 bit12、bit13 等位控制,全部置 1 表示开启 1000M、100M、10M 自动协商。强制速度则需要把自动协商关闭,同时设定速度位和双工位。

YT8521SH 这类芯片还会有些厂商自定义的扩展寄存器,包括 LED 控制、RX 信号改善、MDI/MDIX 交叉检测配置等。在 uboot 阶段一般不建议动这些扩展寄存器,保持默认值即可。如果确实遇到信号质量问题,比如长线互联时 CRC 错误很多,可以按手册调整均衡参数,但一定要记录清楚原值,避免调试过程中改乱。

5. 一个实战复盘:复位释放时间不够引起的“幽灵”故障

最后分享一个我印象很深的调试案例。板卡上电后,uboot 里 mii info 能扫到 PHY,也能正常读取 ID,但是 Linux 内核阶段经常报“PHY ID 读取失败”的警告,用着用着网就断了。一开始以为是内核驱动和 uboot 驱动不完全兼容,花了很长时间对比两边的 MDIO 配置。

后来我用示波器同时抓了 RESET_N 和 MDIO 的波形,发现 RESET_N 释放后大约只过了 3ms,uboot 就开始访问 PHY。而 YT8521SH 手册要求复位释放后至少等待 5ms 才能进行 MDIO 访问。uboot 之所以能成功,是因为第一笔 MDIO 访问发生在复位释放后的 4ms 左右,刚好赶上 PHY 状态机快初始化完的时候,读 ID 操作碰巧成功,但后续访问时状态机还没完全稳定,所以读取结果时好时坏。

这个问题最终是在 uboot 设备树里把 reset-delay-us 从默认值改成 10000 解决的。改完之后无论上电多少次,PHY 都能稳定识别,链路也再没掉过。这个案例给我的教训是:PHY 调试不要仅仅看“能不能读”,还要看“每次是否都能稳定地读”。所有时序相关的参数,第一优先级是满足手册要求,而不是正好够用。

如果你手头也在做 YT8521SH 或者类似 PHY 的板子,记住一个总原则:硬件设计时把电源时序、复位时序、LED 引脚复用这三件事想清楚,uboot 阶段优先确认 MDIO 能稳定读 ID,再谈驱动的功能和优化。这个顺序走下来,大多数 PHY 问题都能在早期暴露并解决,而不是等到整机测试时才炸出来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询