尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

嵌入式以太网接口详解:MAC、PHY与MII家族演进

嵌入式以太网接口详解:MAC、PHY与MII家族演进 做嵌入式这几年几乎绕不开以太网。不管是STM32PHY做工业网关还是FPGA接RGMII做高速数据采集甚至是车载以太网里的SGMII你总会遇到MAC、PHY、MII、RMII、GMII、RGMII这一堆缩写。第一次接触的人十有八九被绕晕MAC和PHY到底谁干谁的活MII、RMII、GMII、RGMII之间是什么关系为什么有人用RMII、有人用RGMII还有人直接上SGMII这篇就从基本概念和接口演进的角度把这一坨讲清楚。这是我的系列第一篇先把地基打好后续再深入讲协议栈、调试和实战排错思路会更顺。这篇内容适合刚接触以太网的嵌入式工程师、FPGA开发者也适合想搞懂车载以太网和工业以太网底层原理的硬件/软件工程师。相信我搞懂这几个接口的区别和背后的取舍你做方案选型、查bug、看原理图的时候会舒服很多。1. 整体认知以太网的分层和“分家”逻辑1.1 从一次网络通信说起谁在干活我们先从一次最简单的网络通信说起。你的板子要发一个UDP包给电脑数据从应用程序出发经过TCP/IP协议栈打包到最后变成网线上的差分信号这个过程里芯片到底做了什么很多人以为网卡一颗芯片就把事全干了实际上在绝大多数嵌入式方案里这是两颗芯片或者一颗SoC内部的两个模块配合完成的一颗叫MAC一颗叫PHY。MAC全称Media Access Control媒体访问控制PHY全称Physical Layer物理层收发器。名字已经把分工写清楚了MAC负责“控制”PHY负责“物理”。MAC这边管的是逻辑层面的活把IP包封装成以太网帧加上目的MAC、源MAC、类型/长度字段算CRC校验接收的时候反过来解析帧、验证CRC、把数据交给上层。同时MAC还要管CSMA/CD载波监听多路访问/冲突检测这种信道访问机制——当然现在全双工链路下基本用不到了但半双工时代这可是看家本领。PHY这边管的是真正上线的活把MAC送过来的并行数据变成串行比特流再编码成适合在铜缆上传输的电平信号。比如100M用的MLT-3编码1000M用的PAM-5编码还包括时钟恢复、自动协商Auto-Negotiation、链路状态检测以及和网口变压器、RJ45插座之间的模拟前端电路。换句话说MAC是“文书官”PHY是“装卸工司机”一个做协议处理一个做信号传输。1.2 为什么非要“分家”不能合成一颗既然分两颗芯片会让布线、成本、调试都变麻烦为什么不直接做一颗MACPHY集成的芯片实际上确实有这样的集成方案很多MCU内部直接带MAC和PHY比如STM32某些型号、部分工业SoC。但更常见的场景是MAC在MCU/FPGA/处理器内部PHY在外部单独一颗这背后有几个现实原因。一是物理介质和工艺的差异。PHY要处理模拟信号对抗ESD、浪涌、线缆退化通常需要更成熟的模拟工艺和专门的模拟前端设计MAC是纯数字逻辑跟着SoC的制程走就好。把两者硬捏在一起SoC的工艺选择会非常受限成本也压不下来。二是灵活性和可替换性。不同应用场景对PHY的要求不一样工业现场可能要用支持宽温、长距离的PHY消费电子更看重功耗和成本车载则要过AEC-Q100认证和功能安全。如果把PHY固定在SoC里你换一种应用场景就得换整个SoC。分开之后MCU/FPGA随便选PHY按项目需求挑国产的、进口的、百兆的、千兆的各自独立升级这是硬件工程师最喜欢的解耦方式。三是PCB布局和信号完整性的现实。PHY离网口变压器和RJ45越近越好而MAC通常和主控逻辑在一起两者物理位置天然有分离需求。分开布局可以各自优化把高速数字信号和模拟信号隔离开EMI也好控制。明白了这个“分家”逻辑后面所有接口问题都好解释了MAC和PHY之间需要一套标准的数字接口让两颗芯片能对话这就是MII家族存在的意义。2. MII系列接口逐个拆解从MII到RGMII的演进逻辑2.1 为什么需要这么多“MII”MII全称Media Independent Interface媒体独立接口。注意这个“Media Independent”翻译过来就是“和具体传输介质无关”。这套接口的设计初衷就是让MAC不需要关心底层是双绞线、光纤还是别的什么介质只要通过MII接口和PHY对接就行介质相关的活儿全由PHY处理。既然有了MII为什么后面又冒出RMII、GMII、RGMII、SGMII核心驱动力只有一个带宽不够用了得加宽或者提速。这跟道路拥堵了就修路、修完路还是堵就修高架是一个道理。我们从最早的MII开始看看每一代接口到底解决了什么痛点出现了什么新问题。这个过程理解透了你看到任何一款芯片的接口列表基本都能立刻判断出它大概是什么定位、内部架构大概什么样甚至能推测出它的功耗和Pin脚规模。这是硬件工程师的“读图能力”里很重要的一块。2.2 MII100M时代的基准接口MII出现在10/100M以太网时代数据位宽4bit时钟频率25MHz100M模式或2.5MHz10M模式。发送方向MAC在TX_CLK的上升沿把4位数据打给PHY接收方向PHY在RX_CLK的上升沿把4位数据打给MAC。MII总共需要几根关键信号线TX_CLK发送时钟由PHY提供RX_CLK接收时钟由PHY提供TXD[3:0]发送数据RXD[3:0]接收数据TX_EN发送使能RX_DV接收数据有效CRS载波侦听COL冲突检测MDC/MDIO管理接口用来读写PHY寄存器注意一个反直觉的点TX_CLK和RX_CLK都是PHY提供的因为PHY侧有本地晶振或从接收信号里恢复时钟MAC只是被动适配PHY给出的时钟。这个细节在调试时很重要排查时钟问题时别找错源头。MII是10/100M时代的经典接口但它的缺点也很明显信号线多一共十几根而且时钟在25MHz时沿速率要求高PCB布线上要考虑等长匹配。在MCU管脚紧张、PCB面积受限的场景下MII并不友好。于是在MII基础上出现了精简版RMII。2.3 RMII为省管脚而生的简配方案RMII全称Reduced Media Independent Interface精简媒体独立接口。它最大的特点是把数据位宽从4bit砍到2bit时钟频率从25MHz提到50MHz。位宽减半、频率翻倍总带宽不变但信号线数量大幅减少。RMII只需要REF_CLK50MHz参考时钟TXD[1:0]发送数据RXD[1:0]接收数据TX_EN发送使能RX_DV/CRS_DV接收数据有效MDC/MDIO管理接口从十几根线减到7根左右对于MCU这种管脚金贵的芯片来说优势非常明显。而且RMII把收发时钟统一成一个REF_CLK不再区分TX_CLK和RX_CLK时钟域管理也更简单。很多STM32系列、低成本的交换芯片、LAN8720这类百兆PHY都支持RMII接口。RMII的使用上有一个经典大坑REF_CLK的来源。标准做法有两种一种是外部晶振直接给PHY提供50MHzPHY再把REF_CLK给MAC另一种是MAC侧出50MHz给PHY。这两种时钟拓扑在初始化配置时完全不同很多人在STM32LAN8720的例程里看到“RMII时钟选择外部晶振”或者“MCO输出50MHz”的配置其实根源就在这里。如果你的板子时钟拓扑和代码假设不一致Link永远起不来而且不容易排查。后面第4节我会展开讲具体怎么判断。RMII是为100M设计的它只支持10/100M速率做不到千兆。千兆时代带宽需要25M*8bit 200Mbps总吞吐宽度不变的情况下时钟需要提到125MHz于是有了GMII。2.4 GMII千兆时代的“宽马路”GMII全称Gigabit Media Independent Interface千兆媒体独立接口。它的设计思路很简单数据位宽扩大到8bit时钟频率125MHz刚好满足1000Mbps的线速要求。向后兼容10/100M时可以降到2.5MHz/25MHz工作。GMII的信号线数量比MII还多GTX_CLK发送时钟由MAC提供125MHz/25MHz/2.5MHzRX_CLK接收时钟由PHY提供TXD[7:0]发送数据RXD[7:0]接收数据TX_EN发送使能TX_ER发送错误指示RX_DV接收数据有效RX_ER接收错误指示MDC/MDIO管理接口注意GTX_CLK的归属又变了在GMII里发送时钟由MAC提供和MII正好相反。这是因为千兆的8bit接口对时钟同步要求极高MAC作为数据源自己提供时钟更合理。MII的发送时钟由PHY提供是因为百兆时代MCU频率低PHY的本地时钟更稳定。GMII功能上很完美但24根线的接口在PCB上就是一场灾难。尤其是125MHz的8bit并行数据线等长、时序、串扰都要严格控制小尺寸板子基本放不下。于是RGMII登场了。2.5 RGMIIDDR技巧让线数减半RGMII全称Reduced Gigabit Media Independent Interface精简千兆媒体独立接口。它的思路非常巧妙在时钟的上升沿和下降沿各采一次数据也就是DDRDouble Data Rate双倍数据率方式。这样8bit数据被压缩到4bit125MHz时钟不变但实际数据吞吐翻倍仍能满足千兆。RGMII的信号线数量TX_CLK发送时钟由MAC提供125MHz/25MHz/2.5MHzRX_CLK接收时钟由PHY提供TXD[3:0]发送数据上升沿发低4位下降沿发高4位RXD[3:0]接收数据同样DDR采样TX_CTL发送控制信号类似TX_EN和TX_ER的合并RX_CTL接收控制信号MDC/MDIO管理接口这个设计把千兆MAC和PHY之间的连线从24根砍到12根以内PCB面积压力剧减所以RGMII成了当前FPGA、主流SoC、交换芯片、千兆PHY之间应用最广的接口。无论是Intel的MAC、Xilinx的三速以太网IP、还是市面上几乎所有千兆PHYRTL8211系列、YT8531等都支持RGMII。但DDR方案带来的问题也很典型数据在时钟的上下沿都要采样对时钟和数据之间的相对延迟要求非常严格。RGMII规范里有个著名的2ns延迟要求——PHY输出的RX_CLK相对于RXD需要有一个约2ns的相移来保证MAC在时钟沿采样时数据已经稳定。有的PHY内部已经做了这个延迟有的需要你在PCB上走蛇形线有的需要配置寄存器调整IO delay。这一块是RGMII调试里最磨人的部分几乎每一个RGMII应用都会踩到这里后面第5节专门讲。2.6 SGMII及更高速接口的方向SGMII是Serial Gigabit Media Independent Interface串行千兆媒体独立接口。名字里的Serial已经说明问题了它把数据从并行变成串行一对差分线发送、一对差分线接收速率1.25Gbps通过8B/10B编码传输数据和控制信息。SGMII的好处极其明显引脚少到极致一对差分TX、一对差分RX、一对管理接口高速串行的信号完整性处理比宽并行总线简单得多而且在FPGA里直接走GTP/GTX高速收发器非常方便。SGMII常见于五口/八口交换芯片与上层SoC之间、车载以太网的一些方案里以及FPGA三速以太网和PHY配合的场景。很多人对SGMII有个疑问明明前面讲了“配置成MAC模式还是PHY模式”这是什么意思SGMII是一种背靠背接口它既可以工作在MAC侧也可以工作在PHY侧。当FPGA里的IP核要和外部PHY芯片直连时IP核里已经内置了SGMII的MAC侧逻辑这时PHY自然工作在PHY模式但当你要让FPGA直接对接另一个MAC比如交换芯片的MAC口就需要把其中一个配置成PHY模式来模拟PHY的行为。这就是“SGMII IP核与PHY芯片一起使用时应配置成MAC模式”这句常见说明的来历。如果两边都配成MAC模式电气上没法协商链路直接起不来。再往上10G以太网有XGMII、XFI更高速的直接走SerDes光接口。但那是另一个世界的故事了先把千兆及以下的接口吃透足以应对绝大多数嵌入式项目。3. MAC和PHY内部的那些门道3.1 MAC核心里有什么如果把MAC比作一个快递分拣中心它干的事就是把进来的包裹IP数据包拆包、重新打包、贴标签、算校验然后交给运输队PHY送出去收件的时候反过来检查运输队送来的包裹有没有破损。一个完整的MAC核心通常包含发送通路TX datapath从FIFO取数据加前导码Preamble、帧起始定界符SFD、目的MAC、源MAC、类型/长度字段计算并附加FCS帧校验序列就是CRC32按接口时序逐比特或逐字节发送接收通路RX datapath检测前导码和SFD解析MAC地址验证FCS把有效载荷写入FIFO并向CPU/DMA发出中断或描述符通知流量控制Flow Control全双工模式下通过Pause帧实现反压控制统计寄存器收帧计数、错帧计数、丢弃计数、CRC错误计数等这些都是排查网络问题的重要线索DMA/缓冲管理连接系统内存和MAC把接收到的帧搬运到内存把要发送的帧从内存读出来不同厂家的MAC实现有差异但基本骨架都差不多。FPGA里如果你用的是Xilinx的Tri-Mode Ethernet MAC IP或者Altera的TSE IP配置界面里能看到这些通路的开关选项MCU里STM32的Ethernet MAC也是一个独立的外设模块。3.2 PHY芯片的“黑话”解读PHY芯片看着不起眼QFN封裝、几十个引脚但内部结构相当讲究。以一颗典型的千兆PHY为例内部的几个核心模块PCSPhysical Coding Sublayer物理编码子层负责编码千兆用8B/10B、百兆用4B/5B加MLT-3、十兆用Manchester编码。PCS还负责自动协商、Link状态管理PMAPhysical Medium Attachment物理介质连接子层负责并串转换、时钟恢复、线路驱动PMDPhysical Medium Dependent物理介质相关子层负责真正的电平收发比如千兆的PAM-5电平直接对应到变压器和网线PHY对外除了MII系列数据接口还有MDC/MDIO管理接口。MDIO是一个两根线的慢速串行接口用来读写PHY的寄存器。通过MDIO可以做很多事情读Link状态比如寄存器1的bit2配置速度和双工模式比如寄存器0的bit13/bit8/bit6开启/关闭自协商读取PHY的芯片ID寄存器2和寄存器3做回环Loopback测试调整RGMII的时钟延迟千兆PHY常用寄存器可能在不同页里很多人在调试PHY时只关注Link灯亮不亮实际上通过MDIO去读寄存器能得到比LED多得多的信息。比如Link起来了但Ping不通大概率是接口模式不匹配或者RGMII延迟不对这种问题靠看灯是看不出来的。3.3 网口变压器到底是不是“多余”的硬件工程师画原理图时RJ45到PHY之间一般会放一个网络变压器常见的是带变压器的RJ45座或者独立变压器加普通RJ45。新手常常疑惑为什么别的通信接口UART、SPI都不需要变压器以太网就非得要变压器的作用主要有三个一是电气隔离网线可能被雷击、静电放电、或者和设备地之间产生电位差变压器能把这些危险能量挡在PHY外面保护芯片和人身安全二是共模抑制双绞线上的共模干扰通过变压器的中心抽头和终端电阻处理掉保证差分信号质量三是信号整形变压器可以看作一个带通滤波器能改善信号的上升沿和摆幅。所以变压器不是“多余的”而是以太网物理层设计里必不可少的一环。在EMC测试、静电测试里变压器的选型和布线质量直接影响过不过得了。选型上没有太多花活跟着PHY的参考设计走就行关键是注意变压器的中心抽头怎么接、Bob Smith端接电阻和电容的取值、PHY芯片差分引脚到变压器的走线阻抗通常100欧姆差分。这些细节在PHY手册里的参考电路都画得清清楚楚别自己发挥。4. 接口选型和典型硬件设计要点4.1 MCU百兆方案STM32RMII/MII怎么选STM32的以太网控制器在F4、F7、H7系列上都有支持MII和RMII两种接口模式。很多人在选型时纠结用MII还是RMII这里直接给结论管脚充足、追求信号余量选MII。MII数据位宽4bit时钟25MHz时序余量比RMII宽裕PCB约束更宽松调试难度低管脚紧张、希望省IO选RMII。RMII只需要约7根线能省出一组GPIO但50MHz的参考时钟必须处理好注意RMII模式下STM32的ETH_ref_clkPA1或PC1必须输入50MHz这个时钟从哪里来一定要和PHY芯片的时钟拓扑匹配起来STM32的CubeMX配置里会让你选Media InterfaceMII还是RMII同时还要配置PHY地址常见0或者1这两个配置错了直接导致底层寄存器读写失败。PHY地址由芯片的PHYAD引脚电平决定画板子时留上拉/下拉出厂默认就能确定。还有一个小细节STM32的MAC地址不是出厂烧好的必须由软件设置很多人第一次跑通例程前忘了写MAC地址通信就起不来。4.2 FPGA千兆方案RGMII布线和时序约束FPGA做千兆以太网最常见的是接一颗RGMII千兆PHY。Xilinx的三速以太网IP核支持RGMII、GMII、MII但实际项目中大家基本都选RGMII因为引脚少、时序可控。FPGA侧RGMII的实现有几个关键点第一PHY芯片的RX_CLK对FPGA来说是接收时钟与RXD/ RX_CTL的关系。RGMII规范要求PHY的RX_CLK要相对数据延迟约2ns输出这样FPGA时钟引脚采数据时落在数据稳定窗口内。如果PHY内部没做这个延迟你需要在PCB上给RX_CLK走线加长或者在FPGA的IO约束里做输入延迟约束。第二FPGA侧发送方向也要考虑时钟输出和数据输出的关系。MAC给PHY的TX_CLK是随路时钟数据在TX_CLK上下沿都有效。FPGA中可以用ODDR原语把两个4bit半字节合并在一个时钟沿输出也可以用DDR输出寄存器实现。第三约束文件里要写清楚时序路径。RGMII接口在SDC里需要设置set_input_delay和set_output_delay特别是-max和-min延迟不同PHY的芯片手册会给出时序参数照着手册加别拍脑袋。我见过太多人FPGA工程综合布线全过了上板就是不通后来一看约束文件里input delay根本没写时序完全是随机碰运气这种问题最阴间。4.3 交换芯片和SoC侧用什么接口更省事如果你做的是带多口交换的设备或者要接一颗五口/八口交换芯片接口的选择又不一样。交换芯片通常提供两种上行接口一种是RGMII/SGMII用来接SoC的MAC一种是MII/RMII用来接PHY芯片或另一个MAC。这里有个容易搞混的点交换芯片的某个口到底是“MAC侧”还是“PHY侧”。要去看芯片手册里的接口模式定义有的口是内部集成PHY的对外是MAC接口逻辑需要接外部PHY或MAC有的是纯MAC口需要外接PHY芯片还有的是PHY口直接接变压器上RJ45。选型时一定要先把各个口的属性理清楚不然画完板子发现接错返工成本极高。工业场景和车载场景里SGMII用得越来越多。SGMII的优势不仅仅在于引脚少还在于它能通过SerDes跑更远的距离板内走线即使有跨分割之类的问题也比125MHz的并口好处理而且传统的RGMII在车载环境EMC测试中经常因为时钟谐波问题被卡SGMII的1.25Gbps信号频谱比较干净更容易过测试。这也是车载以太网方案里很多SoC直接拉SGMII到PHY或者交换芯片的原因。5. 实操中的常见问题和排查技巧实录5.1 Link灯亮了但Ping不通这个经典场景怎么查这个场景在嵌入式和FPGA项目里反复出现我把排查路径按优先级列出来供大家参考。第一步确认MAC侧接口配置和PHY侧一致。MII/RMII/RGMII模式必须匹配比如STM32配的RMII结果PHY芯片接的是MII有些PHY芯片不支持自动适配就完全不通。这一步是纯软件配置问题优先确认。第二步读PHY的寄存器确认Link状态和协商结果。通过MDC/MDIO读寄存器1Basic Mode Status Register的bit2为1表示链路已建立。再读协商速度和双工看是不是你要的100M全双工或1000M全双工。如果协商出来是半双工或者10M检查线缆、对端设备、PHY配置。第三步检查接收方向数据是否有效。用逻辑分析仪或者FPGA的ILA抓RGMII接口的RX_CLK和RXD/RX_CTL看有没有数据帧进来。如果RX_CTL一直为低说明PHY没收到有效数据问题大概率在物理层变压器、RJ45、网线、对端设备如果RX_CTL有脉冲但数据错乱问题大概率在RGMII时序重点是RX_CLK和数据之间的相位关系。第四步检查MAC侧有没有发出数据。抓TX_CLK和TXD/TX_CTL看MAC有没有在发帧。如果MAC发了但PHY没出去检查PHY的寄存器配置、发送端时钟和电压域。第五步确认MAC地址、IP配置、RMII时钟配置正常。这类问题经常是“配置性”的比如MAC地址没写、IP地址没配、RMII的50MHz时钟源不对看着是硬件问题其实纯软件就能解决。5.2 RGMII时序调不通就想砸板子的元凶RGMII的DDR结构让时序窗口非常紧张。千兆模式下125MHz一个时钟周期8ns但上下沿采样意味着每个数据窗口只有4ns再算上输入输出延迟和抖动留给设计者调整的余量很小。实战中我总结出一套有效调试顺序先确定PHY芯片支持哪些延迟模式。RTL8211、YT8531这些主流千兆PHY通常有寄存器选项控制RX delay和TX delay。默认配置可能已经是“开启内部延迟”也可能需要你手动开每家不一样一定看手册。再检查FPGA/SoC侧是否也做了延迟补偿。有些MAC侧会加额外的输入延迟约束两边的延迟叠加会导致采样点偏移。我的经验是优先依赖PHY内部延迟把FPGA侧约束放宽如果PHY不支持内部延迟再在FPGA侧用IO delay或者约束文件修正。最后用ILA抓包实测确认采样点。把ILA的时钟设成RX_CLK允许时用IDELAY调整采样相位观察RXD和RX_CTL拨动PHY的延迟配置或者FPGA约束直到数据窗口中间位置稳定出现正确的前导码0x55字节序列。这个“眼睛”调开了基本就通了。如果你手头有示波器直接看RXD和RX_CLK的时序关系更快。理想状态是数据在时钟沿两侧各留2ns左右的建立保持窗口如果看到数据翻转沿紧贴时钟沿那就是延迟不对迟早会出偶发丢包。5.3 RMII时钟拓扑判断一个容易忽略的大坑前面提到RMII只有一根REF_CLK但它的来源在标准里是可以多种的。实际操作中如果PHY和MAC对时钟的“角色”认知不一致链路必然失败。时钟拓扑通常有两种拓扑A外部晶振给PHY提供50MHzPHY把REF_CLK输出给MAC。此时MAC的REF_CLK是输入拓扑BMAC输出50MHz到PHY的REF_CLK引脚。此时PHY把REF_CLK当输入怎么看你的板子是哪种看原理图上PHY的XI/XO引脚或者REF_CLK引脚连到哪里。如果XI/XO上有一颗晶振接着PHY的REF_CLK输出脚连到MAC那就是拓扑A如果PHY的REF_CLK直接从MAC的MCO引脚来那就是拓扑B。软件初始化时MAC侧的时钟配置和这两套拓扑绑定比如STM32的RMII模式下如果要MCO输出50MHz给PHY就得把PA8配成MCO1如果PHY自己出时钟PA8可能就空着。我踩过的坑用某国产PHY替代LAN8720时原理图沿用旧板发现PHY的时钟输出脚定义不完全一样导致REF_CLK悬空。一看数据手册才发现技术参数有差异重新接了一根线才好。所以做替代料验证时时钟拓扑是第一个要核对的项目别只看引脚兼容就偷懒。5.4 抓包工具和调试方法别让Wireshark白装了调试以太网链路Wireshark是终端调试的重要帮手。在PC端抓包能看协议层交互但嵌入式侧很多环节它看不到。下面是我常用的几类调试手段板卡侧的寄存器读取脚本通过MDIO读写PHY寄存器写一个小工具或者脚本把PHY的所有核心寄存器值dump出来判断协商结果、中断状态、错误计数MAC侧统计寄存器STM32/FPGA的MAC核都有统计计数器RXCRC错误、帧对齐错误、过短帧、超长帧这些数字能直接告诉你是物理层问题、还是MAC配置问题还是对端行为异常逻辑分析仪/ILA抓接口时序调RGMII、RMII时序必备抓波形才是硬道理交换机和PC端抓包用一台管理型交换机做流量镜像对比板卡发出的帧到底对不对结合PC侧Wireshark分析想强调的是一定要把抓包当习惯而不是最后手段。我在调试一个FPGAPHY项目时一开始Link正常、能Ping通但大流量传输时偶发丢包。通过MAC统计寄存器发现RXFCS错误持续增长锁定PHY输出的数据有误码最后发现是PHY的电源纹波在重负载时超标数据采样窗口被压缩。这种问题如果只在应用层看大概率要排查好几天。5.5 几个容易被忽略的硬件小细节最后整理几个我在画板、调试中反复遇到的硬件层面的小问题PHY芯片的复位信号很多PHY要求复位信号保持一定时间后释放而且在释放后还要等待一段时间才能访问MDIO这个时间通常在数据手册里写了。如果软件上电后立刻读PHY寄存器可能读到0xFFFF被误判为PHY不存在时钟源的电平标准RGMII/RMII的IO电平一般是2.5V或3.3V有些PHY同时支持1.8V。电平不匹配会导致数据翻转缓慢、信号完整性问题。不同电压域之间最好加电平转换或选择IO电平匹配的器件管理接口的上拉电阻MDC和MDIO通常需要上拉电阻有的PHY芯片内部已经有弱上拉但为了稳定外部加上拉更保险。上拉电阻取值不当太大或太小可能导致MDIO通信时好时坏网口变压器的中心抽头接法不同PHY对变压器中心抽头的接法要求不同有的接电源、有的接地务必按手册来。我之前见过一块板子把中心抽头接错了导致Link一建立就丢包PHY温度还异常高PHY地址的选择PHYAD引脚一般有内部上下拉默认地址可能是0或者1。实际项目中如果有多颗PHY要规划好地址而且确保和软件配置一致否则管理接口无法正确访问这些细节单独看都是小事但组合在一起就决定了产品稳不稳定。做硬件的朋友应该深有体会大多数难调的bug回头一看都不是什么高深问题全是细节没照顾到。6. 调试工具准备与常用寄存器参考6.1 必备工具清单调以太网接口我建议手头常备以下几类工具USB转网口的调试板USBNIC有些场景需要模拟对端设备一台USB转千兆网卡的设备能帮你快速确认对端MAC和PHY的行为逻辑分析仪至少100MHz以上采样率调RMII没问题调RGMII建议采样率500MHz起步普通万用表测PHY电源、复位电平、MDIO上拉电压基础排查必备示波器带宽至少300MHz以上真正要测RGMII时序和信号完整性时示波器比逻辑分析仪更直观管理型交换机带端口镜像五口千兆傻瓜型即可能抓板卡发出的以太网帧协议分析方便各种长度的成品网线别小看这个线序不对、线缆质量差、过长都会导致Link不稳定工具不一定要顶级但采样率和不丢帧很重要。逻辑分析仪如果采样率不足抓到RGMII波形本身就是混叠的没法做时序分析反而误导人。6.2 PHY核心寄存器快速参考PHY的寄存器标准由IEEE 802.3定义前16个寄存器是标准寄存器不同厂商的PHY基本兼容后面的寄存器属于厂商自定义需要查对应的数据手册。下面是几个调试中最常碰到的寄存器寄存器0BMCRBasic Mode Control Registerbit15复位、bit14回环、bit13速度选择、bit8全双工、bit12自动协商使能寄存器1BMSRBasic Mode Status Registerbit12自动协商能力、bit11链路建立、bit9/8/7速度能力、bit5自动协商完成寄存器2/3PHY ID High/Low读取PHY芯片的ID用于代码里识别当前PHY型号寄存器4ANARAuto-Negotiation Advertisement Register宣告本地支持的能力寄存器5ANLPARAuto-Negotiation Link Partner Ability Register对端宣告的能力从这里能看到协商结果寄存器6ANERAuto-Negotiation Expansion Register自动协商扩展信息调试时我习惯先读寄存器1确认Link状态再读寄存器4/5核对协商结果如果链路异常再看寄存器6里的错误标志。如果这些寄存器都正常再往MAC侧查。一个实用小脚本逻辑伪代码# 伪代码示意实际按平台API调整 mdio_write(phy_addr, 0, 0x8000) # 软件复位PHY delay(100ms) mdio_read(phy_addr, 1) # 读状态bit11应为1表示Link up mdio_read(phy_addr, 5) # 读对端能力确认协商速度/双工 mdio_write(phy_addr, 0, 0x1000) # 开启自协商有MDIO读写能力的单片机和FPGA写个简单的命令行调试小工具会非常方便。我在调试FPGA项目时通常会先写一个PC端脚本通过JTAG/UART下发MDIO读写命令把PHY的所有寄存器dump出来分析比改一次编译一次上板有效率高一个量级。7. 写在最后的经验心得做以太网调试这么长时间我最大的体会是这类问题不怕难就怕乱。很多新手拿到一个Link不上的板子第一反应是改代码、换PHY、拆变压器操作一顿操作猛如虎问题依旧。实际上只要按“时钟→复位→MDIO→Link状态→数据接口→协议栈”这条链路一层层排查大部分问题都能在半小时内定位。顺便说一个个人体会接口模式的匹配比你想的更重要。RGMII配成RMII、GMII配成MII、SGMII两侧都配了MAC模式这些是“模式级”的错误特征是连Link都可能起不来。这比信号完整性问题更难排查因为电气上看着全是正常的但逻辑上完全没对上。所以拿到新板子第一步一定是逐项核对接口模式、PHY地址、时钟拓扑把“配置”这个变量先锁定再去看波形。再分享一个调试技巧先用回环Loopback隔离问题。PHY芯片普遍支持内部回环和外部回环配置寄存器0的bit14可以打开回环。如果在回环模式下数据自发自收正常说明MAC侧和接口基本OK重点排查PHY之外的物理链路如果回环都不通问题大概率在MAC侧或者接口时序上。这个技巧能帮你快速划清责任范围省下大量无效操作。以太网这个东西越往底层走越能感受到“标准的力量”那么多种芯片不同厂商、不同工艺只要都按IEEE 802.3来做接口之间就能互通。理解了MAC和PHY的分工、MII系列接口的演变逻辑、常见调试方法和坑点你再看任何以太网相关的原理图和代码心里都会有一个清晰的框架。这篇先到这里后续有时间我再写协议栈、VLAN、流量控制、以及实际项目中以太网性能调优的一些内容。有具体问题也可以在评论区交流我会挑典型的展开说。
返回列表