1. PHY 基础概念:PHY 在以太网中的角色与功能概述
说到以太网,大家第一反应可能是那根八芯网线,或者交换机上的闪烁灯。但真正让数据跑起来的,是藏在接口后面的一个芯片——PHY(Physical Layer,物理层收发器)。
我刚开始做嵌入式网络产品时,总觉得 PHY 就是个“信号转换器”,没什么技术含量。直到有一次,某批板子上电后链路死活不亮,排查了一整天,最后发现是 PHY 的自动协商寄存器没配置对。嗯,从那以后我就再也不敢小看这颗小芯片了。
这一章,我就带你从底层视角捋一捋:PHY 到底是什么,它在以太网里扮演什么角色,以及为什么搞硬件的人必须搞懂它。
1.1 以太网分层模型中的 PHY
先看最经典的 OSI 七层模型。以太网一般只涉及下面两层:
| OSI 层 | 以太网实现 | 典型芯片/接口 |
|---|---|---|
| 数据链路层(Layer 2) | MAC(介质访问控制) | CPU 集成 MAC / 独立 MAC 芯片 |
| 物理层(Layer 1) | PHY(物理层收发器) | 独立 PHY 芯片(如 RTL8211、KSZ9031) |
说白了,MAC 负责把数据打包成帧、做 CRC 校验、控制发送时机;而 PHY 负责把这些数字信号变成能在网线上传输的模拟信号,再把接收到的模拟信号变回数字信号。
核心结论:MAC 管“逻辑”,PHY 管“物理”。你写的网络协议栈跑到 MAC 层就停了,剩下的事全交给 PHY。
我个人习惯把 MAC 和 PHY 的关系比作“司机”和“车”。MAC 是司机,知道怎么踩油门、打方向盘(协议);PHY 是发动机、轮胎和悬挂(物理层),负责真正在路上跑。司机再牛,车不行也跑不起来——反过来,车再好,司机不会开也白搭。
1.2 PHY 到底干了哪些活儿?
PHY 的功能并不只是“数模转换”。我把它拆成五大核心任务:
- 编码与解码:把 MAC 送过来的 4-bit 或 8-bit 并行数据,按照特定编码(如 100BASE-TX 用 4B5B + MLT-3)变成串行信号;接收端反向解码。这样可以降低直流分量,利于变压器耦合。
- 线路驱动与接收:把编码后的信号通过差分线驱动到网线(100Ω 平衡对),同时从网线上接收微弱的差分信号,经均衡和放大后恢复数据。
- 时钟恢复(CDR):从接收到的数据流里提取同步时钟。网线上没有单独的时钟线,PHY 必须自己从边沿跳变中“猜”出时钟。我记得有次用低质量晶振,CDR 频繁失锁,导致丢包率暴增。
- 自动协商(Auto-Negotiation):上电后自动和对端 PHY 交换能力信息,协商出双方都支持的最高速率和双工模式。这是以太网“即插即用”的关键。
- 链路状态检测(Link Status):持续发送和接收链路脉冲(快速链路脉冲 FLP),判断物理连接是否完好。一旦断开,MAC 层立刻知道。
一个小经验:调试 PHY 时,第一步永远是读寄存器 0x01(Basic Status)看看 Link Status 位(bit 2)是不是 1。如果不是,别急着调上层——先查硬件连接、晶振和供电。
1.3 PHY 与 MAC 的接口
PHY 和 MAC 之间通常通过标准的介质独立接口(MII)连接。不同速率、不同物理介质会用不同的接口。下表列出最常见的几种:
| 接口 | 数据位宽 | 时钟频率 | 典型速率 | 备注 |
|---|---|---|---|---|
| MII | 4bit | 25MHz (100M) / 2.5MHz (10M) | 10/100Mbps | 最经典,引脚多(16根) |
| RMII | 2bit | 50MHz | 10/100Mbps | 节省引脚,常用在 MCU |
| RGMII | 4bit (DDR) | 125MHz | 1000Mbps | 25/125MHz 双沿采样 |
| GMII | 8bit | 125MHz | 1000Mbps | 引脚多,老设计用 |
| SGMII | 串行差分 | 625MHz | 1000Mbps | SerDes 方式,高速信号 |
为什么要有这么多接口?说白了就是成本和性能的平衡。MII 容易布线但占 PCB 空间,RMII 省引脚但时钟频率高,RGMII 可以跑千兆但时序要求更严苛。
踩坑提醒:我曾经在 RMII 接口上翻过车。MAC 和 PHY 的参考时钟方向搞反了——有的 PHY 需要 MAC 提供 50MHz,有的 PHY 自己输出。结果连上去指示灯亮但 ping 不通,调了两天才发现时钟极性不匹配。所以画板子前一定先看手册里 clock scheme 章节。
1.4 PHY 的寄存器基础:MDIO/MDC 管理接口
配置 PHY 和控制 PHY,全靠一个叫 MDIO(Management Data Input/Output)的串行总线。它只有两根线:
- MDC(Management Data Clock):时钟,由 MAC 或主控提供,最高约 2.5MHz。
- MDIO(Management Data Input/Output):双向数据线。
通过 MDIO 总线,我们可以读写 PHY 内部最多 32 个寄存器(0x00 ~ 0x1F),每个寄存器 16 位。IEEE 802.3 标准定义了前几个寄存器的含义:
| 寄存器地址 | 名称 | 功能简述 |
|---|---|---|
| 0x00 | Basic Control | 软复位、环回、速率选择、双工设置、自动协商使能 |
| 0x01 | Basic Status | 链路状态、自动协商完成、能力指示 |
| 0x02 ~ 0x03 | PHY Identifier | OUI 和型号,用来识别厂商 |
| 0x04 | Auto-Negotiation Advertisement | 本端支持的能力(10/100/1000M、半双工/全双工) |
| 0x05 | Auto-Negotiation Link Partner Ability | 对端能力(只读) |
| 0x0A ~ 0x0F | Vendor Specific | 厂商自定义,如均衡、省电、中断等 |
你想想看,整个 PHY 的行为控制其实就是通过这 MDIO 接口读写几个 16 位寄存器。搞懂了它们,就等于拿到了 PHY 的“遥控器”。
1.5 一张图看明白 PHY 在系统里的位置
下面我用 SVG 画了个示意图,展示典型千兆以太网节点里 MAC、PHY、变压器(Ethernet Transformer)、RJ45 之间的连接关系。这样你能直观看到 PHY 在信号路径中的位置。
从图上可以看到,MAC 通过 GMII/RGMII 总线与 PHY 交换并行数据,同时通过 MDIO 管理 PHY 的寄存器。PHY 将数据编解码后,经差分对送往变压器(隔离共模干扰、改变电平),最后从 RJ45 座子接入网线。
重点记住:MDIO 是工控嵌入式里最常用的外设调试手段。你写驱动、调链路、修丢包,90% 的工作量都花在操作 PHY 寄存器上。所以后面我们会花好几章专门讲 MDIO 时序和寄存器读写实现。
1.6 本章小结
这一章我们搭了个大框架:
- PHY 在 OSI 模型里是物理层,处理信号编码/解码、线路驱动、时钟恢复、自动协商。
- PHY 通过 MII/RMII/RGMII 等接口与 MAC 连接,通过 MDIO 总线配置。
- 标准 PHY 寄存器(0x00~0x05)定义了控制、状态和协商参数——它们是我们后续操作的基础。
- 实际开发中,链路不亮的排查路径:先读寄存器 0x01 确认 Link 状态,再看自动协商寄存器,最后检查硬件连接和时钟。