我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

YT8521SH千兆PHY硬件设计:电源复位LED与uboot调试实战

YT8521SH千兆PHY硬件设计:电源复位LED与uboot调试实战 做网络产品的嵌入式开发几乎都会在某个阶段和 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-idRMII 就写 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-phy1 { 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 频率配置得太高接近 25MHzPHY 的总线响应时间跟不上。把 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 释放后大约只过了 3msuboot 就开始访问 PHY。而 YT8521SH 手册要求复位释放后至少等待 5ms 才能进行 MDIO 访问。uboot 之所以能成功是因为第一笔 MDIO 访问发生在复位释放后的 4ms 左右刚好赶上 PHY 状态机快初始化完的时候读 ID 操作碰巧成功但后续访问时状态机还没完全稳定所以读取结果时好时坏。这个问题最终是在 uboot 设备树里把 reset-delay-us 从默认值改成 10000 解决的。改完之后无论上电多少次PHY 都能稳定识别链路也再没掉过。这个案例给我的教训是PHY 调试不要仅仅看“能不能读”还要看“每次是否都能稳定地读”。所有时序相关的参数第一优先级是满足手册要求而不是正好够用。如果你手头也在做 YT8521SH 或者类似 PHY 的板子记住一个总原则硬件设计时把电源时序、复位时序、LED 引脚复用这三件事想清楚uboot 阶段优先确认 MDIO 能稳定读 ID再谈驱动的功能和优化。这个顺序走下来大多数 PHY 问题都能在早期暴露并解决而不是等到整机测试时才炸出来。
返回列表