1. PHY 基础概念:什么是 PHY?它在以太网中的作用以及寄存器映射概述

PHY,全称 Physical Layer,物理层芯片。说人话就是——它负责把数字信号变成能在网线上跑的电信号,反过来也一样。我刚入行时总觉得这玩意儿就是个“电平转换器”,后来被一块板子的链路不稳问题折磨了三天,才明白 PHY 远没那么简单。

PHY 是什么?

以太网通信里,数据从 CPU 出来是 0 和 1 的数字信号。但网线(比如双绞线、光纤)不能直接传这种方波。为什么?因为频率太高会衰减,电磁干扰也会让信号变形。PHY 干的事,就是把数字信号调制(编码)成适合线缆传输的模拟信号,再在接收端把模拟信号解码回数字信号。

我个人习惯把 PHY 比喻成“翻译官”。MAC 层说的是数字语言,线缆上说的是模拟语言,PHY 在中间两头翻。你想想看,没有这个翻译官,MAC 再快也没用,因为它的话网线听不懂。

关键角色:PHY 是 OSI 模型第一层(物理层)的核心器件,直接与介质(RJ45、SFP 光模块等)打交道。MAC 层通过 MII/GMII/RGMII 等接口与 PHY 连接。

为什么需要 PHY?

我做过一个项目,工程师把 MAC 出来的信号直接接到 RJ45 座上,结果 10 米线就丢包。这就是没搞懂 PHY 的作用。PHY 需要解决以下几个核心问题:

  • 编码/解码:把数据的 0/1 转换成线缆上的电平或光信号。比如 1000BASE-T 用的 PAM5 编码。
  • 时钟恢复:从接收到的信号中提取时钟,保证收发双方节奏一致。
  • 链路检测:自动协商速率(10/100/1000M)、双工模式(半双工/全双工)。
  • 信号调理:预加重、均衡、滤波,补偿线缆损耗。
功能 简要说明 我的经验
编码解码 4B/5B、8B/10B、PAM5 等 100M 用 4B/5B,千兆用 PAM5,搞混了链路直接不通
时钟恢复 CDR 电路从数据流中提取时钟 我遇到过晶振不准导致 CDR 失锁,换电容解决
自动协商 FLP 脉冲交换能力信息 曾经被某交换机的协商 bug 坑过,最后强制配置
电气隔离 配合网络变压器实现共模隔离 变压器中心抽头没接对,ESD 打坏了好几片

提示:PHY 和 MAC 之间的接口,标准叫 MII,衍生出 RMII、GMII、RGMII、SGMII 等。速率越高,接口引脚越少。我个人推荐新设计优先用 RGMII,引脚少、速度够。

PHY 的内部构成(简化版)

PHY 不是一块简单的芯片。它内部包含多个功能模块。我画了一张图帮你快速建立整体认知:

PHY 芯片核心功能模块 MAC 接口(MII / RGMII) 收发器(Transceiver) PCS + PMA 两大部分 编码/解码 时钟恢复 (CDR) 自动协商 介质接口(MDI / 光模块) 管理接口(MDIO) 图中灰色虚线箭头表示管理通路(MDIO) 实线箭头表示数据通路 寄存器映射就藏在这条管理通路上 CPU 通过 MDIO 读写 PHY 内部寄存器

寄存器映射概述

好了,现在你知道 PHY 内部有这么多模块。那怎么控制它们?怎么知道当前链路通了没有、速率是多少?答案是——通过寄存器。

每个 PHY 芯片内部都有一组寄存器。CPU 用 MDIO(Management Data Input/Output)总线读写这些寄存器。MDIO 有两根线:时钟 MDC 和数据 MDIO。我记得第一次用 MDIO 读 PHY 时,时序没调好,读回来的全是 0xFF,折腾了半天才发现是时钟极性反了。

IEEE 802.3 标准规定了基本寄存器组(0~15),称为 MII 寄存器组。16~31 由厂商自定义。也就是说:

  • 0~15 寄存器:所有符合标准的 PHY 都必须支持,内容大同小异。
  • 16~31 寄存器:不同厂商(Broadcom、Marvell、Realtek、Microchip 等)各自定义扩展功能。

警告:千万不要以为寄存器 0~15 在所有 PHY 上完全一样。标准定义了功能,但没规定 bit 布局的每个细节。比如某些 PHY 的 BMSR(寄存器 1)的 bit 4 含义可能不同。换 PHY 型号一定要重新读 data sheet,我在这上面吃过亏。

核心寄存器一览

下面这张表列出开发中最常用的几个寄存器。你如果做 PHY 调试,这 5 个基本上天天打交道。

寄存器 偏移 名称 关键位 我的建议
BMCR 0 基本控制 bit 15: 软复位
bit 13: 速率选择
bit 12: 自动协商使能
上电后第一件事:读它确认 PHY 状态
BMSR 1 基本状态 bit 5: 自动协商完成
bit 2: 链路状态
调试链路时轮询这个寄存器
PHYIDR1 2 PHY 标识高 16 位 OUI 的高位 用来确认你读到了正确的 PHY 型号
PHYIDR2 3 PHY 标识低 16 位 OUI 低位 + 型号 + 版本 我经常用这两个寄存器做驱动适配
ANAR 4 自动协商通告 bit 9~5: 技术能力字段 强制配置速率时可以写这个寄存器

调试技巧:我写了个小工具,加电后先读 PHYIDR1/2 确认连接。如果读到 0x0000 或 0xFFFF,大概率是 MDIO 时序或地址不对,别急着怀疑 PHY 坏了。

一句话总结

PHY 就是以太网的物理层翻译官。它的核心模块都在内部寄存器里反映出来。你只要学会通过 MDIO 读写这些寄存器,就能控制速率、查询状态、诊断故障。嗯,后面我们会一步步拆解这些寄存器到底怎么配。