ARTICLE DETAIL

资讯详情

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

以太网MAC与PHY接口详解:从MII到SGMII及车载应用

以太网MAC与PHY接口详解:从MII到SGMII及车载应用 1. 一个物理帧的“两地分居”MAC和PHY到底各管什么很多刚接触以太网的兄弟上来就抓着一堆协议栈啃TCP/IP、UDP、ARP背得滚瓜烂熟却搞不清网口上那两个芯片各自在干什么。直到某天调试一块板子网络死活Link不上用示波器一量发现PHY芯片的引脚根本没波形才知道问题出在MAC和PHY的配合上。这类事我见过太多次所以先把这俩角色说透。1.1 MAC层管“帧”不管“电”MACMedia Access Control介质访问控制这一层工作的核心对象是“帧”Frame。它负责的事情包括组帧、拆帧、填充前导码和帧起始定界符、计算和校验FCS帧校验序列、处理MAC地址、实现CSMA/CD载波侦听多路访问与冲突检测的访问控制逻辑半双工时。换句话说MAC层关心的是“这一帧数据格式对不对”“发给谁”“从哪来”“有没有传错”。但MAC层有一个底线它不关心这些二进制比特最终是怎么变成电信号、光信号跑到网线里去的。MAC层输出的还是并行的数据流是0和1的逻辑序列不是差分电压不是电流环更不会去管双绞线里的极性反转。1.2 PHY层管“电”不管“帧”PHYPhysical Layer物理层就是干脏活累活的。它要把MAC层丢过来的并行数据流做并串转换然后按照物理介质的规则编码成能在网线上传输的信号。以百兆以太网为例PHY芯片会把4比特的并行数据TXD[3:0]用MLT-3编码再通过差分对发送出去千兆以太网则用4D-PAM5编码一对线上同时收发。接收方向相反PHY从网线上把微弱的差分信号收下来经过均衡、解码、去抖、时钟恢复还原成并行数据交给MAC。PHY内部通常还可以拆成PCS物理编码子层、PMA物理介质附接子层、PMD物理介质相关子层。PCS干编码的活比如100BASE-TX的4B/5B编码、1000BASE-T的8B/1B4B编码和扰码PMA干并串转换和时钟恢复PMD则直接和介质打交道比如负责和网口变压器、RJ45的连接。对大多数开发者来说不需要把这几个子层背得滚瓜烂熟但脑子里要有这个概念后面看PHY芯片数据手册时就不会懵。1.3 为什么非要拆成两个东西以太网把MAC和PHY分开本质上是工程上的妥协和分层思想的胜利。从工艺角度看MAC是纯数字逻辑喜欢用先进制程现在很多SoC里MAC直接是硬核IP或者用FPGA逻辑实现而PHY里面有模拟电路、混合信号处理、SerDes对工艺要求完全不同。硬把两者做到一颗芯片里成本和良率都很难看。这就是为什么绝大多数MCU比如STM32只内置MAC需要外挂一颗PHY芯片。从协议演进角度看以太网速率从10M到100M、1000M、10GPHY的编码方式、信号处理变化巨大但MAC层的帧格式基本没怎么动。把MAC和PHY的接口标准化MII、GMII、RGMII、SGMII这些就能做到MAC不变、PHY随便换。今天你板子上挂一颗瑞昱的RTL8211F做千兆明天想换成国产的裕太微PHY只要接口兼容驱动和硬件改动都很小。提示判断一块板子的网络问题第一件事永远是先锁定是MAC侧还是PHY侧。MAC负责“脑子里想什么”PHY负责“嘴上说什么”两边脱节问题就来了。2. 从MII到SGMIIMAC和PHY之间的接口选型逻辑MAC和PHY之间的接口是这两颗芯片“对话”的通道。接口选得对不对直接决定硬件能不能跑起来。这个接口家族很大但核心就几个MII、RMII、GMII、RGMII、SGMII。我按速率和使用场景逐个拆。2.1 10/100M时代的经典双雄MII与RMIIMIIMedia Independent Interface是IEEE 802.3定义的原始标准接口。它用4位数据发送TXD[3:0]和4位数据接收RXD[3:0]加上TX_CLK、RX_CLK、TX_EN、RX_DV、TX_ER、RX_ER、CRS、COL等控制信号总共16根信号线工作在25MHz时钟下实现100Mbps2.5MHz下实现10Mbps。MII最大的问题是引脚多。如果你用的是MCU本来GPIO就紧张再为以太网掏出十几根线板子布局布线很痛苦。于是有了RMIIReduced MII精简MII。RMII把数据线砍成2位发送TXD[1:0]和2位接收RXD[1:0]所有信号统一用50MHz参考时钟总共只需7根信号线。代价是RMII不能像MII那样让MAC和PHY各自提供时钟必须由一个共同的50MHz时钟源驱动而且对时钟精度、PCB走线等长的要求更高。选择建议很直接百兆以下优先RMII。不是因为MII不好而是引脚太奢侈。STM32F4/F7/H7系列内置了支持RMII和MII两种模式的MAC硬件上一般默认走RMII。2.2 千兆的大门GMII与RGMII速率到千兆之后MII/RMII那套带宽不够了。GMIIGigabit MII用8位数据收发125MHz时钟双向合计2Gbps的带宽才扛得住千兆全双工。但GMII的信号线数量更多一共24根管理、布局、EMC全是麻烦。PCB上差一点跑起来就不稳定。所以现在千兆芯片清一色用RGMIIReduced GMII数据线收发各4位时钟125MHz利用DDR双沿采样上升沿采低4位下降沿采高4位把8位数据塞进4根线里。RGMII的引脚少但时序要求很高因为数据信号要在时钟的双沿都满足建立保持时间。实际项目中RGMII走线一般要求做了等长约束组内偏差控制在50mil以内才稳妥。2.3 SGMII串行接口的铁杆地位SGMIISerial Gigabit MII走的是另一条路。它把MAC和PHY之间的数据变成1对发送差分线TX_P/N和1对接收差分线RX_P/N速率1.25Gbps用8B/10B编码传输。换句话说MAC和PHY之间跑的是高速SerDes不再是并行总线。SGMII的好处非常明显引脚少、抗干扰强、传输距离远几十厘米到一米都没问题。所以很多高端交换芯片、FPGA、带SerDes的处理器都倾向于用SGMII。代价是MAC侧必须集成SerDes硬核不是随便一个MCU都带这功能。FPGA开发里经常遇到一个问题SGMII IP核与PHY芯片一起使用时SGMII IP核应该配置成什么模式答案是当FPGA内部例化的是带MAC功能的SGMII IP核、外部接一个标准PHY芯片时IP核必须配置成MAC模式PHY芯片工作在PHY模式反过来如果FPGA里用SGMII IP核做PHY侧、对接交换芯片的MAC侧那就要配成PHY模式。很多人第一次搞这个IP核模式配反了SGMII的链路建立不起来还以为是硬件问题。这个坑我踩过印象极深。为了帮助选型我整理了一张常用接口对比表接口数据位宽时钟频率信号线数量双沿采样适用速率典型应用场景MII4425MHz~16否10/100M老式MCU/NPURMII2250MHz~7否10/100MSTM32、嵌入式Linux板GMII88125MHz~24否1000M早期千兆交换/FPGARGMII44125MHz~12是10/100/1000M当前主流千兆网口方案SGMII11串行1.25Gbps4两根差分对不适用1000MFPGA/SoC/交换芯片互联提示PCS层在SGMII中的作用被很多人忽略。SGMII本身跑的是1.25Gbps的串行流如果MAC侧想跑100M或10M就必须在PCS层做速率适配通过插入IDLE码或者重复数据包的方式而不是简单把时钟降下来。这一点在调试“SGMII只Link上千兆、百兆不通”的故障时非常关键。3. 独立PHY芯片、MCU内置MAC和FPGA三条主流硬件路径怎么选回到实际做项目你不可能从零造一个以太网控制器大多数时候是在三种现成方案里做选择题。3.1 路径一MCU内置MAC 外部PHY芯片代表就是STM32系列F407/F429/H743等加一颗百兆或千兆PHY。STM32内部已经有ETH外设以太网MAC内核你可以通过RMII或MII接口连接外部PHY芯片比如LAN8720A百兆、RTL8211F千兆、DP83848百兆、国产的裕太微YT8512C百兆等。选这条路的核心逻辑是MCU负责协议栈和业务PHY芯片只做物理层信号转换。软件上配合STM32的ETH驱动和LwIP协议栈很快就能跑通一个TCP服务器。这里有个容易忽视的细节百兆PHY和千兆PHY的时钟方案不一样。百兆RMII需要外接50MHz参考时钟由MAC侧提供MCU输出50M到PHY的REF_CLK或者由PHY提供50M给MAC。千兆RGMII通常需要25MHz晶振给PHYPHY内部PLL倍频到125MHz再输出125MHz的RX_CLK给MAC。晶振、时钟芯片、参考时钟电阻这些原理图阶段就要定清楚不然后期飞线很难救。STM32配置以太网还有一个经典坑RMII接口的REF_CLK到底是MAC输出还是PHY输出不同PHY芯片的默认模式不一样。LAN8720A支持外部50MHz时钟输入到REF_CLK也有内部时钟输出模式需要在原理图上确认CLK_OUT引脚有没有接对。我见过好几块板子原理图照抄了别的项目PHY芯片的REF_CLK没接对导致RMII完全不通。3.2 路径二FPGA三速以太网MAC IP 外部PHYFPGA方案灵活但代价是要自己搞定MAC逻辑。以Xilinx为例Vivado里提供Tri-Mode Ethernet MAC三速以太网MACIP支持10/100/1000M自适应内部可以选择GMII/RGMII/SGMII接口对外连接PHY。Altera现在叫Intel FPGA也有类似的TSE MAC IP。FPGA方案适合什么场景需要自定义帧格式、需要硬件级时间戳比如工业以太网、TSN、需要多网口、或者想做一个协议转换桥的场合。比如做工业网关前面一路百兆以太网接到PLC后面一路千兆上联到服务器中间做协议转换这种用两颗PHY加一颗FPGA很合适。FPGA三速以太网最需要注意的是时序约束。RGMII的双沿采样约束、SGMII的GTX收发器约束、异步时钟域转换PHY的RX_CLK和FPGA逻辑时钟不同源这些不做好综合实现后板子就跑不到千兆。很多人第一次跑通百兆就很兴奋结果把接口切到千兆发现RX方向丢包严重其实就是时序约束没做全。3.3 路径三集成MAC-PHY的单片方案有些芯片把MAC和PHY做在一起比如WIZnet的W5500硬件TCP/IP协议栈MACPHY或者Microchip的LAN9252带EtherCAT从站控制器。这类芯片对开发者最友好不需要关心MAC和PHY的接口细节SPI/并口直接读写就行。但它也有明显的局限灵活性差。W5500只支持百兆不支持千兆而且硬件协议栈功能是固定的不能自定义。适合做简单的数据采集、工业网关、远程IO这类应用不适合做高性能、高定制的网络设备。国产百兆PHY芯片这两年也起来了不少板子上用裕太微、昆高新芯这些国产物料替换国外型号基本可以做到引脚兼容、寄存器兼容替换起来比较省事。但要注意的是寄存器兼容不代表行为完全一致尤其是中断状态位、Link状态的变化时序最好逐项验证。4. 上电联调里的真实坑Link不上的排查链路与波形经验这部分是我最想写的。原理图设计得再漂亮一上电Link不上一切白搭。我总结了一套自己的排查链路按步骤走大多数问题半小时内能定位。4.1 第一步分清是MAC侧没活还是PHY侧没活网口插上线电脑或交换机那边没反应第一个要搞清楚的问题是PHY有没有Link上。看PHY芯片的Link状态寄存器比如百兆PHY的BMCR/BSR寄存器或者厂商自定义寄存器里的Link Status位。如果PHY自己都Link不上那问题大概率在PHY及外围电路如果PHY Link上了但MAC侧不通那就是MAC和PHY之间的接口、时钟、数据路径的问题。这个判断一步到位避免在错误的方向上白忙活。用STM32的话可以通过ETH外设的状态寄存器查看如果是FPGA可以通过ILA抓SGMII/RGMII接口的信号如果用的是Linux系统直接ethtool eth0就能看到Link检测结果。4.2 第二步查时钟、复位、管理接口PHY芯片的三根救命稻草是时钟、复位、SMI管理接口。时钟用示波器量PHY的XI/XO引脚或者CLK_IN确认时钟频率是否正确。百兆RMII看50MHz千兆RGMII看25MHzSGMII看内部的125MHz参考时钟。时钟没有或者频率不对PHY就像人没有了心跳一切免谈。复位检查PHY的复位引脚时序。很多PHY要求复位信号保持低电平至少10ms释放后还要等内部PLL稳定一般100ms级别才能访问寄存器。MCU的GPIO复位和电源上电复位时序差异很大建议用示波器测一下复位释放到第一次MDIO读写之间的间隔。MDIO管理接口MDC管理时钟最高约2.5MHz和MDIO管理数据是MAC读PHY寄存器的通道。上电后用逻辑分析仪或示波器看MAC有没有发起MDIO读写。如果MDIO波形上压根没有活动说明MAC侧的驱动配置没起来如果MDIO一直读回0xFFFF多半是PHY地址不对或者PHY没上电、没复位。0xFFFF是带不上拉电阻的总线在无设备应答时的典型表现。4.3 第三步用示波器看关键波形Link不上的时候建议按照“PHY侧→MAC侧”的方向看波形。RJ45到网络变压器这一段用示波器探头放在网络变压器的中心抽头或者PHY的差分输出引脚看有没有信号跳变。正常连接交换机的状态下PHY会持续发送link pulse链路脉冲百兆以太网的LPI/idle信号千兆的Master-Slave训练序列这些在时域上都能看到周期性脉冲。RGMII/MII数据线如果PHY已经Link上但数据不通抓RX_DV、RX_CLK、RXD的波形。做一个简单的回环测试让MAC持续发数据看PHY的发送引脚和接收引脚是否都有波形。注意RGMII的RXD[3:0]在双沿采样模式下数据只在时钟的上升沿和下降沿有效示波器采样率不够的话看起来会像毛刺。时钟质量RJ45的差分信号一般用差分探头看没有差分探头就用单端探头夹在正端看幅度、上升沿、有无明显抖动。信号幅度太低比如不到500mVpp先查网络变压器、偏置电阻有些PHY需要中心抽头接2.5V或3.3V、信号线路由有没有跨分割。4.4 寄存器回读与回环测试在板级调试里做两个高性价比实验一是PHY内部回环测试。通过MDIO把PHY的BMCR寄存器地址0x00bit14置1开启Digital Loopback。此时PHY会把发送出去的数据原路送回接收方向MAC侧如果能收到自己发出去的帧说明MAC与PHY之间的数据通路是好的、PHY的编解码逻辑是好的收不到就是中间某个环节断了。二是MAC侧回环测试。很多MAC控制器支持内部回环loopbackSTM32的ETH外设和FPGA的MAC IP都有这个功能。在MAC侧回环打通之后再打开PHY回环逐步缩小问题范围。这个思路和排查串口类似先验软件、再验硬件、再验外部链路。软件层面还有个大杀器Linux下的回环测试指令。如果目标板跑的是嵌入式Linux配置好IP后用ethtool -t eth0可以跑offload自测ip link set eth0 up看Link状态用ping测本机IP验证协议栈再用ethtool --phy-test触发PHY芯片内置的自测模式。Windows下可以用Device Manager里的网卡诊断功能但嵌入式Linux环境更常见。我们平时调试以太网还有一个很趁手的工具Wireshark。比如你想确认某个数据包从发送源出来后字节内容到底是什么样直接在Wireshark里按MAC地址过滤看帧头的目的MAC、源MAC、EtherType再往下看Data字段的实际字节。抓包看的是MAC层以上但如果你在PHY回环模式下抓包能直接验证MAC层组帧是否正常。4.5 “以太网没有有效IP配置”的另类解读常有人问Windows提示“以太网没有有效IP配置”怎么办。多数时候这确实是DHCP没拿到地址属于软件/协议栈配置问题。但还有一种情况你的网卡根本没Link上——插着一根断线、接了一个没供电的交换机、对端设备没起来操作系统拿不到链路自然分配不到IP。排查方法很简单插上网线后看网卡状态是不是“已启用”且有“正在识别网络”。如果一直显示“网络电缆被拔出”先把PHY侧的Link状态寄存器读一遍确认硬件是否识别到对端。不要一上来就折腾IP设置那会把问题带偏。5. 车载以太网带来的新玩法单对双绞线下的MAC-PHY变局文章最后想聊聊车载以太网。热搜词里“车载以太网”反复出现STM32配车载以太网PHY也是不少工程师正在做的事。5.1 100BASE-T1一对线搞定的百兆传统以太网用两对或四对双绞线而车载以太网100BASE-T1只用一对双绞线就能实现100Mbps全双工。它是怎么做到的核心是回波消除Echo Cancellation技术——发送和接收在同一对线上同时进行PHY芯片内部用混合电路Hybrid将本端发送信号对接收信号的干扰消除掉从而实现单线对的全双工传输。这和传统电话线Modem的原理类似。100BASE-T1的编码方式是PAM3三电平脉冲幅度调制这是为了在有限的差分信号带宽里塞进足够多的数据同时降低EMI满足汽车电子严格的电磁兼容要求。PHY内部除了PCS/PMA/PMD还多了复杂的回声消除器Echo Canceller和均衡器Equalizer。5.2 PHY集成度的变化与TC10车载以太网对功耗和待机电流有严格的要求。传统以太网PHY在MAC不发送数据时依然保持Link脉冲和时钟恢复电路工作功耗相对较高。车载以太网引入了OPEN Alliance TC10标准定义了如何在车辆休眠状态下关闭PHY的大部分电路只保留一个极低功耗的“嗅探”模式用于检测远程唤醒信号。这在传统的MAC-PHY架构设计里是很少考虑的事情。用STM32等MCU配合车载以太网PHY比如Marvell的88Q2112、NXP的TJA1101等做项目时除了关注RMII/RGMII数据接口还要特别关注TC10状态机的控制——如何进入Sleep、如何Wakeup、唤醒之后PHY重新Link需要多长时间这些参数直接影响整车的电源管理策略。5.3 对开发者的启示车载以太网给我们的启示其实很简单MAC和PHY的分工逻辑不会变但PHY要做的事越来越多——更复杂的编码、更强的抗干扰、更精细的功耗管理。做底层以太网开发的人如果只停留在“MAC出帧、PHY出电”这个层面后面会越来越吃力。建议有空多看看PHY芯片的datasheet里的状态机部分特别是Link Training、Auto-Negotiation、Sleep/Wake这几个流程它们在未来的车载、工业、TSN场景里全是基础。再说个实际体会。车载以太网PHY的不少寄存器定义和传统PHY不太一样厂商自定义寄存器比例高很多测试时最好先把datasheet里的寄存器表格完整过一遍特别是带自协商、休眠唤醒、诊断相关的寄存器。用MDIO盲调不是不行但效率太低我习惯上电后先把所有PHY寄存器读一遍存成快照出问题了对照快照和当前状态定位能快不少。以太网底层的知识说到底是“懂帧、懂电、懂时序”三件事。把MAC和PHY的关系搞明白后面看交换芯片、看TSN、看车载总线都会顺很多。这两颗芯片之间的那根接口总线就是整个以太网世界的地基。
返回列表