ARTICLE DETAIL

资讯详情

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

SR8201F国产百兆PHY调试实战:从机贴失败到杜邦线救场

SR8201F国产百兆PHY调试实战:从机贴失败到杜邦线救场 SR8201F这颗国产百兆以太网PHY我是真没想到会用得这么折腾。项目因为国产化替代和成本原因要把之前进口的PHY换掉看了一圈选了SR8201F结果从PCB贴片回来就开始一路踩坑先是机贴出来link灯死活不亮再是MDIO读ID全读成0xFFFF折腾了快一周最后靠一把杜邦线飞线救了场。这篇文章就把整个过程完整复盘一下把原理图设计、机贴返修、调试工具、寄存器操作和最后的飞线排查都写清楚给正在用SR8201F或者其他百兆PHY的工程师排排雷。不管你是硬件工程师还是嵌入式软件工程师只要手里有基于STM32、瑞萨或者其他带MAC的MCU外挂PHY的项目这篇实战记录应该都能帮上忙。1. SR8201F是颗什么样的芯片除了便宜还要知道它的脾气1.1 基本参数和定位先简单交代SR8201F是什么。它是国产单路10/100M自适应以太网物理层收发器芯片支持RMII精简媒体独立接口和MII两种MAC互联模式内部集成有编解码、自适应均衡、基线漂移修正这些PHY该有的功能。典型工作电压是3.3VI/O电压独立配合RMII接口的时候MAC侧一般用3.3V电平即可。封装是QFN32引脚间距小这也为后面机贴翻车埋下伏笔。核心能力就是和带以太网MAC的MCUSTM32F407/F429、GD32、AT32这类配合完成以太网物理层收发。对外是差分对接到网口变压器和RJ45对内是RMII/MII总线和MDIO管理接口。寄存器基本遵循IEEE 802.3标准0x00是控制寄存器BMCR、0x01是状态寄存器BMSR、0x02/0x03是PHY ID、0x04/0x05是自动协商对端能力等这套寄存器体系只要是做PHY的都眼熟。另一个特点是这颗PHY广泛用于低成本以太网模块、开发板、工业控制板量走得挺大但原厂给的参考设计和勘误说明远没有国际大厂那么全。应用笔记翻来覆去就那几页很多细节比如RMII时钟到底怎么给、内部是否有时钟输出、上电时序要求都得靠实际调试去试。1.2 为什么选它成本、交期和国产化的综合权衡选SR8201F不是拍脑袋。当时进口PHY不是缺货就是价格翻倍交期动辄十几周对产品进度影响太大。SR8201F单价便宜交期稳定样品也好拿型号本身和某款常见的百兆PHY在设计上是兼容的原理图改动的成本很低。在这个前提下选了它。但要说一句大实话选国产PHY一定要把调试周期预算得比进口芯片宽松。不是说不信任国产芯片能力而是配套生态的成熟度决定了踩坑概率。进口PHY的参考设计、勘误表、论坛讨论一搜一大把国产PHY很多问题连原厂FAE都要现查。所以选了它就要有心理准备资料少、坑要靠自己填。2. 硬件设计阶段的三个雷区原理图细节不懂真会炸2.1 电源、复位和时钟缺一个都不行PHY芯片看似简单外围就那么几个件但实际上对电源和时钟的要求非常苛刻。SR8201F的模拟电源和数字电源最好都加磁珠或者至少是0欧电阻隔离每个电源引脚就近放0.1uF陶瓷电容大电容在板子电源入口处放10uF左右。我第一次画的时候偷懒数字和模拟电源直接铺铜连一起后面排查link不稳的时候就怀疑过这里。复位电路也很关键。RC复位是最常见的做法但电阻电容取值要算好确保上电后PHY的复位信号能维持足够时间。如果MCU的复位和PHY复位是连在一起的注意MCU的复位时间是否满足PHY的要求。还有个细节SR8201F复位释放以后MDIO接口大概需要一段时间才能准备好紧接着就读寄存器往往读不到正确值程序里最好加个延时再操作。时钟方面这颗PHY在RMII模式下需要外部提供50MHz的参考时钟REF_CLK。问题来了这个50MHz是谁给的可以让MCU的MCO引脚输出可以外挂50MHz有源晶振也可以看PHY是否支持25MHz晶振内部倍频。设计前务必查清楚我见过不少人是按照某款经典PHY的25MHz晶振方案画的结果芯片根本没有内部倍频根本起不来。SR8201F的参考设计里多用外部50MHz时钟但不同批次和型号后缀可能还有差异画原理图前一定要向供应商确认。2.2 RMII接口连接别把方向搞反RMII接口信号不多一共就7根左右TXD0、TXD1、TX_ENMAC到PHY方向RXD0、RXD1、CRS_DVPHY到MAC方向加上REF_CLK。看起来简单但方向接反、信号错位是高频错误。这里尤其要注意REF_CLK的接法。有的设计是MCU输出50MHz给PHY有的是PHY输出给MCU具体要看MCU的ETH模块是否支持从外部接收RMII参考时钟。以STM32F407为例RMII接口的REF_CLK是MAC模块的工作时钟它既可以由外部有源晶振直接供给也可以由MCU内部PLL输出MCO提供但如果你想让PHY来提供这个时钟得确认PHY有没有REF_CLK输出能力。设计SR8201F时我最后采用了外部有源晶振给PHY和MCU各供一路50MHz的方式一次通过。但注意这个方案需要留意时钟质量有源晶振要选低抖动的电源也要干净。还有TXD和RXD之间不要靠得太近和时钟线保持距离数据线等长做到差不多就行毕竟RMII是单端信号速率只有50Mbps不是那么娇气但也不能完全不管。2.3 PHY地址与LED引脚复用PHY地址是个特别容易被忽略的设计点。MDIO总线上可以挂多个PHY每个PHY必须有唯一地址。SR8201F的PHY地址通常通过特定的引脚上下拉来实现而且有些引脚还和LED驱动功能复用。比如你把地址引脚悬空了内部默认上拉还是下拉决定地址是0还是1必须看数据手册确认。我当时设计的地址是0x01通过一个10K电阻下拉固定。结果调试的时候MDIO总线上死活读不到这个地址后来用杜邦线把地址引脚强制拉到地再复位ID就读出来了。这个问题的坑在于你的原理图和PCB走线可能引入干扰让引脚电平不稳定地址跟着漂。还有LED灯的状态。SR8201F的link LED和activity LED引脚在刚上电未协商时会有一个表现仔细观察可以帮你判断PHY是否正常工作。比如link灯完全都不亮说明PHY可能根本没起来或者没在自动协商如果link灯会闪一下又灭说明协商有问题。这些小现象是硬件工程师排查的第一步。3. 机贴失败全过程复盘QFN封装的首板之痛3.1 现象收集link灯不亮、芯片烫手、ID读出来全是FF板子贴片回来拨码开关设置好上电。先说结果插上网线link指示灯纹丝不动用STM32读PHY ID读出来是0xFFFFFFFF再读状态寄存器也是一样。手摸PHY芯片表面微烫这倒不是说一定坏但心里已经咯噔一下。把网线拔了拿万用表量RJ45到变压器再到PHY的差分引脚之间的连通性看起来都是通的。又用示波器点PHY的时钟引脚结果根本没有波形。这时候就开始怀疑是芯片焊接问题了。QFN32封装的引脚在芯片底部从外面看不到机器贴片的时候很容易因为锡膏量不合适、贴装偏移或者钢网开孔不对造成虚焊或者连锡。3.2 一步一步排查先从电源打起遇到PHY完全不工作我的排查顺序是固定的电源-时钟-复位-MDIO通信-Link状态。这套顺序看起来简单但能帮你把问题范围快速缩小。第一步量电源。SR8201F各路供电引脚对地电压是不是3.3V用示波器看纹波有没有异常大的毛刺地引脚有没有和旁边引脚短路当时用万用表蜂鸣档测了相邻引脚果然发现有两个引脚有轻微短路倾向数值不是完全为0但阻值只有几十欧。这种问题在用QFN封装时特别常见肉眼还看不出来真是防不胜防。第二步量时钟。有源晶振通电以后输出脚应该有50MHz拿示波器一量直接没波形。晶振电源正常输出端却没信号这就比较诡异了。后来发现是晶振的输出引脚在贴片时被锡膏污染引脚被覆盖导致输出没有接触到焊盘。把晶振拆下来重焊输出就正常了。这一步让我意识到贴片回来不能直接上电得先目检一遍重点器件。第三步量复位。复位脚电压应该是高电平如果被拉低芯片永远处于复位状态什么都白搭。用示波器抓一下上电瞬间复位脚的波形确认不是一直在低。3.3 怎么修好的热风枪补焊和飞线确认是焊接问题后最简单的办法就是热风枪补焊。温度调到合适档位一般350度左右风速中等具体看板子大小和器件密度在PHY芯片周围均匀加热大概20秒左右等焊锡重新融化后用镊子轻轻压一下芯片让引脚和焊盘接触充分。温度别太高时间别太长不然旁边的小元件容易移位。补焊完以后重新上电。时钟信号有了但MDIO读ID还是全FF。这时候我开始怀疑是不是板子上的走线本身就有问题比如MDIO或者MDC走线有断线或者过孔不通。走线在内层的话万用表去量都不太方便而且一层层板子里到底哪一段断了很难在成品板上定位。当时手头又没有第二版板子重新打样周期太长。于是我想到了飞线——用杜邦线直接从MCU引脚救场。4. 调试平台搭建STM32怎么和PHY通信4.1 硬件接线和CubeMX配置要点在讲飞线之前先把调试平台怎么搭的交代清楚。主控是STM32F407自带有以太网MAC配合外部PHY使用。CubeMX配置里选择ETH以太网外设接口选RMII然后配置相应的引脚。RMII模式在STM32F407上实际用到PA1ETH_RMII_REF_CLK、PA2ETH_MDIO、PC1ETH_MDC、PB11ETH_RMII_TX_EN、PB12ETH_RMII_TXD0、PB13ETH_RMII_TXD1、PC4ETH_RMII_RXD0、PC5ETH_RMII_RXD1、PA7ETH_RMII_CRS_DV。不同型号引脚有差异以你实际用的MCU引脚定义为准。注意这几个引脚中REF_CLK如果让MCU的MCO输出CubeMX里会有两种选择一种是MCO引脚输出另一种是外部时钟直接接在PA1上。我最后用的是外部有源晶振方案PA1直接接收50MHz时钟此时MCO是被释放的用起来也简单。CubeMX里ETH外设的参数配置主要关注自动协商开还是关、目标速率要不要强制、MAC地址填什么、PHY地址填多少。这些参数都能通过软件在运行的时候改但初始化的时候至少要保证MDIO能通。4.2 MDIO/MDC时序读PHY寄存器三板斧MDIO是PHY的管理接口用两根线MDC管理时钟和MDIO管理数据。操作方式其实很像I2C但省去了地址帧里的设备选择直接发PHY地址和寄存器地址。MII管理帧的格式是前导码32个1 操作码读是10写是01 PHY地址5位 寄存器地址5位 转态2位 数据16位。自己软件模拟MDIO也不难就是把GPIO拉来拉去注意MDIO数据在MDC上升沿采样写操作时数据在MDC下降沿变化。时序要求其实很宽松100KHz左右的MDC完全没问题。当然STM32的ETH外设自带MDIO控制器直接用HAL库的HAL_ETH_ReadPHYRegister就能读方便很多。调试初期我建议除了用HAL库函数额外封一个自己写的MDIO读函数这样不受ETH初始化失败的干扰。ETH外设配置有问题的时候HAL_ETH_ReadPHYRegister可能根本执行不了自己用GPIO模拟就没有这个限制可以在最小系统上验证PHY活着没有。4.3 用串口打印寄存器调试的第一双眼睛寄存器读到了还要看得懂。我习惯在调试初期通过串口把PHY的关键寄存器打出来主要是0x00、0x01、0x02、0x03、0x04、0x05、0x06这几个。打在串口调试助手里一眼就能看出PHY状态。0x00的bit13是速度选择、bit12是自动协商使能、bit8是全双工0x01的bit5是自动协商完成、bit2是link状态0x02/0x03就是芯片ID能识别出芯片真实型号0x04是本地能力0x05是对端能力0x06是协商状态。有一次link一直起不来读0x01的bit2一直为0后来发现是0x00的bit12没置1自动协商没使能等于PHY根本不会主动去和交换机对话。软件改一行把自动协商打开link灯立刻亮了。所以串口打印寄存器这个方法一定要用起来。5. 杜邦线救场的完整过程硬件问题快速定位5.1 为什么选择飞线而不是重新打样回到前面说的情况PHY芯片补焊过了时钟也有了但MDIO读ID还是全FF。这时候我心里已经默认是PCB走线有问题但不能完全确定到底哪根线有问题。重新打样要一周多项目进度等不起。对硬件工程师来说飞线是优先于重新打样的手段它能让你绕过有问题的PCB走线快速验证核心逻辑是否正常。杜邦线飞线的本质就是用一根导线替代板上某一段不通的走线连接两个点。听起来很土但在原型验证阶段确实管用。5.2 飞线步骤确认网络、断开走线、焊接飞线不是拿杜邦线随便戳两个点就行步骤要对。先确认要飞哪几根线。MDIO读不到ID优先怀疑MDIO、MDC两根线其次是PHY的复位和时钟。拿万用表把MCU引脚到PHY引脚之间的连通性逐一量一遍确认哪一段断路。当时测量发现从STM32的PC1MDC到PHY对应引脚居然是断开的走了好几层板中途过孔没问题那就是内层走线断了。接下来的操作要慎重。如果原走线是断的但板子上还有其他元件连着飞线时可能存在信号并联的问题所以最好找到断线的两端把两端都从原来的网络上摘下来再接杜邦线。当时我把PHY侧的MDC引脚用烙铁翘起来一点和PCB焊盘脱离再把杜邦线焊在引脚上。这一步要非常小心QFN封装的引脚细小翘多了容易把引脚搞断翘少了还是和焊盘连着。另外STM32端的引脚是排针引出来的直接用杜邦线母头插上去就能用。实际操作中因为板子空间有限杜邦线不能到处乱走尤其MDIO和MDC本身是慢速管理信号飞线倒还好。但如果你怀疑RMII数据线有问题需要飞线那要特别注意线长和走向尽量短、远离干扰源。5.3 飞线后的效果ID正常、link up、ping通当我把STM32的PC1MDC用杜邦线引出来直接接到PHY的MDC引脚上重新上电运行代码串口打印出来的PHY ID瞬间正常了0x02寄存器读出了芯片ID的高16位0x03读出了低16位对应上了数据手册上的数值。那一瞬间的心情真是又欣喜又崩溃说明芯片本身、硬件整体设计、软件初始化都是没问题的问题就出在这根PCB内层走线上。接着把RMII数据线也检查了一遍最终以飞线方式把有问题的数据线也临时接好PHY自动协商成功link灯稳定亮起插上网线能ping通电脑。这时候你才真正理解为什么大家说硬件调试到最后往往是返璞归真——漂亮的PCB布线和扎实的软件架构都很好但关键时候救你的可能就是一把杜邦线和一把烙铁。6. 后续调试遇到的坑时钟、协商、稳定性6.1 RMII 50MHz时钟谁提供怎么提供时钟的问题绝不只在硬件设计阶段后续调试中也会遇到而且表现非常诡异。有段时间板子刚开始偶尔能link上几次重启以后就不行了抓波形才发现是REF_CLK频率有偏差50MHz飘到了48MHz多一点PHY自然不干活。这个现象在RMII接口里影响很大因为RMII收发数据是以REF_CLK为基准的如果时钟频率偏了等送出去的包越长误差越大最后要么link不上要么大包丢包。排查完发现是有源晶振供电脚上的滤波电容虚焊导致电源纹波偏大晶振输出频率被拉偏。把电容补焊后时钟稳定在50MHz问题消失。给个建议画板子的时候有源晶振的电源引脚是个容易翻车的地方一定要加足够容量的去耦电容而且放得离电源引脚越近越好。实测下来10uF0.1uF组合比较靠谱。6.2 自动协商不稳定怎么办强制100M全双工还有一个常见坑是自动协商时不时失败。SR8201F和交换机有时候会协商不到一致的状态拿0x01寄存器看bit5自动协商完成位始终不置1或者偶尔置1了但很快又清零。这时候可以先手动固定速率和双工模式来定位。把0x00寄存器的bit12自动协商使能清0bit13速度位设1100Mbit8双工位设1全双工强制设为100M全双工。两边都固定成相同参数看能不能正常通信。如果能说明PHY的协商逻辑或者线缆条件有问题再回头查硬件。我遇到的情况是网线长度超过40米用的是很普通的超五类线自动协商模式下协商偶尔会失败。后面把软件改成默认自动协商失败后重试一次再失败就强制100M全双工实测稳定多了。当然这只是缓解手段根治还得换更好的网线或者调整变压器参数。6.3 长时间运行丢包从电源和地找原因功能通了还不算完稳定性才是大考。有段时间板子运行几个小时就会出现ping不通的情况重启又好了。抓寄存器的时候发现0x01状态寄存器偶尔会显示link丢失但很快又恢复这种瞬断用万用表根本测不出来只能用示波器观察。后来发现问题出在电源上PHY的3.3V在数据发送高峰期有比较明显的跌落。PHY芯片内部功耗不算大但如果电源走线细、去耦电容少高速收发时就会有压降。解决办法是把电源走线加粗芯片附近补上几个100nF和1uF电容。这些改动对已经做好的板子来说不好弄但至少验证了设计方向PHY的电源设计宁滥勿缺。如果板子已经定型不能改可以在软件上做一些补偿比如降低以太网发包频率或批量大小但治标不治本。根本上还是要回到电源完整性设计上来。7. 最后的排查流程和经验清单7.1 新板子拿到手先按这个顺序跑一遍很多同事问我PHY调不通先查什么我觉得直接给一个固定的排查流程最有用不然慌起来东一榔头西一棒子。上电前目检重点看PHY、晶振、网口变压器、RJ45附近有没有连锡、虚焊、元件明显偏位不要嫌麻烦能省半天功夫。上电测电源用万用表确认各路电压正常用示波器看纹波大不大同时摸一下芯片有没有异常发烫。测时钟REF_CLK引脚有没有频率稳定的50MHz波形是否干净幅度是否满足芯片要求。测复位复位脚在上电后应该为高RC复位的充电波形是否正常。试MDIO通信用GPIO模拟或HAL库函数读0x02/0x03寄存器确认能读到正确的PHY ID这一步通了说明管理接口没问题。看Link状态插上网线观察link灯和0x01寄存器的bit2确认物理层是否协商成功。测试网络通信先用ping验证网络连通性再通过UDP/TCP工具持续收发大数据包观察稳定性和丢包率。这个流程里的每一步都是环路排查前一步没过就不要往后走否则会增加排查难度。7.2 几个常见问题和对应的解决手段现象可能原因排查和解决办法MDIO读ID全为FFPHY地址不对、MDIO/MDC走线断、PHY没供电或没复位万用表量走线GPIO模拟MDIO检查地址引脚电平复位后延时再读link灯不亮电源异常、时钟没起、变压器焊接问题、PHY不协商按电源、时钟、复位、寄存器顺序一步一步查link灯闪一下就灭自动协商失败、网线质量问题查0x01寄存器协商完成位尝试强制100M全双工能link但ping不通RMII数据线接错、MAC配置错误、地址/CRC问题核对RMII信号方向检查MAC地址和CRC配置长时间运行丢包或断线电源纹波大、时钟不稳、过热示波器看电源/时钟波形加去耦电容或更换晶振协商成功但速度总是10M对端设备能力、线缆问题、寄存器设置被覆盖读0x00寄存器确认速度位检查软件是否反复初始化PHY7.3 个人体验调试国产PHY耐心和实验精神比工具重要这块板子前前后后折腾了一周半最后定位到确实是一个PCB走线断裂问题外加前期的焊接缺陷。但如果让我重新设计我大概会做三件事来避免这些坑第一原理图阶段就把PHY地址、复位、时钟、LED这些关键引脚的使用方法逐条和数据手册对上不留模糊第二PCB打样回来以后先上电测一遍电源再焊芯片或者至少在贴片厂做飞针测试第三调试的时候一定要把MDIO寄存器读取功能做成一个标配工具不管是用串口命令还是上位机方便随时看PHY状态。杜邦线这个事说起来像是个笑话但在现场调试里它就是最实用的一把刀。不要觉得飞线丢人能快速定位问题的都是好方法。你飞完线确认了哪一段有问题再回过来改板子下一次打样就直接绕开了。最后还有个小技巧送给正在调试的朋友如果你的MDIO始终不通又怀疑是硬件问题先别急着换芯片把PHY的地址引脚轮流接高接低多试几个地址。有些PHY对地址引脚的处理并没有你想的那么直接尤其国产芯片的引脚复用情况复杂很可能你设计的地址和芯片实际识别到的不一样。反正我用这个办法又救回过一次,地址是罪魁祸首。
返回列表