ARTICLE DETAIL

资讯详情

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

DP83848以太网PHY硬件设计与驱动调试实战指南

DP83848以太网PHY硬件设计与驱动调试实战指南 1. 项目缘起与整体设计思路第一次接触DP83848是在一个工业数据采集网关的项目上。当时主控用的是STM32F407需要把现场采集到的多路传感器数据通过有线网络上传到后台服务器。选型阶段对比过几款常见的以太网PHY芯片最终敲定DP83848原因很直接工业级温度范围、10/100Mbps自适应、MII/RMII双接口、低功耗而且外围电路相对干净不需要太多额外器件。这颗芯片在工业控制和嵌入式网络设备里出镜率极高资料也相对齐全踩坑成本可控。DP83848本质上是一颗物理层收发器它负责把MAC层送过来的数字信号转换成差分信号发到网线上同时把网线上的差分信号还原成数字信号交给MAC。你可以把它理解成一个翻译官MAC说的是数字语言网线传的是模拟差分信号PHY就是中间那个既懂数字又懂模拟的角色。它不处理TCP/IP协议栈也不管数据包的地址和路由那些是MAC和上层协议的事。所以硬件设计时PHY和MAC之间的接口时序、时钟同步、电源质量才是重点。这个项目的整体设计思路可以拆成三块硬件电路设计、驱动层配置、联调与问题排查。硬件部分要搞定电源、时钟、复位、MII/RMII接口连接、网络变压器和RJ45接口驱动部分要配置PHY的寄存器包括自协商、速率双工模式、LED指示等调试部分则涉及回环测试、ping测试、抓包分析、信号质量测量等。三块内容环环相扣硬件没做好驱动再牛也跑不通驱动配错了硬件正常也连不上。适合阅读这篇内容的人应该是有一定嵌入式基础、正在做或准备做以太网相关硬件设计的工程师或者是在调试网络通信时遇到问题的开发者。如果你连MII和RMII的区别都还不清楚建议先补一下以太网基础再来看这篇会更顺畅。下面我会按照实际项目的推进顺序把每个环节的关键细节和踩过的坑都摊开来讲。2. DP83848硬件设计核心细节2.1 电源与去耦设计的关键考量DP83848的电源设计看起来简单实际上很容易出问题。它需要3.3V单电源供电但内部其实有多个电源域模拟电源、数字电源、IO电源。虽然芯片只有一个VDD引脚组但去耦电容的布置直接影响到PHY的模拟信号质量。我在第一版设计时犯过一个典型错误去耦电容离芯片太远而且用了普通的0805封装电容。结果板子回来之后链路能建立但丢包率很高用示波器看电源纹波在100MHz附近有明显的噪声尖峰。后来把去耦电容换成0402封装尽量靠近VDD引脚放置每个电源引脚配一个0.1uF电容再在电源入口处加一个10uF的钽电容纹波立刻降下来了。具体做法是这样的VDD引脚旁边放0.1uF的X7R陶瓷电容距离不超过2mm电源入口处放10uF钽电容和1uF陶瓷电容并联模拟电源和数字电源之间用磁珠隔离磁珠选100MHz时阻抗在60欧姆左右的。地平面要完整不要被信号线割裂特别是模拟地部分。注意DP83848的散热焊盘必须接地而且要通过多个过孔连接到地平面这不仅是为了散热也是为了提供低阻抗的接地回路。2.2 时钟电路25MHz晶振还是外部时钟DP83848需要一个25MHz的参考时钟。有两种方案一是外接25MHz无源晶振二是由MAC或外部时钟源提供25MHz时钟。我两个方案都用过各有适用场景。外接晶振的方案最省事电路也简单一个25MHz晶振加两个负载电容就行。但晶振的精度和温漂要注意工业级应用建议选±30ppm以内的。负载电容的取值要根据晶振规格书来一般是12pF到20pF之间。我遇到过晶振不起振的情况排查下来是负载电容选大了换成15pF就正常了。外部时钟方案适合多PHY同步的场景比如交换机设备上多个PHY需要共用一个时钟源。这时候DP83848的XI引脚接外部25MHz时钟XO引脚悬空。好处是省了晶振坏处是时钟走线要特别注意长走线容易引入抖动。实测下来单PHY应用用晶振就够了多PHY或者对时钟同步要求高的场景再考虑外部时钟。晶振布局要尽量靠近XI和XO引脚走线短而直下方不要走其他信号线避免耦合干扰。2.3 MII与RMII接口的选型与连接DP83848支持MII和RMII两种MAC接口。MII需要16根信号线RMII只需要9根。选哪个取决于你的MAC支持哪种接口以及引脚资源是否紧张。MII接口的优点是时序裕量大25MHz时钟下数据稳定适合长走线或干扰较大的环境。缺点是引脚多PCB布线麻烦。RMII接口用50MHz时钟引脚少布线简单但对时钟质量要求更高走线长度要控制得更严格。我那个STM32F407项目用的是RMII接口因为STM32F407的ETH外设支持RMII而且引脚资源紧张。RMII的50MHz时钟由STM32提供从PA1引脚输出到DP83848的X1引脚。这里有个坑STM32的RMII时钟输出需要配置为推挽输出而且要走线等长否则PHY端采样可能出错。MII/RMII的配置通过DP83848的引脚电平决定具体是哪个引脚我记不太清了查数据手册的Strap Options章节就能找到。上电时这些引脚的电平会被锁存所以上下拉电阻要在上电前就确定好。2.4 网络变压器与RJ45接口设计网络变压器的作用是隔离和阻抗匹配。DP83848的差分输出不能直接接RJ45中间必须加变压器。变压器选型要注意几个参数匝数比一般是1:1电感量在350uH左右插入损耗要小。我用的是一款常见的工业级变压器集成在RJ45连接器里面这样省了单独布变压器的空间。RJ45连接器要选带屏蔽的金属外壳接到机壳地和信号地之间用高压电容隔离。差分走线要等长误差控制在5mil以内差分阻抗100欧姆。走线尽量短不要有过孔如果必须过孔两个差分线要一起过。变压器到RJ45之间的走线也要按差分规则处理不要因为距离短就随便走。提示RJ45的LED指示灯引脚可以接到DP83848的LED引脚上通过寄存器配置LED的闪烁模式能直观看到链路状态和收发活动。2.5 复位电路与Strap引脚配置DP83848的复位引脚是低电平有效复位脉冲宽度至少要1us。我一般用RC复位电路10k电阻上拉到3.3V100nF电容到地时间常数1ms足够满足要求。如果系统有其他复位源可以把PHY复位和其他外设复位连在一起统一控制。Strap引脚在上电复位时被采样决定PHY的工作模式。常见的配置包括PHY地址、MII/RMII模式、自协商使能、LED模式等。这些引脚在电路设计时就要确定好上下拉不要想着后面用软件改因为Strap只在复位时生效。我建议把Strap引脚的上下拉电阻都预留出来用0欧姆电阻或者跳线帽这样调试阶段可以灵活调整。量产时再根据最终配置确定焊接方案。3. 驱动层配置与寄存器操作3.1 PHY寄存器基础与访问方式DP83848的寄存器分两类标准寄存器和扩展寄存器。标准寄存器是IEEE 802.3定义的地址0到15包括BMCR、BMSR、PHYIDR1、PHYIDR2等。扩展寄存器地址16到31是厂商自定义的用来配置LED、中断、功耗等。访问PHY寄存器通过MDIO接口MAC端发起读写操作。MDIO是两线接口MDC是时钟MDIO是数据。时钟频率最高2.5MHz一般用2.5MHz或者更低。STM32的ETH外设自带MDIO控制器配置好时钟分频就行。读寄存器的流程是MAC发读命令包含PHY地址和寄存器地址然后PHY返回16位数据。写寄存器类似MAC发写命令和数据。PHY地址由Strap引脚决定默认是0x01如果总线上有多个PHY每个PHY的地址要不同。// STM32 HAL库读取PHY寄存器的示例 uint16_t PHY_ReadReg(uint16_t PHYAddress, uint16_t RegAddress) { uint32_t timeout 0; uint16_t data 0; HAL_ETH_WritePHYRegister(heth, PHYAddress, RegAddress, 0); // 等待操作完成 while (HAL_ETH_ReadPHYRegister(heth, PHYAddress, RegAddress, data) ! HAL_OK) { if (timeout 10000) return 0xFFFF; } return data; }3.2 自协商配置与速率双工设置自协商是PHY最基本的功能通过交换能力信息双方自动协商出最优的速率和双工模式。DP83848的BMCR寄存器地址0x00的bit12是自协商使能位bit8是双工模式bit13是速率选择。自协商的流程是PHY上电后发送FLP脉冲里面包含了自身支持的能力对端收到后回应自己的能力双方根据共同支持的最高能力确定工作模式。如果对端不支持自协商PHY会进入并行检测模式根据对端信号判断速率和双工。我遇到过自协商失败的情况表现为链路能建立但速率只有10Mbps或者双工模式不匹配导致大量冲突。排查下来是变压器中心抽头的电容选大了影响了FLP脉冲的波形。换成1nF电容后自协商正常。如果应用场景固定比如只跑100Mbps全双工可以关闭自协商强制设置速率和双工。这样链路建立更快但要求对端也强制设置相同的模式否则会出问题。3.3 LED指示灯配置与状态监控DP83848的LED引脚可以配置成多种模式通过扩展寄存器0x19LEDCR来设置。常见的配置有链路状态、收发活动、速率指示、双工指示等。我一般把LED0配成链路活动LED1配成速率指示。链路建立时常亮有数据收发时闪烁100Mbps时LED1亮10Mbps时灭。这样一眼就能看出当前的工作状态。配置LED的寄存器是0x19bit0到bit3控制LED0bit4到bit7控制LED1。具体编码查数据手册的LED配置表。配置完之后要软复位PHY或者重新自协商才能生效。注意LED引脚是开漏输出需要外接上拉电阻一般用330欧姆到1k欧姆。限流电阻根据LED的亮度要求选我用的是470欧姆亮度适中。3.4 中断配置与错误处理DP83848支持中断输出可以配置成链路状态变化、自协商完成、错误检测等事件触发。中断引脚是开漏输出需要上拉到3.3V。中断相关的寄存器有MISR地址0x12是中断状态寄存器MISR的bit0是链路状态变化bit1是自协商完成bit2是远端错误bit3是链路断开等。使能中断要配置MISR的对应位然后读MISR清除中断标志。我在实际项目里用中断来检测链路插拔这样不用轮询BMSR寄存器节省CPU资源。中断服务程序里读MISR判断事件类型然后做相应处理。注意读MISR会清除中断标志所以一次要把所有标志都读出来。错误处理方面DP83848的扩展寄存器0x15RXERCR可以配置接收错误计数0x16FCSCR是假载波计数0x17RECR是接收错误计数。这些计数器可以用来评估链路质量如果错误计数增长很快说明信号质量有问题。4. 联调实操与问题排查实录4.1 硬件回环测试第一步验证板子焊好之后不要急着接网线。先做硬件回环测试验证PHY的发送和接收通道是否正常。DP83848支持内部回环和外部回环两种模式。内部回环是PHY内部把发送数据直接环回到接收通道不经过网线和变压器。配置BMCR寄存器的bit14Loopback为1PHY进入内部回环模式。然后MAC发送数据看能不能收到相同的数据。如果能收到说明PHY的数字部分和MAC接口是正常的。外部回环需要把RJ45的发送差分对和接收差分对短接或者用专用的回环插头。配置PHY进入外部回环模式数据经过发送驱动、变压器、回环插头、接收通道整个模拟链路都验证到了。我一般先做内部回环再做外部回环。内部回环过了但外部回环没过问题就在变压器或RJ45部分。两个都过了基本可以确定硬件没问题。4.2 Ping测试与网络连通性验证回环测试通过后接上网线配置MAC的IP地址开始ping测试。这是最直观的验证方法。第一步是看链路是否建立。读BMSR寄存器的bit2Link Status如果是1说明链路已建立。如果一直是0检查网线、对端设备、变压器、RJ45焊接。链路建立后看自协商结果。读BMSR的bit3Auto-Negotiation Ability和bit5Auto-Negotiation Complete确认自协商完成。然后读扩展寄存器0x10PHYSTS的bit2和bit3看当前速率和双工模式。Ping测试时如果丢包严重先看PHY的错误计数器。RECR和FCSCR增长快说明信号质量差检查差分走线、变压器、端接电阻。如果完全ping不通检查MAC的发送和接收配置确认MAC和PHY的接口模式匹配。4.3 常见问题速查表现象可能原因排查方法解决方案链路无法建立变压器焊接不良测量变压器引脚通断重新焊接或更换变压器链路建立但丢包严重差分走线不等长测量差分对长度差重新布线或加补偿自协商失败晶振频偏过大测量晶振频率更换晶振或调整负载电容速率只有10Mbps变压器中心抽头电容过大检查中心抽头电容换成1nF电容双工模式不匹配对端强制设置读PHYSTS寄存器统一自协商或强制设置LED不亮上拉电阻缺失测量LED引脚电压加上拉电阻中断不触发中断未使能读MISR寄存器配置MISR使能位寄存器读写失败MDIO时钟太快测量MDC频率降低MDIO时钟分频4.4 信号质量测量与眼图分析如果ping测试有丢包但错误计数器增长不快可能是信号质量处于临界状态。这时候需要用示波器看差分信号的眼图。测量点在变压器靠近PHY的一侧用差分探头测量发送差分对。正常的100Mbps信号眼图应该张开清晰幅度在1V左右。如果眼图闭合或者抖动大检查电源纹波、时钟抖动、差分走线阻抗。我遇到过眼图张开但误码率偏高的情况排查下来是电源噪声耦合到了PHY的模拟电源。在模拟电源引脚旁边加了一个1uF的陶瓷电容问题解决。提示眼图测量需要高带宽示波器至少500MHz以上。如果没有差分探头可以用两个单端探头分别测差分对的两根线然后数学运算相减但效果不如差分探头。4.5 实操心得与避坑经验第一个坑是Strap引脚配置错误。我第一版把PHY地址设成了0x00结果MAC端一直读不到PHY。后来查数据手册发现0x00是广播地址不能用作单个PHY的地址。改成0x01后正常。第二个坑是复位时间不够。DP83848的复位脉冲要求至少1us我一开始用RC复位电容选了10nF时间常数只有100us理论上够但实际因为电源上升时间的影响复位释放时电源还没稳定。后来把电容换成100nF问题解决。第三个坑是MDIO总线的上拉电阻。MDIO是开漏输出需要上拉电阻我一开始忘了加结果寄存器读写时好时坏。加上2.2k上拉电阻后稳定了。第四个坑是RMII时钟走线。STM32的RMII时钟输出到PHY的走线我走了个直角结果50MHz时钟上出现了振铃。改成圆弧走线后振铃消失。高频信号走线一定要避免直角和锐角。第五个坑是变压器中心抽头的电容。我一开始用了0.1uF结果自协商经常失败。查资料发现中心抽头电容太大会影响FLP脉冲换成1nF后自协商稳定了。这些坑都是实际调试中踩出来的数据手册上不会写这么细。希望看到这篇内容的人能少走弯路。5. 进阶优化与扩展思路5.1 低功耗模式配置DP83848支持多种低功耗模式包括睡眠模式、断电模式、节能模式。通过扩展寄存器0x17PWRDN和0x18PHYCR来配置。睡眠模式下PHY关闭大部分电路只保留链路检测功能功耗降到几毫安。当检测到链路活动时自动唤醒。配置方法是设置PHYCR的bit11Sleep Mode为1。断电模式功耗最低但需要外部唤醒。配置PWRDN寄存器的bit0为1PHY进入断电模式。唤醒需要重新复位或者写寄存器。节能模式是根据网线长度自动调整发送功率通过扩展寄存器0x19的bit8Energy Detect来配置。这个功能在短网线场景下能省不少电。我在一个电池供电的项目里用了睡眠模式PHY平时休眠有数据时唤醒平均功耗降到了10mA以下。5.2 线缆诊断与故障定位DP83848支持TDR时域反射线缆诊断可以检测网线的开路、短路、阻抗异常。通过扩展寄存器0x1CTDRCR和0x1DTDRAR来配置和读取结果。TDR的原理是发送一个脉冲然后测量反射回来的时间和幅度。根据反射时间可以算出故障点距离根据反射幅度可以判断故障类型。开路反射是正幅度短路反射是负幅度。配置TDR的流程是设置TDRCR的bit15为1启动诊断等待诊断完成读TDRAR获取结果。诊断结果包括故障距离和故障类型。这个功能在工业现场很有用网线埋在墙里或者走线槽里出问题了不好排查。用TDR先定位故障点再去处理省时省力。5.3 多PHY管理与地址分配一个系统里如果有多个网口就需要多个PHY。每个PHY的地址要不同通过Strap引脚配置。DP83848支持5位地址最多32个PHY挂在同一条MDIO总线上。地址分配的原则是不要用0x00广播地址不要用0x1F保留地址其他地址都可以用。我一般从0x01开始顺序分配。多PHY管理时MDIO总线的负载要注意。每个PHY的MDIO引脚都有输入电容PHY多了总线电容就大上升沿变缓。上拉电阻要适当减小或者用MDIO缓冲器。软件上要维护一个PHY地址表每个网口对应一个PHY地址。初始化时逐个配置运行时根据网口索引访问对应的PHY。5.4 与不同MAC的适配经验DP83848和不同MAC配合时需要注意接口时序和时钟配置。我用过STM32的ETH、FPGA的MAC、以及专用MAC芯片各有各的注意事项。STM32的ETH外设配置RMII时时钟要配置成50MHz输出而且要在ETH初始化之前配置好。FPGA的MAC需要自己写MDIO控制器时序要严格按照数据手册来。专用MAC芯片一般有现成的驱动配置好接口模式就行。接口模式不匹配是最常见的问题。MII和RMII的引脚定义不同配置错了要么不通要么丢包。上电前一定要确认Strap引脚的电平确保接口模式正确。注意DP83848的RMII模式需要50MHz时钟这个时钟可以由MAC提供也可以由外部晶振提供。如果由MAC提供要确保MAC的时钟输出使能而且频率准确。5.5 工业环境下的可靠性设计工业环境的电磁干扰大温度范围宽对PHY的可靠性要求高。除了前面提到的电源和走线设计还有几个地方要注意。一是ESD保护。RJ45接口要加ESD保护器件防止静电打坏PHY。我用的是TVS二极管阵列响应时间快钳位电压低。二是隔离设计。网络变压器本身提供了隔离但如果是户外应用还需要加气体放电管或者隔离电源防止雷击。三是温度补偿。DP83848是工业级芯片温度范围-40到85度但晶振和变压器的温度特性也要考虑。晶振选温补晶振变压器选宽温型号。四是看门狗。PHY本身没有看门狗但可以在软件里加链路状态监控链路断了自动复位PHY防止死锁。这些措施在实验室里看不出效果但在工业现场能显著提高可靠性。我有个项目在变电站里跑了三年没出过网络问题靠的就是这些细节。
返回列表