ARTICLE DETAIL

资讯详情

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

LAN8720硬件设计避坑指南:晶振、PHY地址、复位时序等关键细节

LAN8720硬件设计避坑指南:晶振、PHY地址、复位时序等关键细节 前阵子帮朋友调一块带网口的板子主控是STM32F407PHY用的就是LAN8720。板子第一版流片回来现象很典型上电后Link指示灯偶尔亮MDIO读PHY寄存器时好时坏ping包有一定概率丢甚至有时候干脆协商不上100M。对着原理图查了大半天最后发现三个问题叠加——晶振负载电容配错了导致频率偏差偏大PHY地址上下拉电阻用了默认值但固件里写的是另一个地址网络变压器次级中心抽头的Bob Smith端接还被抄错了一个器件。这类问题我在过去几个项目里都碰到过所以这次索性把LAN8720硬件设计里最容易翻车的几个点系统梳理一遍从晶振方案、PHY地址配置、供电去耦、复位时序到网络变压器与差分布线一次说清楚。LAN8720这芯片用的人极多但资料越是满地都是越要小心——网上很多原理图都是互相抄的抄来抄去把原版里的坑也一起抄过去了。这篇文章只讲硬件设计时能落地的东西软件部分只提必要的那几句。1. 先从整体方案理解LAN8720再谈五处细节1.1 LAN8720到底是个什么角色LAN8720是Microchip原SMSC出品的一颗低功耗10/100M以太网PHY芯片。它本身不跑什么协议栈干的全是物理层的活把MAC送过来的RMII接口数字信号转换成能在网线上传输的模拟差分信号同时负责载波侦听、链路状态检测、自动协商这些脏活累活。你的MCU只需要支持RMII接口外围挂一颗LAN8720再加个带隔离变压器的RJ45座一个标准网口就这么出来了。很多人一上来就纠结“为什么不能用W5500那种带TCP/IP协议栈的芯片”这其实是两类东西。W5500是MACPHY协议栈全集成的方案CPU几乎不参与网络协议处理适合单片机裸机开发LAN8720则只是PHYMAC和协议栈都在你的主控里比如STM32的内置以太网MAC或者ESP32的EMAC外设。后者更灵活、吞吐量上限更高也更容易和RTOS/Linux这类系统配合代价是你的主控必须自带或者用外部MAC驱动也得自己写一部分。1.2 三种最典型的硬件架构不同主控接LAN8720电路形态差不多但时钟方案和复位策略会有差异。STM32 RMIISTM32F4/F7/H7系列带MACRMII接口需要的50MHz参考时钟可以由STM32的MCO引脚输出也可以由LAN8720从25MHz晶振内部倍频后输出给MAC。两种方式我都用过前者需要对MCO引脚做配置后者要注意REF_CLKO的信号质量。ESP32 LAN8720ESP32内置EMAC官方很多开发板就是拿LAN8720做网口。这里有个特殊点ESP32的RMII时钟推荐用外部50MHz有源时钟直接给MAC和PHY以减少内部PLL带来的抖动所以你会看到一些ESP32的参考设计里LAN8720旁摆了一颗50MHz有源晶振而不是25MHz无源晶振。其他MCU/DSP RMIIGD32、AT32、NXP的LPC系列甚至一些FPGA只要支持RMII就可以照搬LAN8720的典型电路重点仍然是时钟源、PHY地址和复位时序这三件事。我画过不少带网口的板卡第一版最容易出问题的永远不是原理图逻辑而是细节晶振起没起振、PHY地址上下拉和固件对不对得上、复位上电时序是否满足、变压器中心抽头接法是否符合PHY手册。下面五个细节就是我把踩过的坑按频率排序后的结果。2. 细节一晶振与时钟方案25MHz还是50MHz不是拍脑袋定的2.1 25MHz无源晶振方案与负载电容计算LAN8720的XI/XO引脚可以直接接一颗25MHz无源晶振这是最常规的做法也是绝大多数STM32参考设计采用的方式。电路很简单晶振接在XI和XO之间两端分别对地接一颗负载电容同时晶振两端还要并联一个1MΩ左右的偏置电阻。很多芯片内部已经集成了这个反馈电阻但外挂一个也不会有副作用方便调试时断开验证。真正容易翻车的是负载电容选值。晶振规格书里会标一个负载电容CL常见18pF、20pF你外接的两颗电容C1、C2要和引脚杂散电容一起算满足CL (C1 × C2) / (C1 C2) Cstray其中Cstray是芯片引脚、PCB走线、焊盘带来的杂散电容一般在3~5pF之间。举个例子如果晶振CL18pF杂散按3pF算那(C1×C2)/(C1C2)应该等于15pF对称设计下C1C230pF。所以我经常看到有人用10pF甚至4.7pF的电容配18pF的晶振算出来等效负载只有7~8pF频率偏差自然就偏大了。晶振规格CL推荐C1/C2含约3~5pF杂散备注18pF27~33pF上电后用示波器或频率计微调20pF30~36pF若板子走线短取偏大值12pF18~22pF低频低功耗场景少见选晶振时还要注意ESR和谐振模式。LAN8720这种以太网PHY对频率精度比较敏感建议选择频率容差±30ppm以内的产品太便宜的晶振低温漂和老化带来的频偏会在长时间运行后暴露成丢包问题。ESR尽量控制在40Ω以内起振更干脆。2.2 50MHz外部时钟方案什么情况下才值得用为什么会有50MHz外部时钟的需求因为RMII接口本来就要求50MHz参考时钟。LAN8720用25MHz晶振时内部会自己倍频出50MHz给RMII所用这是最省事的方案。但如果你的板子上本来就有稳定干净的50MHz时钟源或者主控尤其是ESP32这种自带EMAC的芯片对参考时钟抖动要求较高那直接用外部50MHz时钟进入XI引脚、XO悬空也是一种很常见的做法。网上很多ESP32 LAN8720的硬件设计里你会看到一颗50MHz有源晶振给两处供时钟一路给ESP32的RMII REF_CLK一路给LAN8720的XI。这样做的好处是MAC和PHY共用一个时钟源不存在PLL倍频后的相位差问题丢包率在重负载下可能更低。需要注意的有三点第一50MHz时钟信号质量要求比25MHz晶振更高上升沿要陡、抖动要小如果用MCU的GPIO引脚下来的50MHz时钟中间最好串一颗22~33Ω电阻做阻抗匹配走线尽量短第二XO引脚要悬空不要接任何东西第三有源晶振的电源要去耦好给晶振单独加一个100nF电容是基本操作。2.3 晶振PCB布局包地不是万能的走线短才是王道关于晶振布局网络上问得最多的就是“晶振需要包地吗”。我的经验是晶振周围铺一圈地并打几个过孔连接到主地对抑制谐波辐射有好处但不要为了包地把晶振四面围得密不透风。过度包地会让晶振区域的杂散电容变大且不可控反而影响起振余量甚至让频率偏移超出预期。比包地更重要的是晶振要尽量靠近XI/XO引脚走线越短越好晶振下方所有层都不要走其他信号线尤其是SDIO、SPI、I2C这类并行总线以及电源开关节点负载电容要放在晶振和芯片引脚之间而不是放在晶振外侧。简单说让晶振、电容、引脚三者形成一个尽量小的环路。还有一个常被忽略的点晶振底下不要铺完整的大面积地铜。表层铺地连接主地没什么问题但你如果把内层一整片地都摆在晶振正下方等效杂散电容会变大频率容易偏低。稳妥做法是晶振正下方的内层挖空或者至少保证没有连续参考平面。3. 细节二PHY地址配置RXER/PHYAD0那个引脚不是普通IO3.1 SMI管理总线里的寻址原理MDIO/MDC是MAC管理PHY的标准总线一个MAC可以通过这组总线管理多个PHY靠的就是PHY地址。SMI协议里MDIO传输帧包含5位PHY地址位所以理论上一条总线上最多挂32个PHY。实际硬件上每个PHY用一组引脚在复位时采样出地址。LAN8720对外只引出了两位可配置的PHY地址引脚RXER/PHYAD0和LED1/PHYAD1。这两个引脚在芯片复位释放瞬间被采样作为PHYAD0和PHYAD1的值采样完成后就恢复成RX_ER和LED1功能。所以不能把它们当成纯粹的地址配置引脚去理解它们是复用脚。这里有个取舍因为只有2位可配LAN8720在一条MDIO总线上最多只能挂4个剩下的高位PHY地址是芯片内部固定的。好在绝大多数单网口产品根本用不到那么多记住这一点就够。3.2 上下拉配置怎么接和固件怎么保持一致PHY地址的配置方式就是在RXER/PHYAD0和LED1/PHYAD1上外接上拉或下拉电阻。设计时要留意芯片内部有默认的上下拉状态所以外部电阻的选值要足够强通常用10kΩ太大会被内部拉不动太小会影响复位后的复用功能。我见过的量产设计里最常见的是把地址配成1也就是PHYAD0拉高、PHYAD1拉低。这种配置和很多驱动库默认的PHY地址一致比如STM32 HAL库例程里LAN8720的PHY_ADDRESS常写0x01省得每次都要改。如果你的板子上下拉组合不一样像PHYAD00、PHYAD11得到地址2那固件里的地址宏记得同步改掉否则芯片明明活着MDIO就是读不到数据。配好之后建议在硬件流程里做一次验证上电后用示波器或者逻辑分析仪抓MDIO帧看首帧里的PHY地址是不是你配置的值。我踩过最深的坑就是原理图里PHYAD0画了下拉但BOM贴的电阻位置反了软硬件工程师各查了半天最后发现是料贴错位。3.3 多PHY共享MDIO总线的注意事项如果你做的是双网口或者四网口产品多个LAN8720挂在同一条MDIO上每个PHY的地址必须唯一。要注意LAN8720只有2个地址引脚最多4个地址可用再往上就得换带更多地址引脚的PHY比如DP83848的PHYAD[4:0]引脚就比较全。MDIO总线上有多个PHY时MDIO数据线本身是开漏结构需要加一个4.7kΩ到10kΩ的上拉电阻到VDDIO。MDC一般由MAC推挽驱动不需要上拉。如果板子上MDIO/MDC走线比较长或者跨了连接器建议在远端再加一个终端电阻并适当降低MDC频率从默认的2.5MHz降到1MHz左右能解决很多莫名其妙的读写出错。4. 细节三供电与去耦3.3V单电源也要认真对待4.1 别小看VDD、VDDIO、VDDCR三个电源域LAN8720正常工作时主要是3.3V单电源供电数据手册里也强调支持单3.3V供电操作。但芯片内部有不止一个电源域VDD是主3.3V电源VDDIO是I/O接口电源一般也接3.3VVDDCR是内部1.2V核心电源域。很多人第一次看到VDDCR就不知道怎么接害怕要额外加一个LDO。实际上LAN8720内部有稳压结构正常使用单3.3V供电即可外部只需要给VDDCR接好足够容量的去耦电容不需要再单独供1.2V。我不建议为了“看起来更干净”去外挂一个1.2V LDO多一路电源就多一路噪声和布局复杂度单3.3V方案成熟得多。不过VDDCR的去耦电容别省。我习惯在VDDCR引脚旁边放一颗10μF陶瓷电容再加一颗100nF高频去耦两组电容尽可能靠近引脚VDD和VDDIO的各电源引脚也要就近放100nF。这里的关键是电容到引脚的走线要短回去的过孔要就近打不要让电容和芯片之间隔着一长段走线再串过孔那样高频噪声滤不干净PHY长期运行会偶发丢包。4.2 磁珠和电源平面怎么处理如果3.3V是从板上的DCDC开关电源来的纹波往往在30~100mV之间直接给PHY供电风险不小。比较稳妥的做法是给LAN8720的3.3V增加一级LC滤波磁珠选100MHz阻抗600Ω左右、额定电流够用的型号后级再放一颗10μF钽电容或陶瓷电容。模拟和数字电源到底要不要分开我的看法是LAN8720的引脚不算复杂VDD和VDDIO分开走线到滤波电容后再汇合回公共3.3V即可不必像ADC那样搞模拟电源分割。但要注意布局上别让PHY的I/O信号TXD、RXD、MDIO这些从电源滤波电容上方跨过减少数字开关噪声耦合进电源回路。4.3 上电时序与电源稳定时间LAN8720对电源上电顺序没有特别苛刻的要求但至少要保证3.3V稳定后再释放复位。很多主控板上有多个电压轨如果3.3V起来得晚而复位被主控提前拉高PHY会在一段供电不稳的状态下初始化后面出现什么奇怪现象都别太意外。我在原理图里习惯把PHY的复位引脚交给主控GPIO控制目的就是可以在软件里等电源稳定后再释放复位。上电流程一般是主控供电完成、PHY的3.3V到达、保持nRST低电平至少10μs、拉高释放复位、等待一段时间我习惯等10ms以上再去访问MDIO寄存器。顺序对了后面很多“偶发连不上网”的问题根本不会出现。5. 细节四复位电路与上电时序一乱全乱5.1 nRST引脚要求与RC复位计算LAN8720的复位脚是低电平有效复位释放时芯片会采样各种strap引脚包括PHY地址、时钟源选择等所以复位沿的干净程度会影响整颗芯片的初始状态。最简单的复位电路就是一颗10kΩ上拉电阻到3.3V加一颗0.1μF电容到地组成RC延时复位。上电瞬间电容电压为0nRST被拉低随着电容充电电压慢慢上升最终到达高电平释放复位。RC时间常数约等于1ms。如果主控没有多余GPIO控制复位这种RC电路够用但要留意复位释放沿偏缓如果板子所处环境电磁干扰大偶尔会出现复位不彻底的情况。真要在严苛环境用RC复位我建议把C加大到1μFR保持10kΩ同时让3.3V电源稳定后再上电。5.2 用GPIO控制复位给软硬件留条后路条件允许的话我强烈建议用主控GPIO直接控制PHY的nRST而不是简单RC上电复位。好处很明显软件可以在初始化流程里自主控制复位时机PHY万一进入异常状态驱动里可以拉低复位脚让PHY彻底重启比只写PHY寄存器软复位可靠得多。GPIO控制时要注意电平匹配。如果主控GPIO是3.3V推挽输出直接接nRST没问题如果是开漏输出记得外部加上拉电阻。复位引脚不要悬空悬空等于让PHY的复位状态完全不可控。5.3 常见复位相关坑复位时序不对导致的PHY假死有一种很典型的故障PHY的Link灯亮着但MDIO读寄存器全是0xFFFF或者超时ping也完全不通复位一下又好了。这种多半是上电时序问题——主控先跑起来了PHY还没完成初始化或者复位释放时电源和时钟还没稳定导致strap脚采到的电平不对。解决方法是把“复位释放”放在最晚。比如主控代码里先把nRST拉低延时100ms等电源稳定再拉高释放复位然后等待PHY内部自检完成。LAN8720数据手册里会有复位释放到可以访问寄存器的典型时间工程上往大了取就行几百毫秒甚至1秒都不会影响体验。宁可慢一点不要赌时序。6. 细节五网络变压器与RJ45接口中心抽头别乱接差分线别乱走6.1 集成RJ45还是分离式变压器带网口的硬件设计都要过网络变压器这一关。变压器的作用是隔离共模电压、抑制EMI并把PHY侧的差分信号耦合到网线上。选型上有两种常见路线集成变压器的RJ45插座比如HR911105A这类和分离式网络变压器RJ45座。集成式方案省面积、器件少画板子也简单适合产品定型后走量分离式方案调试方便变压器、RJ45座、电阻电容可以分别换适合前期验证和双网口多网口设计。我个人的习惯是第一版验证板用分离式出了问题好换件测试稳定后如果空间紧张再换成集成式电路基本不用大改。变压器型号本身要注意隔离电压等级、插损、回损这些参数。普通商用交换机环境隔离电压1.5kV的够用如果是工业现场或有雷击浪涌要求选更高耐压的型号并在RJ45侧加TVS管。6.2 中心抽头接法最容易抄错的地方网络变压器内部有中心抽头分PHY侧初级和RJ45侧次级。RJ45侧的中心抽头通常要做Bob Smith端接两个75Ω电阻串联中间点通过一颗高压电容0.1μF/2kV接地。这套端接网络的作用是给网线上的共模噪声提供泄放路径不接的话EMI会明显变差长网线时误码率也会升高。PHY侧中心抽头怎么接就要看PHY芯片数据手册了。这也是很多抄原理图翻车的地方——不同厂商PHY的驱动器类型不一样有的要求中心抽头接AVDD提供一个共模工作点有的要求通过电容到地还有的干脆悬空。我遇到过一版设计把LAN8720的变压器初级中心抽头直接照着另一款PHY的接法怼到了3.3V结果上电Link正常一跑流量就断Debug了很久才发现是中心抽头给错了偏置。所以这里给一个最稳妥的操作思路拿到PHY手册和变压器/模块的手册先找到各自的典型应用电路把中心抽头、电阻、电容对照着一一复制不要凭记忆跨型号套用。如果两块板子PHY不同即使网口长一样变压器周围电路也可能不同。6.3 差分走线与阻抗匹配要点RJ45和PHY之间的差分对TX/TX-、RX/RX-布线需要按100Ω差模阻抗控制。层叠确定后用阻抗计算工具Saturn PCB、Polar Si9000都可以算一下线宽和间距。通常4层板上表层微带线参考内层地平面线宽5~6mil、间距8~10mil就能大概落在100Ω附近但具体以你的层叠参数为准。布差分对时同组两根线要成对走间距保持一致尽量少打孔如果必须换层过孔旁边加地孔回流两组差分对之间拉开间距至少留2~3倍线宽的距离防止串扰。还有一个容易被忽略的点差分走线不能跨过电源/地平面的分割线否则回流路径断裂共模辐射和误码率都会上来。另外网络变压器周围的地线要处理好。RJ45外壳的地和PHY的GND之间虽然通常有隔离电容连接但不要搞成一大片铜皮直接把两边糊在一起。隔离带处理得好不好直接决定了这板子EMI测试好不好过。7. 实战问题排查与速查表7.1 典型症状与排查思路硬件设计的问题现象往往就那么几类。我把平时帮人查板子的经验整理成一个速查表按出现频率排好遇到问题先对照这张表能省很多时间。症状可能原因检查手段上电后Link灯完全不亮晶振没起振、PHY地址配置不对、复位时序不对、变压器接反/虚焊示波器测XI波形确认上下拉读PHY ID寄存器能Link但ping丢包严重差分走线阻抗不连续、晶振频偏大、3.3V纹波大、REF_CLK抖动看眼图/示波器测时钟抖动量电源纹波检查差分对等长协商不到100M只有10M100M差分对质量太差、变压器型号不支持、RMII参考时钟源配置不对读PHY协商结果寄存器检查参考时钟路径MDIO读寄存器时好时坏MDIO上拉缺失、走线过长、PHY地址和代码不一致、MDC频率太高示波器抓MDIO波形降MDC频率核对地址能跑但运行几个小时后断网电源稳定性差、PHY过热、晶振接触不良、复位被干扰持续监控电源和PHY温度重新加热/补焊晶振7.2 调试工具与实测经验硬件调试时最常用的工具是示波器和逻辑分析仪。100MHz带宽的示波器能看晶振起振和时钟毛刺但看RMII这种50MHz数字信号有点勉强有200MHz以上带宽更好。逻辑分析仪抓MDIO/MDC特别方便便宜的二三十块钱的8通道24MHz逻辑分析仪就够用能直接看到地址帧判断PHY地址和读写操作是否正常。另外一个很实用的方法是上电后先不要跑协议栈单纯用寄存器读写工具STM32可以写一个小函数读LAN8720的PHY ID寄存器地址2和3能读到0x0007、0x0200这类值基本可以确认晶振、复位、供电、MDC/MDIO通路都是通的。读不到就按前面那张表逐项查。7.3 一点实操习惯供你参考我个人在画带LAN8720的板子时有几个固定习惯原理图阶段会把strap引脚、复位时序、变压器中心抽头三块单独标红评审时重点过这三个地方PCB阶段先布差分对再布晶振区域最后才走其他控制信号打样回来不上电前先拿万用表量所有电源对地阻抗是否正常再量晶振两个引脚对地的电容值和设计值对比一下。这些动作看着笨但真能拦下不少低级错误。LAN8720不是新芯片网上资料和参考设计多得看不完但正因为多抄错的风险也大。希望这篇能帮你把最关键的五个细节一次理清少走几步弯路。等你的板子一次点亮欢迎回来说一声。
返回列表