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 内部有这么多模块。那怎么控制它们?怎么知道当前链路通了没有、速率是多少?答案是——通过寄存器。
每个 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 读写这些寄存器,就能控制速率、查询状态、诊断故障。嗯,后面我们会一步步拆解这些寄存器到底怎么配。