ARTICLE DETAIL

资讯详情

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

DP83848工业以太网PHY设计调试全攻略:从硬件到驱动

DP83848工业以太网PHY设计调试全攻略:从硬件到驱动 以太网接口在工业设备里几乎是标配但真正把一颗PHY芯片从原理图落到能稳定跑通中间踩的坑远比想象中多。DP83848这颗芯片在工业控制和嵌入式领域被大量使用原因很直接它皮实、温度范围宽、外围电路不复杂而且驱动生态成熟。但成熟不等于随便接上就能用我见过太多板子第一版回来link灯不亮、ping不通、丢包严重最后查下来都是几个不起眼的细节没处理好。这篇内容围绕DP83848的硬件设计、驱动配置和实际调试展开把从选型到跑通的完整链路拆开讲适合正在做工业以太网硬件设计、需要把MAC和PHY对接起来的工程师参考也适合调试网口时遇到问题的朋友对照排查。1. 为什么工业场景里DP83848依然是常青树1.1 这颗芯片到底解决了什么问题做工业设备的人都有一个共识消费级网络芯片在实验室跑得好好的一到现场就出问题。温度一高、电磁环境一复杂link就断重连还慢。DP83848的定位就是解决这个痛点。它是一颗10/100Mbps自适应的以太网PHY支持MII和RMII两种MAC接口工作温度覆盖工业级范围ESD防护和抗干扰能力比普通商用PHY强不少。从功能上看PHY芯片处在OSI模型的物理层负责把MAC层送来的数字信号编码成差分信号发到网线上同时把网线收到的差分信号解码还原成数字信号。DP83848内部集成了曼彻斯特编码、4B/5B编码、扰码、自适应均衡、时钟恢复这些模块还支持自动协商、自环测试、能量检测。换句话说MAC只管发数据帧剩下的电气层事情全交给它。我选它的核心原因有三个第一RMII接口只需要两根线传数据TXD和RXD各两根比MII省引脚对引脚紧张的MCU很友好第二它支持25MHz或50MHz时钟输入配合RMII时用50MHz外部晶振直接供时钟省掉一个时钟源第三寄存器手册写得清楚调试时能通过MDIO读状态寄存器快速定位问题不像某些PHY芯片寄存器定义含糊。1.2 和同类PHY相比它的取舍在哪市面上常见的工业PHY还有LAN8720、KSZ8081、RTL8201这几类。LAN8720便宜、体积小但它的RMII时钟输出需要MCU提供50MHz参考时钟对时钟质量要求高而且温度等级和抗干扰不如DP83848。KSZ8081功能类似但寄存器操作习惯不同。RTL8201在消费类产品里用得多工业级版本价格上去了。DP83848的取舍很明确它引脚多、封装大LQFP48PCB占板面积不小但换来的是更灵活的接口配置和更完善的诊断寄存器。如果你的板子空间极度紧张、成本压得很死可能LAN8720更合适但如果是工业现场设备、需要长期稳定运行、还要能远程诊断链路状态DP83848的寄存器丰富度就体现出价值了。它有个电缆诊断功能能测线缆长度和故障位置这在现场排查时非常实用。1.3 典型应用场景长什么样我接触过的DP83848应用大致分三类。第一类是工业控制器比如PLC、远程IO模块MCU通过RMII接DP83848再经过网络变压器和RJ45出去。第二类是电力保护装置这类设备对电磁兼容要求极高DP83848的差分信号驱动能力和共模抑制在这里很关键。第三类是嵌入式网关一颗MCU带一路以太网做协议转换或者数据采集上传。这三类场景有个共同点设备一旦部署现场维护成本很高所以设计阶段必须把可靠性做足。我见过一个电力项目板子装在开关柜里旁边就是大功率接触器一开始没做隔离网口频繁掉线后来加了网络隔离变压器和TVS问题才解决。所以下面讲硬件设计时我会重点说隔离和防护这部分。2. 硬件设计里那些决定成败的细节2.1 电源和去耦不是随便放几个电容DP83848需要3.3V单电源供电但内部其实有多个电源域模拟电源、数字电源、IO电源。手册里会标出AVDD、DVDD、IOVDD这些引脚虽然都是3.3V但去耦电容的配置不能一视同仁。我的做法是每个电源引脚旁边放一个0.1uF的陶瓷电容紧贴引脚走线越短越好。然后在电源入口处放一个10uF的钽电容或者MLCC做储能。模拟电源部分额外加一个磁珠或者小电感把数字噪声挡在外面。这里有个容易忽略的点DP83848的模拟电源对纹波很敏感如果和MCU的数字电源共用一路LDOMCU跑起来时的电流波动会耦合过来导致PHY工作不稳定。我一般会给PHY单独一路LDO或者至少在电源走线上做星型拓扑从电源入口分别拉线到PHY和MCU不要串在一起。去耦电容的接地端要就近打过孔到地平面不要用长走线绕回地。我见过一块板子去耦电容的地端走了5mm才到过孔结果PHY的误码率一直偏高改短之后立刻正常。这种细节手册不会强调但实际影响很大。2.2 RMII接口的时钟和走线约束RMII模式下DP83848需要一个50MHz的参考时钟。这个时钟可以有两种来源一是外部晶振直接接在PHY的XI引脚上PHY内部倍频后输出50MHz给MAC二是MAC提供50MHz时钟给PHY。我强烈建议用第一种让PHY自己产生时钟。原因是MAC提供的时钟往往抖动大而且走线长了之后信号质量下降PHY对参考时钟的抖动很敏感抖动大了会导致发送眼图变差。如果用外部晶振选50MHz的有源晶振直接输出方波给XI引脚。注意晶振的供电也要干净旁边放0.1uF去耦。如果用的是无源晶振需要配合PHY内部的振荡电路这时候负载电容的匹配就很重要一般选12pF到18pF之间具体看晶振手册。我遇到过用错负载电容导致时钟频率偏移、link不稳定的情况换了电容就好了。RMII的数据线TXD0、TXD1、RXD0、RXD1以及TXEN、CRS_DV这几根线走线要等长误差控制在5mil以内。虽然RMII速率只有50MHz但边沿陡峭走线不等长会导致采样窗口偏移。另外这些线要远离时钟线和电源线避免串扰。如果板子上有多个高速信号RMII这组线最好走内层上下都有地平面参考。2.3 网络变压器和RJ45之间的门道PHY的差分输出不能直接接RJ45中间必须加网络隔离变压器。变压器的作用有三个一是电气隔离把网线和设备地隔开防止地电位差损坏芯片二是阻抗匹配PHY输出阻抗和网线特性阻抗之间做转换三是共模抑制滤掉共模噪声。选变压器时要注意几个参数匝数比一般是1:1电感量要足够通常350uH以上共模抑制比要高。我常用的是集成变压器的RJ45座子把变压器和RJ45做在一起省空间也省布线。但要注意集成座子的变压器中心抽头处理方式和分立方案略有不同需要看具体型号的手册。中心抽头的处理很关键。PHY侧的发送中心抽头要通过一个电容接地这个电容一般是0.1uF作用是提供交流回路。接收侧的中心抽头也要处理有的方案是通过电容接地有的是通过电阻分压提供偏置。DP83848的接收侧中心抽头通常接一个0.1uF电容到地具体看手册推荐电路。我见过有人把中心抽头直接接地结果接收信号幅度不对link能起来但丢包严重。RJ45侧的中心抽头要通过一个75欧姆电阻和一个1000pF电容串联到地这是为了泄放共模电荷。这个电阻和电容要靠近RJ45放置。另外RJ45的屏蔽壳要不要接地取决于设备外壳是否接地。如果设备是金属外壳且接地良好屏蔽壳接外壳地如果是塑料外壳屏蔽壳可以悬空或者通过一个电容接信号地。2.4 防护器件怎么选怎么放工业现场的网口防护不能省。雷击浪涌、静电放电、感性负载切换产生的尖峰都可能通过网线耦合进来。防护器件的选型和布局直接决定设备能不能扛住。我一般会在RJ45和变压器之间放TVS管选低电容的型号电容值要小于10pF否则会影响信号完整性。TVS的钳位电压要低于变压器的隔离耐压同时高于网线正常信号幅度。常见的做法是用一颗四通道TVS阵列分别保护四对差分线。如果设备需要更高的防护等级可以在变压器和PHY之间再加一级共模扼流圈进一步抑制共模噪声。共模扼流圈的阻抗要匹配一般选100欧姆到200欧姆之间。布局上防护器件要靠近接口走线要短而粗接地要低阻抗。TVS的接地端要直接打到地平面不要走细线。还有一个容易忽略的点网口的金属外壳和信号地之间要不要加电容如果加一般用1nF到10nF的高压电容作用是给高频干扰提供泄放路径同时保持直流隔离。这个电容的耐压要足够通常选2kV以上。3. 驱动配置从寄存器到能ping通3.1 MAC和PHY的通信机制先搞清楚在写驱动之前必须理解MAC和PHY之间怎么通信。数据通路走RMII控制通路走MDIO。MDIO是一个两线接口MDC是时钟MDIO是双向数据线。MAC通过MDIO读写PHY的寄存器配置工作模式、读取链路状态、获取协商结果。DP83848的寄存器地址是5位共32个寄存器。常用的有BMCR基本控制寄存器地址0x00、BMSR基本状态寄存器地址0x01、PHYIDR1和PHYIDR2PHY标识寄存器地址0x02和0x03、ANAR自动协商通告寄存器地址0x04、ANLPAR链路伙伴能力寄存器地址0x05。调试时第一步就是读PHYIDR1和PHYIDR2确认MDIO通信正常。DP83848的PHY ID是0x2000和0x5C90读出来对不上就说明MDIO有问题。MDC时钟频率不能超过2.5MHz一般用MAC的时钟分频得到。MDIO是双向线需要上拉电阻通常4.7k到10k。MDIO的时序要满足建立和保持时间要求写寄存器时数据在MDC上升沿有效读寄存器时PHY在MDC上升沿输出数据。3.2 上电初始化序列不能乱DP83848上电后需要一段稳定时间电源建立到3.3V后内部电路需要时间复位。我一般会在驱动初始化开头加10ms到50ms的延时等电源和时钟稳定后再操作寄存器。初始化序列大致如下先软复位写BMCR的bit15为1然后等待复位完成读BMCR确认bit15自动清零。复位完成后配置自动协商写BMCR的bit12为1使能自动协商同时写ANAR寄存器通告自己的能力比如支持10M/100M、半双工/全双工。然后等待自动协商完成轮询BMSR的bit5自动协商完成和bit2链路状态。协商完成后读BMSR和PHYSTS寄存器确认最终的工作速度和双工模式。这里有个坑有些MAC的驱动框架会自动配置PHY但配置的参数可能和实际需求不符。比如强制100M全双工但网线另一端是10M半双工协商就会失败。我建议先用自动协商让两端自己谈谈不拢再考虑强制模式。强制模式只在特定场景用比如对接老设备不支持自动协商。3.3 中断模式还是轮询模式DP83848支持中断输出链路状态变化、协商完成这些事件可以触发中断。用中断的好处是响应快、不占CPU但需要额外接一根中断线到MCU而且中断处理里要读寄存器清除中断标志。如果MCU引脚紧张或者对链路状态变化的实时性要求不高用轮询也完全可以。我一般用轮询每100ms读一次BMSR检查链路状态位。轮询的缺点是链路断开到驱动感知有延迟但对于大多数工业设备来说100ms的延迟可以接受。如果用中断要注意DP83848的中断是低电平有效还是高电平有效以及中断标志的清除方式。有些中断标志需要读特定寄存器才能清除漏清会导致中断一直触发。我见过一个案例中断线一直拉低MCU反复进中断最后发现是链路状态变化的中断标志没清。3.4 驱动里必须处理的异常情况链路断开和恢复是最常见的异常。驱动里要有一个状态机跟踪当前链路状态。链路断开时要停止发送、清空发送队列、通知上层协议。链路恢复时要重新初始化MAC的DMA描述符、重新使能发送接收。另一个异常是自协商结果和预期不符。比如期望100M全双工结果协商成10M半双工。这时候要读ANLPAR寄存器看对端通告了什么能力判断是网线问题、对端设备问题还是配置问题。如果对端只支持10M那协商成10M是正常的驱动要能适应。还有一种情况是PHY寄存器读写失败。MDIO通信偶尔会因为干扰出错驱动里要有重试机制。我一般读寄存器失败后重试3次3次都失败就报错。写寄存器失败也要重试但写操作重试要小心因为有些寄存器写一次就生效重试可能导致重复配置。4. 调试实战从link灯不亮到稳定通信4.1 第一板回来先做这几项检查板子焊好之后不要急着上电跑代码。先做静态检查用万用表测电源对地阻抗确认没有短路测PHY的电源引脚电压确认3.3V正常测晶振是否起振用示波器看XI引脚有没有50MHz波形。这几步能排除大部分焊接和物料问题。上电后先不接网线读PHY ID。如果读不到检查MDC和MDIO的走线、上拉电阻、MAC的MDIO配置。我遇到过MDIO上拉电阻没焊导致读不到ID的情况补上就好了。如果PHY ID读到了但不对可能是MDIO时序有问题试着降低MDC频率。然后接上网线看link灯。DP83848有LED引脚可以配置成link指示、活动指示、速度指示。如果link灯不亮先测BMSR的bit2看PHY自己认为链路是否建立。如果PHY认为链路建立了但灯不亮那是LED配置问题如果PHY认为链路没建立那就是硬件或者协商问题。4.2 link不亮的排查链路link不亮的排查要按信号流向一步步来。先确认PHY的发送端有没有信号输出。用示波器差分探头测PHY的TX和TX-正常应该有差分信号。如果没有检查PHY的发送使能、时钟、复位状态。如果有信号但幅度不对检查变压器和中心抽头电路。再确认接收端。用示波器测RJ45侧的差分信号看有没有来自对端的信号。如果没有换一根网线、换一个对端设备试试。如果有信号但PHY的RXD没有输出检查接收通道的配置比如接收使能、均衡器设置。自动协商失败也会导致link不亮。可以试着强制模式把两端都设成100M全双工看link能不能起来。如果强制模式能起来说明自动协商有问题可能是协商脉冲的幅度或者时序不满足要求。这时候要检查变压器的匝数比和中心抽头电路。我遇到过一个典型案例板子link灯不亮测PHY发送端有信号接收端也有信号但就是协商不成功。后来发现是变压器的中心抽头电容焊错了焊成了1uF换成0.1uF就好了。电容太大导致交流回路的时间常数不对协商脉冲被畸变。4.3 ping不通但link正常的处理link正常说明物理层基本通了ping不通的问题在MAC层或者协议层。先确认MAC的发送和接收DMA是否正常看发送描述符有没有被硬件回收接收描述符有没有收到数据。如果发送描述符一直不回收说明MAC没发出去检查MAC的发送使能、RMII接口配置。如果MAC发出去了但收不到回复用网络抓包工具看有没有收到ARP回复。如果没有可能是IP地址配置问题、子网掩码问题、或者对端设备没响应。如果有ARP回复但ping不通检查ICMP校验和、防火墙设置。还有一种情况是能ping通但丢包严重。这通常是信号完整性问题。用示波器看RMII的时钟和数据线看有没有过冲、振铃、边沿变缓。如果时钟抖动大检查晶振和电源如果数据线有串扰检查走线间距和参考平面。我遇到过RMII数据线和时钟线走得太近导致丢包的案例拉开距离后丢包率从10%降到0。4.4 长时间运行稳定性的验证方法工业设备要求7x24小时运行所以调试阶段要做长时间稳定性测试。我的做法是用两台设备对pingping包大小设成1400字节以上连续ping 24小时统计丢包率和延迟。同时用脚本定期读取PHY的误码率寄存器看有没有误码累积。温度测试也很重要。用热风枪或者温箱把板子加热到70度以上看link会不会断。DP83848的工业级版本能到85度但外围器件的温度特性也要考虑。我见过晶振在高温下频偏导致link断的情况换了工业级晶振就好了。电磁兼容测试如果有条件也要做。用对讲机或者电机在旁边干扰看网口会不会掉线。如果掉线检查防护器件和接地。我一般会在网口附近预留共模扼流圈的位置测试不过的时候可以加上。5. 几个容易被忽略的经验点5.1 复位电路的设计细节DP83848的复位引脚是低电平有效复位时间要求至少1ms。我一般用RC复位电路电阻10k电容0.1uF时间常数1ms。但要注意如果电源上升慢RC复位可能不够可靠这时候用专门的复位芯片更好。复位引脚不能悬空必须接复位电路。我见过复位引脚悬空的板子上电后PHY状态随机有时候能工作有时候不能。另外复位引脚要远离干扰源走线要短。5.2 寄存器配置的保存和恢复有些应用需要在运行时切换PHY的工作模式比如从100M切到10M。切换时要先关闭MAC的发送接收配置PHY等link重新建立后再使能MAC。直接改PHY寄存器而不停MAC可能导致MAC和PHY状态不一致出现丢包。如果设备支持低功耗模式PHY可以进入power down状态。进入前要保存当前配置唤醒后恢复。DP83848的BMCR的bit11是power down控制位置1进入低功耗置0唤醒。唤醒后需要重新协商所以驱动里要处理好状态转换。5.3 和不同MAC对接的注意事项DP83848和不同MCU的MAC对接时RMII的时序参数可能略有差异。比如STM32的RMII要求REF_CLK由外部提供而有些MCU可以自己输出。对接前要仔细看两边的手册确认时钟方向、数据有效边沿、CRS_DV的极性。如果MAC支持硬件校验和卸载要确认PHY是否透传校验和。DP83848是透明传输不做校验和修改所以校验和卸载要在MAC层做。如果MAC没做卸载协议栈软件要做。还有一个点是MAC的MDIO时钟分频。不同MCU的MDIO时钟源不同分频系数要算对确保MDC频率在2.5MHz以下。我见过MDC频率超了导致寄存器读写不稳定的情况降低分频系数就好了。5.4 生产测试环节的快速验证产线上每块板子都要测网口不能只靠功能测试。我一般会做一个简单的测试工装一块已知良好的对端板跑一个固定的测试程序被测板发送特定数据包对端接收并校验同时读PHY的链路状态和误码率。测试时间控制在10秒以内能覆盖link建立、数据收发、误码检测。测试程序里要包含强制模式测试因为产线上可能没有自动协商的对端设备。强制100M全双工发一批数据确认无误码。再强制10M半双工再测一遍。这样能覆盖PHY的主要工作模式。产线测试还要记录PHY ID和寄存器状态作为追溯依据。如果后续现场出问题可以对比产线数据判断是批次问题还是个别问题。6. 写在最后的一点个人体会DP83848这颗芯片我用了很多年从最初照着手册连电路、调不通就换芯片到后来能快速定位是硬件还是软件问题中间积累的经验大多来自踩坑。最深的体会是以太网PHY的调试硬件和软件的边界很模糊link不亮可能是软件配置问题ping不通也可能是硬件信号问题。所以排查时不要预设结论按信号流向一步步测用示波器和寄存器读值说话。另外手册里的推荐电路一定要仔细看尤其是中心抽头、去耦、复位这些细节。我见过太多问题都是因为觉得差不多就行导致的。工业设备对可靠性的要求高设计阶段多花一天检查现场就少一次故障。
返回列表