ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MII、RMII、GMII、RGMII:以太网MAC-PHY接口详解与调试指南

MII、RMII、GMII、RGMII:以太网MAC-PHY接口详解与调试指南 干了这么多年嵌入式跟以太网打交道是躲不开的。做板子、调驱动一涉及到网络通信mac和phy之间那几根线怎么接、用什么接口、时序怎么对总能把人折腾几轮。MII、RMII、GMII、RGMII这几个缩写看着相似实际用起来差别很大选错了轻则性能上不去重则压根不通。这篇文章就专门把这几个接口掰开揉碎讲清楚从信号定义、时序机制到实际调试中的坑都过一遍给正在选型或者正在调板子的朋友一个参考。1. 为什么MAC和PHY之间需要这几种接口先理解连接的本质要搞清楚MII、RMII、GMII、RGMII到底在解决什么问题得先回到以太网硬件架构的基本盘上。一块以太网卡功能上分成两部分MAC媒体访问控制层和PHY物理层。MAC负责组帧、寻址、CRC校验这些数据链路层的活PHY负责把数字信号变成模拟信号扔到网线上同时处理编码、时钟恢复、载波侦听这些物理层的脏活累活。这两块芯片之间必须有一套标准的数字接口来交换数据和控制信息于是就有了MII、RMII、GMII、RGMII这一族接口。名字里那个“II”是“Independent Interface”的缩写意思是独立接口也就是说不依赖特定PHY芯片型号大家按统一规范来设计MAC能和任意符合规范的PHY对接。为什么强调“标准”两个字因为MAC和PHY不一定是同一家芯片。MCU内部集成了MACPHY用外挂的比如DP83848、YT8512、RTL8201中间就可能出现不同厂商芯片互连的情况。没有标准接口的话每次换PHY都得重新布线、重新写驱动时序项目根本没法做。有了标准接口只要PHY支持RMIIMCU的RMII引脚接过去配置好时钟模式基本就能跑起来。理解这几个接口的差异有一个最核心的线索数据位宽和时钟频率的组合关系。MII是4位数据25MHz时钟跑100MRMII把数据位宽砍到2位时钟提到50MHzGMII是8位数据125MHz时钟跑1000MRGMII用8位数据在双沿采样时钟还是125MHz。接口演进的方向说白了就是用更少的引脚、更高的时钟效率去承载更高的速率同时尽量降低PCB布线的难度和成本。这个逻辑想通了后面看每个接口的细节就会很顺。2. 逐个拆解MII、RMII、GMII、RGMII的工作原理与信号定义2.1 MII最原始的百兆标准接口MIIMedia Independent Interface是IEEE 802.3u定义的百兆以太网标准接口数据位宽4位发送时钟和接收时钟都是25MHz100M速率下。整个接口的信号分成几组数据信号、时钟信号、控制信号、管理信号。标准MII接口一共20多根线核心信号包括TXD[3:0]发送数据4位并行RXD[3:0]接收数据4位并行TX_CLK发送时钟25MHz100M/ 2.5MHz10MRX_CLK接收时钟由PHY提供25MHz100M/ 2.5MHz10MTX_EN发送使能RX_DV接收数据有效MDC / MDIO管理接口时钟和数据线用来读写PHY寄存器CRS / COL载波侦听和冲突检测半双工模式用MII的时序特点发送方在TX_CLK的上升沿把数据打好接收方在上升沿采样。这个接口因为引脚多、布线占用面积大现在已经很少在新设计里直接使用但在很多老方案或者FPGA设计里还能见到。MII的4位数据在100M速率下时钟25MHz意味着每个时钟周期传输4位4×25M100Mbps正好匹配百兆速率。逻辑很简单时序要求也不苛刻这是它当年能成为标准的重要原因。2.2 RMII引脚减半的百兆方案RMIIReduced MII的出现就是为了解决MII引脚太多的问题。它在保持100Mbps速率的前提下把数据线从4位砍到2位时钟从25MHz提到50MHz整体信号数量从20多根减少到不到10根。对于引脚资源紧张的MCU和小型化PCB来说这是巨大的优势。RMII接口的关键信号TXD[1:0]发送数据2位并行RXD[1:0]接收数据2位并行REF_CLK参考时钟50MHz收发共用同一个时钟TX_EN发送使能RX_DVCRS_DV接收数据有效/载波侦听MDC / MDIO管理接口另外有些实现需要 RX_ER 信号RMII和MII在工作机制上有本质区别除了数据位宽减半、时钟翻倍之外最需要注意的是收发共用一个参考时钟REF_CLK。这个时钟可以由MAC提供也可以由PHY提供还可以由外部有源晶振提供。正是“共同时钟”这个设计让RMII在时序上比MII更敏感实际布线时必须认真处理REF_CLK的质量。STM32F407这类MCU内部集成了MAC对外提供RMII接口外部接PHY芯片时REF_CLK的处理方式是很多新手最先踩坑的地方。后面第4节会专门展开讲。2.3 GMII千兆时代的全并行接口到了千兆速率MII这套思路继续沿用就变成了GMIIGigabit MII。数据位宽从4位变成8位时钟从25MHz变成125MHz8×125M1000Mbps匹配千兆速率。GMII的引脚数量比MII更多超过24根对PCB布线来说是个不小的挑战。GMII核心信号TXD[7:0]发送数据8位并行RXD[7:0]接收数据8位并行GTX_CLK发送参考时钟125MHz由MAC提供RX_CLK接收时钟由PHY提供125MHz1000M/ 25MHz100MTX_EN发送使能RX_DV接收数据有效MDC / MDIO管理接口GMII的时序要求比MII严格不少因为125MHz的时钟频率下信号的建立时间、保持时间窗口只有纳秒级对PCB走线长度匹配、阻抗控制都提出了要求。所以GMII常见于FPGA、高性能网络处理器等场景普通MCU很少直接引出GMII因为引脚数量扛不住。2.4 RGMII高性价比的千兆接口RGMIIReduced GMII是现在使用最广泛的千兆MAC-PHY接口方案。它的核心思路是数据位宽保持8位但使用DDR双沿采样在125MHz时钟的上升沿和下降沿各传输一次数据等效达到250M次采样/秒8×2×125M2000Mbps的传输能力实际用于1000Mbps全双工。RGMII信号数量锐减到12根左右TXD[3:0]发送数据4位并行上升沿和下降沿各传4位合计8位RXD[3:0]接收数据4位并行同理TX_CLK发送时钟125MHzRX_CLK接收时钟由PHY提供125MHzTX_EN / TX_CTL发送控制信号上升沿传TX_EN下降沿传TX_ERRX_DV / RX_CTL接收控制信号上升沿传RX_DV下降沿传RX_ERMDC / MDIO管理接口RGMII最大的价值在于用12根线实现了千兆速率不管对MCU还是对PCB布局都友好太多。很多自带千兆MAC的芯片比如NXP的i.MX系列、瑞萨的RZ系列、部分STM32MP1都支持RGMII。RGMII唯一让人头疼的地方是时序约束双沿采样意味着对信号延迟、时钟偏斜特别敏感需要在硬件设计和驱动层做专门的延迟补偿。3. 接口对比引脚数量、时钟频率、速率上限与适用场景几个接口放到一张表里看差异一目了然接口类型数据位宽时钟频率采样方式引脚数量约支持速率适用场景MII4位25MHz单沿2010/100Mbps老设计、FPGA教学板RMII2位50MHz单沿8-1010/100Mbps百兆MCU方案、STM32F407等GMII8位125MHz单沿2410/100/1000MbpsFPGA、高性能网络处理器RGMII4位双沿125MHz双沿1210/100/1000Mbps千兆MCU/MPU、主流新设计从MII到RMII本质是面积换速度引脚减半时钟翻倍。从GMII到RGMII本质是时间换面积利用双沿采样在同样的时钟频率下把吞吐量翻了一倍。选型逻辑也很清楚如果做百兆、成本敏感、MCU引脚紧张优先RMII如果做千兆、板子上空间允许、MAC支持GMII可以考虑GMII但很少这样选如果做千兆、追求布线面积和电磁兼容性RGMII是当前最主流的选择MII一般只在已有方案沿用或学习参考时用到在实际项目中真正让你头大的不是这几个接口的速率数字而是它们带来的时钟架构差异和时序容差问题。RMII的50MHz共同时钟、RGMII的125MHz双沿采样才是调试中最容易出幺蛾子的地方。4. RMII接口的时钟架构与常见调试痛点为什么你的网卡接收数据老是错4.1 REF_CLKRMII的灵魂信号前面提到RMII的收发共用一个50MHz参考时钟REF_CLK。这个时钟是谁提供的直接决定了硬件电路怎么设计也决定了驱动里要不要做特殊配置。RMII的REF_CLK有三种典型接法PHY提供REF_CLK外部晶振接在PHY的XI/XO引脚PHY内部锁相环产生50MHz的REF_CLK输出给MAC。这种接法对MAC最友好MAC不需要额外处理时钟。MAC提供REF_CLKMCU从MCO引脚或其他时钟输出引脚产生50MHz时钟接到PHY的REF_CLK输入。PHY的收发逻辑都参考这个外部时钟。外部独立有源晶振提供REF_CLK50MHz有源晶振同时接到MAC和PHY的REF_CLK输入。这种方式时钟质量最可控但BOM成本稍高。这三种接法在STM32F407上都有应用。官方评估板常见的是PHY提供50MHz时钟给MCU或者MCU通过MCO1输出50MHz。很多人拿着开发板的原理图照抄没仔细看时钟方向结果自己画板子时晶振接错位置或者MCO引脚没初始化网络死活不通。4.2 例1STM32F407 DP83848的RMII设计经验STM32F407的MAC支持MII和RMII两种模式通过复用功能寄存器切换。用RMII接DP83848时典型的配置是这样的PHY地址DP83848的地址由硬件引脚PHYAD[4:0]决定常见配置为0x01驱动里要对应REF_CLK如果选择MCU提供时钟用PA8复用功能MCO1输出50MHz接到PHY的XI引脚RMII数据引脚PA1ETH_RMII_REF_CLK注意这个引脚在RMII模式下也有特殊功能、PA2MDIO、PC1MDC、PA3ETH_RMII_CRS_DV、PA4ETH_RMII_RXD0、PA5ETH_RMII_RXD1、PB11ETH_RMII_TX_EN、PB12ETH_RMII_TXD0、PB13ETH_RMII_TXD1驱动层面在stm32f4xx_hal_eth.c里需要设置PHY时钟源。如果REF_CLK是外部输入给MCU的ETH-MACCR的FES位Fast Ethernet Speed要正确配置10M时清0、100M时置1。还要注意DMDuplex Mode位的设置。关于“RMII接口网卡接收数据错误”我遇到过的典型表现能建立链路link up但收包全是CRC错误能发不能收或者能收几个包就断收发速率极慢丢包严重这类问题排查顺序很重要。先不要急着怀疑驱动用示波器或者逻辑分析仪看REF_CLK是否稳定、频率是否为50MHz、幅度是否达到芯片要求。很多情况下问题出在时钟波形质量晶振负载电容配错导致起振不稳或者MCU的MCO输出驱动能力不足导致高电平幅度不够。如果时钟没问题再排查CRS_DV信号。RMII里的CRS_DV是把标准MII的CRS和RX_DV合并后的信号PHY在接收数据时拉高它。有些PHY芯片在接收单播包时CRS_DV的表现和接收广播包不一样导致MAC认为载波一直存在进不了接收状态机。这种情况需要检查PHY芯片寄存器里关于CRS_DV行为的配置DP83848有相关寄存器可以调整CRS_DV的响应行为比如接收空闲时是否保持高电平。4.3 例2YT8512的RMII时钟配置误区YT8512是国产PHY里用得比较多的一颗Costdown方案常选它。但YT8512的RMII时钟配置和TI的PHY不太一样很多人按DP83848的思路去配结果翻车。YT8512支持RMII的REF_CLK输入输出模式但有个细节部分型号或版本里REF_CLK是PHY的输出时频率源来自PHY内部的PLL外部XI/XO需要接25MHz晶振而不是50MHz。如果按DP83848的习惯接了50MHz晶振YT8512反而无法正常工作。另外YT8512的上电初始化时序比较讲究PHY芯片的VDDIO电压和MAC的IO电压必须匹配否则MDIO读写不稳定读出来的寄存器值全是0xFF或者随机值。很多网卡接收数据错误、驱动识别不了PHY型号root cause其实是IO电平不匹配而不是接口时序问题。判断方法很简单用MDIO读PHY的ID寄存器寄存器2和3看能不能读到合法的芯片ID。读不到就优先查供电、复位、时钟这三件事。4.4 RMII调试的通用排查链路如果遇到RMII网卡接收数据错误我建议按下面这个顺序排查确认PHY能正常上电复位检查供电电压和复位引脚时序用MDIO/MDC读写PHY寄存器确认PHY ID正确、基本配置生效用示波器测量REF_CLK频率和幅度确认50MHz稳定检查MAC模式配置是RMII还是MII很多MCU默认是MII模式检查TX/RX数据引脚是否复用正确用GPIO输入模式读一下引脚电平变化用PHY的回环模式loopback隔离问题PHY内部回环能通说明MAC-PHY接口没问题问题在PHY到网线一侧回环不通说明MAC-PHY接口本身有问题查PCB布线REF_CLK走线是否太长、跨分割、挨着大电流走线5. RGMII的时序内涵与约束为什么它比RMII更容易掉链子5.1 双沿采样带来的挑战RGMII的接收端是时钟双沿采样对时钟和数据之间的相对延迟skew要求非常严格。在125MHz时钟频率下一个时钟周期8ns上升沿和下降沿之间的半个周期只有4ns留给数据建立时间和保持时间的窗口非常窄。数据从PHY到MAC接收方向的时候PHY输出的数据是以它的TX_CLK也就是MAC看到的RX_CLK边沿为参考的。但PHY发送数据的时机和RX_CLK边沿之间的关系并不总是在理想位置不同的PHY芯片行为还不一样。有的PHY把数据对齐到时钟上升沿有的则故意在时钟和数据之间加一个1.5ns~2ns的内部延迟目的是让接收端采样更容易。RGMII规范里定义了一个内部延迟模式就是PHY芯片在数据通路上自动加延迟保证数据在时钟沿附近稳定。常见实现有两种TX内部延迟PHY在发送方向MAC→PHY的数据通路上加延迟RX内部延迟PHY在接收方向PHY→MAC的数据通路上加延迟不同的PHY芯片延迟的默认值是开启还是关闭、能调整多少差别很大。有些PHY通过寄存器位来控制比如RTL8211系列有RXDLY、TXDLY相关的位有些PHY则通过芯片引脚的外部上下拉电阻来配置。5.2 RGMII接口时序约束的实践路子在FPGA里做RGMII接口时时序约束是绕不开的。你需要告诉综合工具RXD[3:0]和RX_CTL信号相对RX_CLK的约束关系是什么。如果PHY没有开启内部延迟那么数据相对时钟边沿可能只有1ns左右的窗口普通IO的直接采样很容易不满足建立/保持时间。解决思路一般有两种让PHY开启内部延迟模式在驱动初始化时设置PHY寄存器开启TX和RX方向的延迟。这种方案最简单硬件不用改只需要驱动配置正确。在MAC侧用逻辑延迟/IO延迟如果PHY不支持内部延迟需要在MAC的IO上做延迟比如FPGA内部的IODELAY、MCU的DCMI/ETH模块内部延迟校准。实际项目中很多RGMII不通的问题最后定位到就是PHY的延迟配置没开。芯片手册里关于这个功能的描述往往藏在寄存器说明的角落里不仔细看根本找不到。建议拿到新PHY芯片先在驱动里把PHY ID读出来然后去手册里查对应ID的芯片版本号再找延迟配置的默认值。以RTL8211F为例其寄存器0x14的bit 6和bit 5分别控制RX delay和TX delay的开关。默认值可能为0关闭这就导致MAC侧采样失败。设置方法一般是// 伪代码读取PHY寄存器0x14写入新值使能延迟 val phy_read(phydev, 0x14); val | (1 6) | (1 5); // 开启RX/TX delay phy_write(phydev, 0x14, val);当然不同版本的RTL8211F这个寄存器定义可能不同有的在0x1C、有的在0x15务必以对应数据手册为准。5.3 时序参数里那些“必须满足”的数字RGMII规范中接收方向的典型时序参数是这样一套Tskew时钟到数据的偏斜通常要求在±0.5ns以内Tsetup建立时间数据在时钟沿之前必须稳定的最短时间一般要求1ns左右Thold保持时间数据在时钟沿之后必须保持的最短时间一般要求1ns左右换算一下如果PHY不做延迟数据相对于时钟沿的偏移可能达到1.5ns甚至更大这意味着接收端采样时可能刚好落在数据翻转的窗口里采到错误电平。表现出来就是能link up但一跑吞吐测试就大量丢包、CRC错误甚至完全不通。在PCB布线层面RGMII的每组数据线最好等长时钟线不要比其他信号线长太多。建议数据线和对应时钟的走线长度差控制在±100mil以内这也是很多参考设计里要求的。差分对的事这里不展开RGMII是单端信号重点考虑的是线间耦合和回流路径。6. 基于应用场景的选型建议百兆、千兆、不同主控怎么选6.1 百兆方案优先选RMII但不代表所有RMII都一样百兆工业控制板、IoT网关、STM32F407/F429这类MCU方案RMII是绝对的主流。原因前面说过引脚少、布线面积小、MCU内部MAC支持。但选RMII的时候要确认三件事MCU的MAC是否支持RMII不是所有带MAC的MCU都支持有些老型号只有MIIREF_CLK的方向和接法根据MCU和PHY的能力决定选最容易实现的方案PHY芯片的型号和来源不同PHY的配置寄存器差异很大驱动移植工作量不同从我实际经验看DP83848、LAN8720、YT8512都是百兆RMII方案里常见的PHY。LAN8720因为外围简单、价格低在很多低成本方案里出现频率很高。但LAN8720的REF_CLK默认方向和硬件配置引脚有关需要特别留意。6.2 千兆方案看主控RGMII适配比GMII更值得投入如果主控是NXP i.MX6ULL、i.MX8、瑞萨RZ/G系列、Zynq或者STM32MP1这种带千兆MAC的芯片接口选型基本就是RGMII。GMII虽然功能上更传统、时序更简单但引脚数量让PCB设计非常痛苦大多数现代设计不会主动选它。RGMII方案在贴近量产时需要额外注意PHY的延迟模式配置这个配置在Linux内核里的drivers/net/phy/xxx.c里往往有现成的处理逻辑。比如用RTL8211系列时内核phy驱动里会读取PHY芯片的device tree配置如果dts里配置了rx-internal-delay-ps和tx-internal-delay-ps驱动就会在初始化时把对应的寄存器位设置好。用主线内核时这一步基本是自动的用厂家BSP时很多功能被裁掉了就得自己手动加。6.3 几个选型决策的“非技术”因素除了速率、引脚、时序实际选型还要考虑几个容易被忽略的点驱动生态Linux内核里有现成的PHY驱动吗还是需要自己改有些国产PHY的驱动补丁只放在厂家BSP里主线内核根本不支持后续升级内核会非常痛苦量产稳定性PHY芯片的供货稳定性和生命周期工业项目一干就是五六年芯片停产能让方案整体报废发热和功耗千兆PHY的功耗一般在几百毫瓦量级散热设计不能马虎工业温度范围-40℃到85℃也是一个硬指标7. 实测经验用回环模式快速定位RGMII/RMII链路故障调试以太网接口我最推荐先掌握一个技巧PHY回环模式。这个概念很简单就是让PHY芯片在内部把发送数据直接转给接收通路数据不经过网线传输。这样分成两段来定位问题MAC→PHY→内部回环→PHY→MAC如果这条链路通说明MAC和PHY之间的数字接口没大问题如果回环测试正常但接上网线就是不通问题多半在PHY的模拟前端、变压器、网口连接器或者对端设备不同PHY的回环使能位一般在寄存器0的bit 14设置该位为1即可进入回环模式。以DP83848为例// 设置DP83848进入回环模式 unsigned int bmcr phy_read(phydev, 0x00); bmcr | (1 14); // 回环模式使能 phy_write(phydev, 0x00, bmcr);回环模式下MAC发送一个ping包在不连接网线的情况下如果MAC能收到自己的回应当然是PHY回环回来的说明MAC-PHY链路基本正常。这个技巧对RMII接收错误、RGMII丢包这类问题特别有效。我曾经遇到一个RGMII案例现象是链路能link up但吞吐量只有带宽的十分之一一开始怀疑驱动问题折腾了两天没结果。后来用回环模式测试发现回环模式下吞吐是满的于是问题定位到PHY到变压器的模拟通道。一量波形发现是网络变压器中心抽头没接对焊盘虚焊导致信号幅度衰减严重。8. 写在最后的板级设计经验以太网接口的板级设计很多坑其实是“规矩没做到位”导致的。信号完整性不是玄学是有明确物理原因的。RMII和RGMII虽然都是单端信号但在高频状态下以下几点直接决定成败串阻数据线上的串阻通常22Ω或33Ω不是可有可无的它可以有效减小振铃和过冲尤其对边缘速率快的芯片至关重要参考平面REF_CLK、RGMII的时钟线下面必须有完整的地平面跨分割会直接导致时钟质量问题滤波电容PHY芯片每个电源引脚的0.1μF去耦电容必须靠近引脚放置放远了等于白放晶体走线PHY晶振的走线要短、要粗两边负载电容要对地不要走直线穿到背面软件留后门设计时尽量支持MDIO读寄存器有的MCU支持通过SWD或JTAG调试时访问ETH寄存器这在量产阶段排除硬件故障时能省很多时间最后再分享一个小习惯我每次画以太网相关板子都会把PHY芯片的中断引脚、复位引脚和CLKOUT引脚留到测试点这样软件联调时即使没有逻辑分析仪也能用万用表量引脚电平判断状态。别小看这几个测试点到了现场排除故障的时候它们能救命。
返回列表