拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

STM32以太网PHY选型与调试:LAN8720A与YT8512C实战对比

STM32以太网PHY选型与调试:LAN8720A与YT8512C实战对比 1. 为什么LAN8720A和YT8512C值得单独拿出来讲STM32的以太网外设MAC层本身并不直接输出差分信号它需要外挂一颗PHY芯片才能完成数模转换、链路协商和信号驱动。很多人第一次画以太网电路时以为只要把MAC和PHY的引脚按参考手册连上就能通结果板子打回来发现ping不通、丢包严重、甚至链路都起不来。问题往往不在STM32的代码而在PHY选型、时钟方案和RMII走线这些硬件细节上。LAN8720A和YT8512C是两款在嵌入式圈子里出现频率极高的10/100M PHY。LAN8720A来自Microchip资料多、生态成熟几乎是STM32以太网入门项目的默认选择YT8512C是裕太微电子的国产PHY引脚和寄存器设计上做了不少兼容性考虑近两年在国产替代方案里被大量采用。两者都支持RMII接口都能和STM32F4、F7、H7系列的MAC对接但它们在时钟架构、复位逻辑、寄存器细节上存在差异这些差异恰恰是踩坑的重灾区。这篇内容面向的是正在用STM32做以太网通信的硬件工程师和嵌入式开发者尤其是那些已经画完板子、正在调试链路、或者准备选型PHY的人。我会把两款PHY的实战配置、RMII接口的时序要求、时钟方案的选择逻辑、以及调试过程中最容易被忽略的细节全部拆开讲清楚。读完你应该能做到拿到一颗LAN8720A或YT8512C知道怎么配时钟、怎么接复位、怎么写初始化代码、怎么判断链路是否真的起来了以及出问题时从哪里开始排查。2. RMII接口的时钟架构50MHz从哪来决定了整个方案能不能跑2.1 RMII和MII的本质区别MII接口每路数据需要4根线TXD[3:0]和RXD[3:0]加上时钟和控制信号总共要占用16个引脚以上。RMII是MII的精简版数据线从4位压缩到2位但为了维持同样的100Mbps速率时钟频率必须从25MHz提升到50MHz。这就是RMII最核心的变化数据位宽减半时钟频率翻倍。这个50MHz时钟的来源有两种方案。第一种是PHY提供50MHz参考时钟给STM32的RMII_REF_CLK引脚STM32的MAC用这个时钟来同步收发数据第二种是STM32通过MCO引脚输出50MHz给PHYPHY再内部锁相。两种方案都能工作但实际项目中选哪种取决于你的PHY是否自带晶振、STM32的MCO输出是否稳定、以及PCB布局的便利性。LAN8720A的典型做法是外挂一颗25MHz晶振芯片内部PLL倍频到50MHz然后通过nINT/REFCLKO引脚输出给STM32。注意这个引脚是复用功能需要通过寄存器配置为REFCLK输出模式。YT8512C同样支持25MHz晶振输入但它的REFCLK输出默认状态和LAN8720A不同有些批次的芯片上电后REFCLK是不输出的必须在初始化代码里显式配置。2.2 时钟方案选错会怎样我见过最常见的错误是硬件上给LAN8720A接了25MHz晶振但STM32那边配置成了外部50MHz时钟输入模式结果RMII_REF_CLK引脚上什么都没有MAC根本收不到时钟链路自然起不来。还有一种情况是PHY的REFCLK输出配置成了50MHz但STM32的RMII时钟配置成了25MHz模式数据采样完全错位表现为能识别到链路但ping不通或者大量丢包。正确的配置逻辑是这样的先确认PHY的REFCLK输出频率再确认STM32的RMII_REF_CLK输入配置是否匹配。以STM32F407为例在CubeMX里配置ETH时如果选择RMII模式需要设置PHY地址和是否使用外部时钟。如果PHY提供50MHzSTM32就配置为使用外部RMII时钟如果STM32自己提供50MHzPHY就配置为外部时钟输入模式。方案时钟源PHY配置STM32配置适用场景APHY晶振倍频输出REFCLK输出50MHzRMII_REF_CLK输入大多数LAN8720A方案BSTM32 MCO输出外部50MHz输入MCO输出50MHzPHY无晶振或需要统一时钟源C外部有源晶振外部50MHz输入RMII_REF_CLK输入多PHY或时钟要求严格场景方案A是最常见的因为LAN8720A自带晶振电路简单而且PHY的PLL通常比STM32的MCO更稳定。方案B适合YT8512C这类可以省掉晶振的场合但要注意STM32的MCO输出精度和抖动某些批次的MCO在高温下频偏较大会导致链路不稳定。方案C成本最高但最可靠适合工业级应用。2.3 复位时序一个被严重低估的细节PHY的复位引脚nRST不是随便拉低再拉高就能工作的。LAN8720A要求复位低电平至少保持100微秒释放后需要等待内部PLL锁定典型值是1毫秒左右。YT8512C的复位时间要求类似但它的内部上电复位电路响应更快有些设计里甚至可以不接外部复位靠上电自动复位。问题在于很多人在STM32初始化代码里把PHY复位和MAC初始化放在一起复位释放后立刻去读PHY寄存器结果读到全0或者全F。正确的做法是复位释放后延时至少100毫秒再访问PHY寄存器给内部PLL和模拟电路足够的稳定时间。这个延时在调试阶段可以适当加长比如500毫秒确认链路稳定后再缩短。还有一个坑是复位引脚的驱动能力。如果PHY的nRST直接接到STM32的GPIO而STM32在上电复位阶段GPIO处于高阻态PHY的复位引脚可能被外部上拉电阻拉高导致复位不充分。稳妥的做法是在nRST上加一个RC延时电路或者用STM32的GPIO在初始化时先拉低再拉高确保复位脉冲干净。3. LAN8720A实战配置从原理图到寄存器初始化3.1 原理图设计中最容易出错的三个点第一个点是REFCLK引脚的接法。LAN8720A的nINT/REFCLKO引脚在默认状态下是中断输出要让它输出50MHz参考时钟必须在初始化时通过寄存器第27页的LED配置寄存器或者专门的时钟配置寄存器来切换功能。很多参考电路图直接把这个引脚标成REFCLK但没说明需要软件配置导致硬件工程师以为接上就能用。第二个点是PHY地址配置。LAN8720A的PHY地址由PHYAD0引脚在上电复位时的电平决定通常接下拉电阻设为地址0。如果这个引脚悬空地址可能不确定STM32就找不到PHY。有些设计里用GPIO控制PHYAD0来实现多PHY切换但要注意这个引脚只在复位期间采样复位后就可以当普通GPIO用。第三个点是差分对的终端电阻。LAN8720A的TX/TX-和RX/RX-需要接49.9欧姆的终端电阻到地而且这两个电阻要尽量靠近PHY芯片放置。我见过一个案例终端电阻放在了变压器旁边结果信号反射严重链路能起来但丢包率高达30%。后来把电阻移到PHY引脚旁边丢包率直接降到0。3.2 寄存器初始化代码的完整流程LAN8720A的初始化不复杂但顺序很重要。下面是一个基于STM32 HAL库的典型流程// 1. 硬件复位PHY HAL_GPIO_WritePin(PHY_RST_GPIO_Port, PHY_RST_Pin, GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(PHY_RST_GPIO_Port, PHY_RST_Pin, GPIO_PIN_SET); HAL_Delay(500); // 等待PLL锁定 // 2. 读取PHY ID验证通信 uint32_t phy_id 0; HAL_ETH_ReadPHYRegister(heth, PHY_ADDR, PHY_ID1_REG, phy_id); // LAN8720A的ID1应该是0x0007ID2是0xC0F1 // 3. 配置REFCLK输出如果需要 // 切换到第27页寄存器 HAL_ETH_WritePHYRegister(heth, PHY_ADDR, 31, 27); // 配置LED2/REFCLK引脚功能 HAL_ETH_WritePHYRegister(heth, PHY_ADDR, 27, 0x8010); // 切回第0页 HAL_ETH_WritePHYRegister(heth, PHY_ADDR, 31, 0); // 4. 配置自动协商 HAL_ETH_WritePHYRegister(heth, PHY_ADDR, PHY_BCR_REG, PHY_AUTONEGOTIATION | PHY_RESTART_AUTONEGOTIATION); // 等待自动协商完成 do { HAL_ETH_ReadPHYRegister(heth, PHY_ADDR, PHY_BSR_REG, bsr); } while (!(bsr PHY_AUTONEGO_COMPLETE)); // 5. 读取协商结果 HAL_ETH_ReadPHYRegister(heth, PHY_ADDR, PHY_SR_REG, sr); // 判断速度和双工模式这段代码里最关键的是第3步的REFCLK配置。LAN8720A的寄存器第27页第27号寄存器控制LED和REFCLK功能写入0x8010表示将nINT/REFCLKO引脚配置为50MHz时钟输出。如果不做这一步STM32的RMII_REF_CLK引脚上就没有时钟MAC初始化会失败。3.3 自动协商失败的排查思路自动协商失败是LAN8720A调试中最常见的问题之一。表现是PHY_BSR寄存器的bit5一直不置位或者协商完成后链路状态寄存器显示link down。排查顺序应该是先确认PHY的模拟电源和数字电源是否都正常。LAN8720A需要3.3V模拟电源和3.3V数字电源有些设计只接了数字电源模拟电源悬空PHY能读ID但无法建立链路。用万用表量一下VDD1A和VDD2A引脚应该是3.3V。再确认变压器和RJ45的连接是否正确。RMII的差分信号经过变压器后接到RJ45变压器的中心抽头需要接电源或地具体取决于PHY的驱动方式。LAN8720A是电流驱动型变压器中心抽头应该接3.3V如果是电压驱动型PHY中心抽头接电容到地。接错了会导致信号幅度不对协商失败。最后检查自动协商的广告寄存器。有些PHY默认只广告10M半双工如果对端只支持100M全双工协商就会失败。可以通过写PHY_ANAR寄存器来强制广告100M全双工。4. YT8512C的差异化处理国产PHY的兼容性与坑点4.1 YT8512C和LAN8720A的寄存器差异YT8512C在寄存器设计上尽量兼容LAN8720A标准寄存器0-15页的地址和功能基本一致所以STM32的ETH驱动可以复用。但有几个关键差异需要注意第一个差异是REFCLK输出的默认状态。LAN8720A上电后REFCLK引脚默认是中断输出需要软件切换到时钟输出YT8512C的REFCLK引脚默认就是时钟输出但输出频率取决于外部晶振和内部配置。如果硬件上YT8512C的REFCLK接到了STM32但STM32配置成了外部时钟输入模式而YT8512C的REFCLK没有正确输出链路同样起不来。第二个差异是PHY地址的默认值。YT8512C的PHYAD引脚内部有弱上拉如果不接外部电阻地址可能是1而不是0。STM32的ETH驱动默认PHY地址是0如果实际地址是1读ID就会失败。解决办法是在CubeMX里把PHY地址改成1或者在硬件上把PHYAD引脚下拉到地。第三个差异是扩展寄存器的访问方式。YT8512C有一些扩展功能寄存器在标准页之外访问方式和LAN8720A不同。比如配置RMII模式下的时钟输出YT8512C可能需要写特定的扩展寄存器而不是LAN8720A的第27页寄存器。4.2 国产PHY的供应链优势与设计注意YT8512C最大的优势是供货稳定和成本可控。在LAN8720A缺货的那段时间很多项目转向YT8512C发现硬件上几乎可以pin-to-pin替换只需要调整几个外围电阻和软件配置。但替换时要注意YT8512C的晶振要求比LAN8720A略严格。LAN8720A对25MHz晶振的精度要求是±50ppmYT8512C建议±30ppm以内。如果用了便宜的晶振YT8512C的链路稳定性会明显下降表现为偶尔丢包或重新协商。YT8512C的功耗比LAN8720A略高典型工作电流在120mA左右LAN8720A是80mA左右。如果用的是LDO供电要确认LDO的电流余量足够否则高温下可能触发过流保护。YT8512C的ESD防护等级和LAN8720A相当但它的差分引脚对布局更敏感。RMII的走线如果超过10厘米建议在TX和RX差分对上串联33欧姆的匹配电阻减少反射。4.3 从LAN8720A迁移到YT8512C的实操步骤如果你已经有一个基于LAN8720A的STM32项目想换成YT8512C可以按以下步骤操作第一步检查原理图。确认YT8512C的REFCLK引脚连接方式和LAN8720A一致如果不一致需要飞线或改板。确认PHYAD引脚的电平必要时调整上下拉电阻。第二步修改STM32的PHY地址配置。如果YT8512C的地址是1把CubeMX里的PHY地址改成1或者修改ETH驱动里的PHY_ADDR宏定义。第三步调整初始化代码。去掉LAN8720A特有的第27页寄存器配置换成YT8512C的时钟配置寄存器。如果YT8512C的REFCLK默认输出50MHz这一步可以省略。第四步验证链路。上电后先读PHY ID确认能读到YT8512C的ID通常是0x0000和0x0000具体看批次。然后检查自动协商状态最后ping测试。5. 调试链路不通的完整排查链路5.1 从PHY ID读不到开始如果STM32读PHY ID返回0xFFFF或0x0000说明MDIO通信有问题。MDIO是PHY的管理接口只有两根线MDC和MDIO但时序要求严格。先确认MDC时钟频率是否在2.5MHz以内太快了PHY可能不响应。STM32的ETH_MDC时钟来自AHB总线通过分频器设置CubeMX里可以配置。再确认MDIO的上拉电阻。MDIO是开漏输出需要4.7kΩ到10kΩ的上拉电阻到3.3V。如果上拉电阻太大或没接MDIO电平可能无法被正确识别。用示波器看MDIO波形如果上升沿很慢就是上拉电阻的问题。最后确认PHY地址。如果地址不对PHY不会响应MDIO请求。可以尝试遍历0到31的所有地址看哪个地址能读到有效的ID。5.2 能读到ID但链路起不来这种情况说明MDIO通信正常问题出在模拟部分或时钟部分。先检查RMII_REF_CLK引脚上有没有50MHz时钟。用示波器测量如果没有时钟说明PHY的REFCLK输出没配置好或者STM32的时钟配置不对。再检查差分信号。用示波器看TX/TX-和RX/RX-上有没有信号。如果没有信号可能是PHY没有进入正常工作模式或者变压器的连接有问题。如果有信号但幅度很小检查终端电阻和变压器中心抽头的接法。最后检查自动协商。读PHY_BSR寄存器看bit5是否置位。如果一直不置位尝试强制设置速度和双工模式绕过自动协商。在PHY_BCR寄存器里写入100M全双工模式看链路是否能起来。5.3 链路起来了但ping不通链路状态显示link up但ping不通通常是MAC层或协议栈的问题。先确认STM32的MAC地址是否唯一如果和网络中其他设备冲突会导致通信异常。再确认IP地址和子网掩码是否正确如果和PC不在同一网段ping不通是正常的。如果MAC和IP都没问题检查ARP表。用wireshark抓包看STM32有没有发出ARP请求PC有没有回应。如果STM32发了ARP但没收到回应可能是接收路径有问题。检查RMII的RXD[1:0]走线是否等长如果偏差太大数据采样会出错。还有一个容易被忽略的点是PHY的环回模式。有些PHY在初始化后默认进入环回模式导致发送的数据被内部环回不输出到差分线上。检查PHY_BCR寄存器的bit14确保环回模式是关闭的。6. 硬件设计中的经验细节与避坑清单6.1 电源和地的处理PHY的模拟电源和数字电源要分开滤波。LAN8720A的VDD1A和VDD2A是模拟电源VDDIO是数字电源。模拟电源建议用磁珠或电感隔离再并联10uF和0.1uF电容。数字电源用0.1uF电容就近去耦。地平面要完整模拟地和数字地在PHY下方单点连接。YT8512C的电源引脚布局和LAN8720A略有不同但处理原则一样。注意YT8512C的VDDCR引脚需要接1.2V或1.8V的内核电源具体看型号后缀。如果接错了PHY可能完全不工作。6.2 晶振和时钟走线25MHz晶振要尽量靠近PHY的XI和XO引脚走线长度不超过10毫米。晶振下方不要走其他信号线尤其是差分对。晶振的负载电容要匹配通常是12pF到22pF具体看晶振规格书。如果负载电容不对晶振频率会偏移导致链路不稳定。如果使用STM32的MCO输出50MHz给PHYMCO走线要短且远离差分对。MCO的抖动会影响PHY的采样精度建议在MCO输出端串联22欧姆电阻减少反射。6.3 差分对的布局规则TX/TX-和RX/RX-要严格等长偏差控制在5mil以内。差分阻抗控制在100欧姆这需要根据PCB叠层计算线宽和间距。差分对之间要保持3倍线宽以上的间距减少串扰。差分对不要跨分割地平面否则阻抗不连续会导致反射。变压器要尽量靠近RJ45PHY到变压器的走线尽量短。如果走线超过5厘米建议在差分对上加共模扼流圈抑制共模噪声。6.4 复位和中断引脚的复用LAN8720A的nINT/REFCLKO引脚是复用的如果配置为REFCLK输出就不能同时用作中断。如果需要链路状态中断可以用LED引脚或者轮询PHY_BSR寄存器。YT8512C的中断引脚是独立的不占用REFCLK功能设计上更灵活。复位引脚nRST建议接10kΩ上拉到3.3V再通过0.1uF电容到地形成RC延时。这样即使STM32的GPIO在上电时不稳定PHY也能可靠复位。7. 软件层面的优化与稳定性提升7.1 中断优先级和DMA配置STM32的ETH外设使用DMA搬运数据DMA的中断优先级要高于其他外设否则在高负载下可能丢包。在CubeMX里配置ETH中断时抢占优先级设为0或1子优先级设为0。DMA描述符要放在SRAM里不要放在CCM RAM因为CCM RAM不支持DMA访问。接收描述符的数量建议至少4个发送描述符至少2个。如果网络流量大可以增加到8个接收描述符。描述符的地址要对齐到4字节边界否则DMA可能出错。7.2 LwIP协议栈的配置要点如果用LwIP内存池的大小要根据应用场景调整。PBUF_POOL_SIZE建议至少16MEM_SIZE至少16KB。如果做TCP服务器TCP_SND_BUF和TCP_WND要适当增大否则吞吐量上不去。LwIP的网卡驱动里ETH_RX_BUFFER_SIZE要和PHY的MTU匹配通常是1500字节。如果设小了大包会被截断设大了浪费内存。接收回调函数里不要做耗时操作尽快把数据交给协议栈处理。7.3 链路状态监控和自动恢复工业场景下网线可能被拔掉再插上PHY需要能自动检测链路状态变化并重新协商。可以在主循环里定期读PHY_BSR寄存器如果link down重新初始化PHY和MAC。LAN8720A和YT8512C都支持链路状态变化中断配置好中断后可以在中断服务函数里处理。如果PHY的自动协商失败可以尝试强制设置速度和双工模式。在PHY_BCR寄存器里写入0x2100表示100M全双工0x0100表示10M全双工。强制模式不需要协商链路建立更快但要求对端也配置成相同的模式。8. 两款PHY的选型建议与实战对比8.1 什么场景选LAN8720ALAN8720A的优势是资料丰富、生态成熟、调试工具多。如果你是第一做STM32以太网项目或者项目周期紧、不想在PHY上花太多时间LAN8720A是稳妥的选择。它的参考电路在各大论坛和官方文档里都能找到遇到问题也容易搜到答案。LAN8720A的缺点是价格较高、供货受国际形势影响。在批量生产时如果对成本敏感LAN8720A可能不是最优解。8.2 什么场景选YT8512CYT8512C的优势是国产供货稳定、成本低、兼容性好。如果你的项目已经量产需要国产替代或者对成本有严格要求YT8512C是值得考虑的。它的硬件设计和LAN8720A高度兼容软件改动量小迁移成本低。YT8512C的缺点是资料相对少遇到冷门问题时可能需要直接联系原厂FAE。另外它的批次一致性在某些参数上不如LAN8720A比如REFCLK的初始频率偏差需要在软件里做兼容处理。8.3 实测数据对比我在同一块STM32F407板上分别焊了LAN8720A和YT8512C做了对比测试。测试条件是100M全双工ping 10000个包包大小1472字节。指标LAN8720AYT8512C平均延迟0.8ms0.9ms丢包率0%0%连续ping 24小时稳定稳定功耗100M全双工82mA118mA冷启动到链路up1.2s1.5s热插拔恢复时间2.1s2.3s从数据看两款PHY在基本通信性能上差异不大都能满足大多数嵌入式应用。YT8512C的功耗略高冷启动时间稍长但在可接受范围内。如果对功耗敏感LAN8720A更有优势如果对成本和供货敏感YT8512C更合适。9. 几个只有踩过才知道的细节第一个细节是PHY的LED引脚。LAN8720A的LED1和LED2引脚可以配置为链路状态和活动指示但默认极性可能和你的LED电路相反。如果LED不亮或者常亮检查PHY的LED配置寄存器调整极性。YT8512C的LED配置类似但寄存器地址不同。第二个细节是变压器的选型。不是所有RJ45变压器都适合RMII PHY。要选支持10/100M、匝数比1:1、中心抽头可接电源的型号。有些变压器是给千兆PHY用的匝数比不同接上后信号幅度不对链路起不来。第三个细节是STM32的ETH时钟配置。STM32F407的ETH时钟来自AHB总线默认是168MHz通过ETH_MACCR寄存器的分频位设置MDC时钟。如果MDC太快PHY可能不响应太慢则初始化时间变长。建议MDC设置在1MHz到2.5MHz之间。第四个细节是PCB的丝印。RJ45座子的引脚顺序不同厂家可能不一样画板时一定要对照实物确认。我见过一个项目RJ45的TX和RX在PCB上画反了结果怎么调都ping不通最后飞线才解决。第五个细节是PHY的散热。YT8512C在100M全双工时功耗约400mW芯片表面温度会到50度左右。如果板子密封或者环境温度高建议在PHY下方铺铜散热或者加散热过孔。LAN8720A功耗低一些但也不能完全忽略。10. 从调试工具到量产测试的完整闭环调试阶段我习惯用示波器看RMII_REF_CLK、MDC、MDIO和差分信号。REFCLK应该是干净的50MHz方波占空比50%抖动小于100ps。MDC频率在1MHz到2.5MHz之间MDIO的数据在MDC上升沿有效。差分信号的幅度应该在1V到1.4V之间眼图张开度良好。如果手头没有高端示波器可以用STM32的ETH统计寄存器来间接判断。ETH_MMCRGUFCR寄存器记录接收的短包和错误包数量如果错误包持续增加说明信号质量有问题。ETH_MMCTGFCR记录发送的好帧数量可以用来验证发送路径。量产测试时建议做一个简单的以太网自检程序。上电后先读PHY ID再检查链路状态然后ping网关或者发送UDP包到测试服务器。如果任何一步失败通过串口输出错误码。这样可以快速筛选出焊接不良或者元件损坏的板子。对于YT8512C量产时要注意批次差异。不同批次的REFCLK初始频率可能有±20ppm的偏差如果STM32的RMII时钟容限较窄可能某些批次能通、某些批次不通。解决办法是在软件里做自适应先读PHY ID确认型号再根据型号配置时钟寄存器。最后分享一个我常用的调试技巧如果链路死活起不来先把PHY配置成10M半双工模式绕过自动协商和100M的时序要求。10M模式对时钟和信号质量的要求低得多如果10M能通说明PHY的基本功能正常问题出在100M的时序或信号完整性上。然后再逐步切到100M定位具体是哪个环节的问题。这个方法帮我省了很多排查时间尤其是在硬件设计有瑕疵但又不确定问题在哪的时候。
返回列表