ARTICLE DETAIL

资讯详情

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

STM32F4+LAN8720百兆以太网设计:RMII引脚、时钟与PCB布局实战指南

STM32F4+LAN8720百兆以太网设计:RMII引脚、时钟与PCB布局实战指南 做嵌入式联网项目STM32F4和LAN8720这对组合大概是出场率最高的百兆以太网方案了MCU自带MAC外挂一颗LAN8720A当PHY成本低、资料多很多人照着开发板原理图十几分钟就能把线连出来。但“连出来”和“能跑稳”之间隔着RMII信号完整性和几个隐藏极深的引脚配置坑。有人REF_CLK无波形有人PHY地址读不对有人大流量压测跑几分钟就断流还有人上电后LAN8720发烫但完全没反应。这篇文章把我画板、调板过程中踩过的坑和验证过的做法整理出来从原理图引脚级细节讲到PCB布局和调试手段适合正在设计或调试F4LAN8720方案的硬件工程师参考。1. 动手设计前先把RMII接口吃透1.1 RMII到底省了什么又带来了什么约束RMIIReduced Media Independent Interface就是精简版MII。MII需要16根信号线RMII把数据线砍到2根整体只需要7根数字信号TXD0、TXD1、TX_EN、RXD0、RXD1、CRS_DV再加一根50MHz的REF_CLK。另外管理接口MDC/MDIO是MDIO总线标配两边各占一根。STM32F4的MAC外设支持RMII模式所以不需要额外的MAC芯片成本一下就打下来了。很多人不理解为什么百兆以太网需要50MHz而不是25MHz参考时钟。RMII是2bit并行传输TXD0/TXD1两个信号在50MHz时钟下并行发送2bit x 50MHz刚好等于100Mbps带宽拼得严丝合缝。10Mbps模式下时钟仍然是50MHz只是数据被重复采样/稀疏化处理了物理接口时钟始终不变。这个设计带来的最大约束就是所有RMII信号都跟REF_CLK同步。PHY输出的参考时钟是MAC侧的“心跳”MAC发出的TX数据要在REF_CLK的上升沿被PHY采样PHY发出的RX数据要在REF_CLK上升沿被MAC采样。如果REF_CLK质量差、占空比不合格或者数据线与时钟线之间的走线长度差太大导致建立/保持时间不够就会出现“偶尔丢包、大流量死机、换根网线就变好”这类诡异问题。这也是信号完整性在RMII里比MII更敏感的原因。1.2 STM32F4与LAN8720的RMII引脚映射以STM32F407为例RMII模式下的引脚分配是固定的AltFunction全部是AF11。画原理图第一步应该是把这几个引脚对应清楚很多人后面调不通回头看原理图发现一根线接错了白白浪费好几次打板周期。STM32F4引脚信号名方向说明PA1ETH_RMII_REF_CLK输入50MHz参考时钟由PHY提供PA2ETH_MDIO双向管理数据开漏输出需上拉PC1ETH_MDC输出管理时钟最高2.5MHzPA7ETH_RMII_CRS_DV输入Carrier Sense/Data ValidPC4ETH_RMII_RXD0输入接收数据0PC5ETH_RMII_RXD1输入接收数据1PB11ETH_RMII_TX_EN输出发送使能PB12ETH_RMII_TXD0输出发送数据0PB13ETH_RMII_TXD1输出发送数据1这里最容易犯的错有两个一是把PA1当成普通GPIO去初始化甚至配置成推挽输出这等于用MAC输出引脚直接顶PHY输出的时钟轻则波形畸变严重重则两个输出打架把IO口烧了。PA1必须配置为复用功能输入模式GPIO_MODE_AF_PP方向由外设接管。二是忽略MDIO上拉MDIO是开漏双向信号必须在外部接一个上拉电阻到VDDIO典型值是4.7kΩ。缺了这个电阻MDIO读回来全是0xFF你又得怀疑是不是PHY地址写错了。1.3 时钟方案抉择25MHz晶振方案 vs MCO输出方案LAN8720的时钟来源有两条路这是设计时就必须做的二选一也是最开始就决定成败的地方。方案ALAN8720外接25MHz晶振PHY内部PLL把25MHz倍频到50MHz然后从REF_CLK引脚输出50MHz给STM32F4的PA1。这是官方参考设计和绝大多数开发板采用的方案。晶振电路结构简单不需要软件提前配置上电后PHY自动起振MCU什么时候初始化都不影响PHY的时钟域。方案B用STM32F4的MCO1PA8输出50MHz时钟接到LAN8720的XI引脚作为外部参考时钟。能省一颗晶振和两个负载电容看似很美。但MCO1的时钟来源于系统PLL要求系统时钟必须是25MHz的整数倍关系配置错一个PLL分频系数MCO输出频率就偏了。更要命的是时序PHY在上电复位时就要有一个可用的参考时钟而MCO时钟是MCU固件跑起来之后才配置出来的。如果你在软件里没有严格安排好“先初始化MCO时钟再释放PHY复位”的顺序PHY很可能在无参考时钟的状态下完成了复位采样后续怎么弄都不link。我个人的建议非常明确量产和常规项目无脑选方案A25MHz晶振方案。原因有三第一PHY内部PLL是器件厂商针对以太网时钟专门优化的抖动和占空比有厂商兜底第二MCO方案把MCU系统时钟配置和PHY时序绑在一起任何一边改动都可能引爆另一个问题第三晶振方案调试时只要示波器能在XI/XO看到起振波形你就能排除PHY时钟问题排查链路更干净。2. 原理图设计几个隐藏很深的引脚坑2.1 nINT/REGOFF一个引脚两种命运LAN8720A的10脚是nINT/REGOFF这是整个芯片上最阴险的引脚。它同时是两个功能的复用正常工作状态是开漏中断输出nINT但在复位释放瞬间它作为strap引脚被采样决定内部1.2V稳压器是否启用。采样结果为低内部稳压器正常工作VDDCR引脚输出1.2V核心电压采样结果为高内部稳压器被禁用VDDCR引脚没有输出必须由外部电路提供1.2V。很多人在原理图里给这个引脚接了一个10kΩ上拉到3.3V理由很直接nINT是开漏输出上电后默认拉高才符合中断线的常态。结果就是复位采样瞬间REGOFF被拉成高电平内部1.2V稳压器关闭VDDCR没电压PHY整个不知声。量VDDCR引脚0V量REF_CLK没波形量晶振在振再看供电3.3V都正常。你会觉得芯片是不是坏了换一片还是这样最后怀疑到自己画板上。正确做法有两个。最简单粗暴的这个引脚不接外部上拉就让内部下拉决定REGOFF0中断功能不用也罢。LAN8720的中断对大多数嵌入式以太网应用不是必需品轮询link状态完全够用。如果你实在想用中断让nRST由MCU的GPIO控制上电先让PHY保持复位MCU启动完成后把nINT引脚配成带上拉的输入再释放PHY复位。这样复位采样瞬间nINT引脚处于高阻外部弱上拉的状态有风险最稳妥还是用另一个GPIO在复位采样期间主动拉低之后切回高阻输入。提示如果你照抄了网上某个带10k上拉的模块原理图并且板子刚好不工作第一件事就是量这个引脚的对地电压。如果是高电平直接把上拉电阻拆掉再试。这个排查步骤能救回一半“死板”。2.2 MODE引脚RMII模式必须显式拉高LAN8720A的12脚是MODE strap引脚用来选择PHY工作模式高电平选择RMII低电平/悬空选择MII。这个引脚很不起眼大部分数据手册的引脚描述里就一句话但遗忘它的后果极其严重——PHY工作在MII模式你所有RMII信号接上去全是无效的MCU和PHY根本对不上话。有的工程师是从DP83848或者其他PHY的方案迁移过来的那边可能有“某个MODE引脚要拉低”或者“悬空自适应”的习惯结果到这里照搬MODE下拉了还有的把MODE引脚当成预留IO没有处理等板子回来才想起来。排序上电后REF_CLK有50MHz晶振也正常MDIO也能读到PHY ID但是link就是建立不起来因为PHY的对外接口根本不是RMII。所以原理图设计时MODE引脚必须显式接3.3V或者通过10kΩ电阻上拉总之引脚电平要高不要想着靠内部默认值。这个引脚旁边最好加一个调试标注方便后续别人检查。2.3 RXER/PHYAD0与PHY地址默认值LAN8720A的PHY地址由strap引脚决定但完整地址不是所有位都外接引脚。LAN8720A只有PHYAD0这一个外部可配位其他高4位内部固定为0。PHYAD0引脚为低时PHY地址是0x00为高时是0x01。这个引脚和RXER功能复用就是18脚RXER/PHYAD0。数据手册上默认状态这个引脚由内部下拉拉到低也就是说LAN8720A复位后的默认PHY地址是0x00。这一点和很多其他PHY不一样比如某些PHY默认地址是0x01移植代码时如果按照旧习惯填0x01MDIO读回来全不对。硬件上要注意的是不要为了让“PHY地址更明确”而在这个脚上外接上拉电阻除非你有意把地址改成1。否则复位采样时这个引脚被拉高PHY地址变0x01而固件里还是按0x00访问同样读不到寄存器。还有一点有些设计的RXER/PHYAD0引脚被当普通IO接了LED或按键也会干扰strap采样。2.4 RBIAS、VDDCR与电源去耦组合RBIAS4脚需要接一颗12.1kΩ精度1%的电阻到地。这颗电阻决定PHY内部模拟部分的偏置电流进而影响差分信号驱动能力和接收灵敏度。有人手里正好没有12.1kΩ想着10kΩ差2%应该没事实际做出来的板子短网线能link网线到15米以上就开始丢包甚至完全不通查到最后是偏置电阻的锅。10kΩ和12.1kΩ相差超过16%发送电平幅度和共模点都变了链路余量被砍掉一大截。所以这个电阻必须是12.1kΩ1%精度尽量靠近引脚。VDDCR3脚是内部1.2V稳压器的输出设计上只需放滤波电容典型值是一个10μF钽/陶瓷电容并联一个100nF高频电容。这个引脚有一个很隐蔽的坑不要用VDDCR给外部任何负载供电。它只是PHY内部数字核心的自用电源带载能力非常有限而且外部负载的噪声会直接耦合进PHY核心电源造成芯片行为异常。我之前见过有人图省事从VDDCR引一路1.2V给邻近的传感器供电结果PHY开始频繁丢寄存器读数去掉这个负载立刻恢复。电源去耦方面VDDIO9脚放1μF100nF组合两个电容都紧靠引脚放置。QFN封装的底部还有一个大焊盘这是地焊盘开钢网时一定要让它吃到锡打板回来最好X-ray检查一下EP虚焊的板子表现就是时好时坏用手压住芯片就正常松手就掉线。2.5 晶振与负载电容怎么选怎么放25MHz晶振接在XI5脚和XO6脚之间两个负载电容分别从XI、XO对地。负载电容的取值不能乱抄要按晶振规格书里的CL计算。计算公式是[ C_L \frac{C_1 \times C_2}{C_1 C_2} C_{stray} ]如果两个电容取相同值C那C_L约等于C/2再加寄生电容。寄生电容包括引脚电容、走线电容一般估3~5pF。假设晶振规格书的C_L是18pF那么C大约要取30pF(30/2)318pF。很多模块上直接放22pF也能工作因为晶振起振有一定余量但最好不要超过33pF否则晶振负性阻抗余量不足低温下可能不起振。晶振布线时两个负载电容要尽可能地靠近XI、XO引脚以晶振为中心形成一个小回路走线不要过长下方不要铺其他信号线。晶振区域最好在底层铺地并打地孔围一圈防止它干扰周边的RMII信号线。REF_CLK本身是50MHz晶振这里是25MHz但它们都是高频弱信号经不起长走线的折腾。2.6 差分对外围与网络变压器LAN8720的PHY侧差分对TX1P/TX1N和RX1P/RX1N要经过网络变压器后接到RJ45。典型接法是PHY差分脚各串一个22Ω电阻1%精度到变压器初级变压器中心抽头通过适当阻容网络连接到电源或地具体连接方式要以你用的变压器型号对应的典型原理图为准不同厂家的变压器对中心抽头处理会有区别。这个环节我踩过的坑是电阻选型和差分对线序。串阻千万不要用碳膜电阻或者随便找的贴片22Ω看起来不起眼但它参与阻抗匹配和振铃抑制阻值偏差过大会直接影响信号质量。线序方面TX1P和RX1P虽然名字相似但必须严格按数据手册接把发送差分接到变压器的接收绕组上link灯都不会亮这类低级错误往往发生在“复制粘贴”原理图时没改网络标号。3. PCB布局与RMII信号完整性实操3.1 布局顺序MCU→PHY→变压器→RJ45PCB布局时整个以太网链路应该呈一条直线链式排列STM32F4放在板内LAN8720紧挨着MCU的RMII引脚侧网络变压器靠近LAN8720RJ45在板边。不要为了让板子看起来紧凑而把变压器放在PHY正上方或斜对角那样RMII信号线和差分线都要绕很长的路绕线的代价是信号完整性问题集中爆发。PHY到变压器之间是百兆差分线走线长度建议控制在20mm以内。变压器到RJ45之间是隔离侧差分线可以稍微长一点但也别超过30mm。RMII信号线作为数字接口从MCU到PHY的长度尽量控制在50mm以内。我见过一个极端案例因为结构限制硬把PHY放在板子背面RMII信号线换了两次层、总长超过12cm结果100Mbps带宽掉到不足30Mbps改成串阻压紧走线等长之后才恢复。3.2 RMII信号等长与串联匹配电阻RMII所有信号以REF_CLK为基准同步所以数据线和时钟线的长度差非常关键。50MHz时钟周期只有20ns看起来裕量很大但STM32F4内部IO延迟、PHY内部采样窗口、电容负载造成的边沿变缓都会吃掉一部分裕量。PCB布线上通常要求RMII信号组内等长控制在±3mm以内REF_CLK最好不比其他线长太多。严谨一点的项目可以约束到±1mm画板时用等长网络组设置一下并不费事。串联匹配电阻方面我自己的经验是每一个RMII信号脚都预留一个串联电阻位阻值22Ω左右贴不贴看调试情况。信号源端串联电阻的作用是匹配源阻抗抑制过冲和振铃。如果走线很短且干净不贴也能跑一旦走线超过5cm或者板子有较大的接口杂散电容串阻就能救回信号质量。放置原则从MAC到PHY的TXD0/TXD1/TX_EN串阻靠近MCU一侧从PHY到MAC的RXD0/RXD1/CRS_DV/REF_CLK串阻靠近PHY一侧。别放反放反了等于没串。注意REF_CLK线也要留串阻位。有人觉得时钟线不能加电阻怕边缘变缓实际上22Ω串联只会让边沿稍微圆润一点点对50MHz时钟来说完全可接受但对减少过冲帮助非常明显。3.3 电源、地与晶振的细节处理地平面是RMII信号完整性的地基。两层板也能做但要求RMII信号线下面必须有完整的地平面不得跨越地平面开槽和分割。四层板就好办得多第二层完整地RMII信号放顶层信号回路在第二层投影面积很小辐射和串扰都有明显改善。QFN底部EP焊盘建议开9个以上过孔到内地层过孔孔径不要太小0.3mm就可以。如果你画的板子使用两层板EP焊盘过孔只能打到底层底层还要保证大范围铺地否则PHY的地参考会很差表现为link指示灯亮但流量跑不上去。晶振区域按前面提到的方式处理这里再补充一点晶振的负载电容地端应该直接连接到PHY EP焊盘附近的地过孔不要绕道MCU地或者隔了一层很细的走线再接地。晶振回路小且干净是它稳定起振的前提。3.4 隔离与变压器地的分割网络变压器两侧分别属于本地地和远端地RJ45侧。设计上要把这两个地明确分开中间设置隔离带不要让本地地和远端地大面积重合。RJ45的金属外壳一般通过一个高压电容和一个大电阻连接到本地地或机壳地具体按EMC要求来但核心原则是隔离带两侧的地不要被RMII信号线跨越。还有一点经常被忽略变压器下方不要铺大片连续地很多参考设计会在变压器正下方把地平面挖空防止变压器初级和次级之间的寄生耦合把共模噪声串到PHY侧。这个细节对过EMC测试很有帮助但对纯功能调试影响不明显所以容易被省掉。4. 上电调试与问题排查实录4.1 上电检查清单板子焊好上电先别急着跑程序拿万用表和示波器按下面顺序快速过一遍很多问题能在5分钟内定位量VDDIO确认PHY的3.3V供电正常纹波不要超过100mV。量VDDCR正常应该稳定在1.2V左右。如果没有马上检查nINT/REGOFF引脚的电平这是第一优先级排查项。示波器探头点到REF_CLK测试点。能看到50MHz方波说明PHY时钟链路基本通了看不到就回头查晶振、VDDCR和MODE引脚。量一下RXER/PHYAD0引脚的电平确认是低电平PHY地址应该是0x00。如果以上都正常但还link不上用万用表蜂鸣档测一下差分对串阻和变压器绕组有没有虚焊。这套流程走完至少能排除60%以上的硬件问题。4.2 MDIO/MDC与PHY寄存器验证手段硬件通路是否正常最有效的验证是读取PHY ID寄存器。LAN8720A的PHY ID1寄存器地址2期望值是0x0007PHY ID2寄存器地址3期望值是0xC0F0。如果能读到这两个值说明MDIO时序、PHY地址和供电都正常。uint32_t id1 0, id2 0; HAL_ETH_ReadPHYRegister(heth, LAN8720_PHY_ADDR, 2, id1); HAL_ETH_ReadPHYRegister(heth, LAN8720_PHY_ADDR, 3, id2); /* 期望 id10x0007, id20xc0f0 */如果读回0xFFFF先查MDIO上拉电阻如果读回0x0000查PHY地址和nRST是否一直处于复位状态如果读数不稳定时对时不对查MDC频率和走线干扰MDC频率不要超过2.5MHz。再读一下寄存器1Basic Statusbit 2是链路状态自协商完成标志bit 5是自协商完成标志。Link灯亮但这个位是0多半是差分对线序或者变压器中心抽头接错了。4.3 常见问题速查表故障现象可能原因排查方向REF_CLK完全没有波形VDDCR无1.2VREGOFF被拉高检查nINT/REGOFF引脚电平去掉外部上拉REF_CLK无波形VDDCR正常晶振没起振量XI/XO波形查负载电容和晶振本身REF_CLK有波形但link灯不亮MODE引脚为低PHY工作在MII模式确认MODE引脚接3.3VMDIO读回0xFFFFMDIO缺上拉或PHY地址不对检查MDIO上拉电阻确认PHYAD0为低MDIO读回正常但ping不通差分对线序接反或串阻/变压器虚焊用万用表逐段量差分通路短网线能通长网线不通RBIAS电阻阻值不对确认是12.1kΩ±1%大流量跑几分钟掉线RMII信号线太长/REF_CLK质量差加串阻检查等长和地平面芯片摸起来烫手VDDCR被外部负载拖累或EP虚焊检查VDDCR外部连接和EP接地4.4 我的几个实用调试技巧调试RMII链路时不要只ping几个包就算验证通过了。我曾经有一块板子ping 100个包全过以为没问题结果跑TCP大文件传输直接卡死。后来把ping包数加到1000再配合iperf或者简单的大UDP包灌包才暴露出来。信号完整性问题的表象往往不是全断而是大流量下偶发丢包所以压力测试是必须的。示波器看波形时重点看REF_CLK相对于RXD0/RXD1的相位关系。用示波器双通道一路接REF_CLK一路接RXD0边沿对齐程度能直观反映等长控制是否到位。数据线边沿如果落在时钟边沿附近就说明等长或驱动强度有问题要么调整走线要么检查GPIO速度等级。STM32F4的RMII相关GPIO速度等级一定要配置成VERY_HIGH否则IO输出上升沿太慢PHY在时钟沿采样时会读到不确定电平。整个板子调试通过之后我习惯用一根20米以上的成品网线做一次长时间稳定性测试。百兆PHY的信号完整性余量在这类测试中会暴露得一干二净如果在长网线下依然稳定这板子基本就可以放心交给后续做EMC和可靠性测试了。
返回列表