3. 常见 PHY 寄存器介绍

做 PHY 调试这些年,我最常打交道的寄存器就那三四个。控制寄存器、状态寄存器、PHY 标识符寄存器,说白了就是 PHY 的「大脑」「体检报告」和「身份证」。你拿到一个新的板子,连上示波器之前,第一步一定是读这几个寄存器。我习惯把它们叫做「三板斧」——砍下去,问题多半能暴露个七七八八。

3.1 控制寄存器(Control Register,CR)

控制寄存器地址通常是 0x00,也有厂商放在 0x10 的,但标准 MDIO 规范里就是 0x00。它的每一位都是你向 PHY 下达的指令,我们直接看最常见的位域:

位范围名称功能说明
Bit 15Soft Reset软件复位,置 1 后 PHY 内部复位,完成后自动清 0
Bit 14Loopback环回模式,置 1 时将 TX 数据环回到 RX
Bit 13Speed Selection (LSB)与 Bit 6 共同决定速率:00=10M, 01=100M, 10=1000M
Bit 12Auto-Negotiation Enable自动协商使能
Bit 11Power Down低功耗模式
Bit 10Isolate隔离模式,断开 PHY 与 MAC 的数据通路
Bit 9Restart Auto-Negotiation重启自动协商
Bit 8Full Duplex全双工模式(当不启用自动协商时有效)
Bit 6Speed Selection (MSB)与 Bit 13 组合使用
我个人习惯在初始化流程里先读回 CR 确认寄存器是否可写,如果读回来全是 0xFF 或者 0x0000,那基本可以断定 MDIO 通信没通,或者 PHY 地址搞错了。

项目中我遇到过几次「复位后 PHY 不工作」的情况。读 CR 看到 Bit 15 一直为 1,说明复位没完成。后来发现是复位引脚被外部电容拉住了,软复位也没法生效。你想想看,硬件复位和软件复位是两套机制,互不干扰,但硬件有问题软件也救不了。

3.2 状态寄存器(Status Register,SR)

地址通常 0x01,只读。它告诉你 PHY 此时此刻的「心情」如何。我每次排查链路问题,第一步就是读 SR,看 Bit 2(Link Status)。

位范围名称取值含义
Bit 15100BASE-T4是否支持 T4
Bit 14100BASE-X Full Duplex是否支持 100M 全双工
Bit 13100BASE-X Half Duplex是否支持 100M 半双工
Bit 1210BASE-T Full Duplex是否支持 10M 全双工
Bit 1110BASE-T Half Duplex是否支持 10M 半双工
Bit 10100BASE-T2 Full Duplex是否支持 T2 全双工
Bit 9100BASE-T2 Half Duplex是否支持 T2 半双工
Bit 8Extended Status是否有扩展状态寄存器
Bit 6MF Preamble Suppression是否支持省略前导码
Bit 5Auto-Negotiation Complete自动协商是否完成
Bit 3Remote Fault远端故障指示
Bit 2Link Status链路状态:1=已连接,0=断开
Bit 1Jabber Detect检测到持续超长帧
Bit 0Extended Capability是否支持扩展寄存器
我曾经踩过一个坑:读 SR 的 Link Status 位时,如果不先写一遍 CR 再读,有些 PHY 会返回上一次的中断状态而不是实时值。所以我在代码里都会先写一次 CR(不改值),延时 1ms 后再读 SR。

还有一次现场排查,客户说「网口灯不亮」,我让他读 SR 回来报告 0x7949——自动协商完成,链路状态为 1。那灯为什么不亮?后来发现是 LED 的 GPIO 配置寄存器没写对。你看,寄存器不止 CR/SR,有些 PHY 还有专门的 LED 控制寄存器,所以定位时要跳出惯性思维。

3.3 PHY 标识符(PHY Identifier Registers)

PHY 标识符由两个 16 位寄存器组成:PHY ID1(地址 0x02)和 PHY ID2(地址 0x03)。它俩拼起来就是一个 32 位的 OUI(Organizationally Unique Identifier)+ 制造商特定信息。

举个例子,某款 PHY 的 ID1=0x2000,ID2=0xA210,组合起来就是 0x2000A210。你拿着这个数去 IEEE 官网查前 24 位,就知道是谁家的芯片。我习惯把常见 PHY 的 ID 记在小本子上,调试时如果读出 ID 不符合预期,那八成是地址搞错了或者 PHY 根本没上电。

读取 PHY ID 是验证 MDIO 通信是否正常的最快方法。因为 ID 是只读的、固定的,如果读回来不是全 0 或全 1,基本上通信没问题。

我开发验证工具时,第一步就是扫描 32 个 PHY 地址(0~31),读每个地址的 ID1 和 ID2。只有 ID 合法的地址才继续做后续配置。这样能避免因为地址错误而写入别人的寄存器。

3.4 其他常见寄存器一览

除了上面三个,自动协商宣告寄存器(0x04)、链接伙伴能力寄存器(0x05)、协商扩展状态寄存器(0x0F)也经常用到。但篇幅有限,我挑一个关键点:自动协商宣告寄存器的 Bit 5~Bit 9 定义了速度/双工能力,Bit 12~Bit 15 是流控(对称/非对称暂停帧)。

寄存器地址名称典型用途
0x00Control Register复位、环回、速度、自动协商控制
0x01Status Register链路状态、协商完成、能力集
0x02~0x03PHY Identifier识别芯片型号
0x04Auto-Negotiation Advertisement宣告本端能力
0x05Auto-Negotiation Link Partner Ability读取对端能力
0x06Auto-Negotiation Expansion扩展状态,如下一页请求
0x0FExtended Status1000BASE-T 支持判断等
调试自动协商问题时,先读 0x04 看本端宣告了什么能力,再读 0x05 看对端宣告了什么,两者做与运算,再查 0x01 的 Bit 5 确认协商完成。三步走完,90% 的协商问题都能定位。
PHY 寄存器访问结构概览 MDIO 控制器 (CPU/MAC 侧) PHY 地址空间 0x00 ~ 0x1F (标准 32 寄存器) CR (0x00) SR (0x01) PHY ID1 (0x02) PHY ID2 (0x03) 提示 读 ID 确认通信正常

这张图很清楚:MDIO 控制器通过地址总线访问 PHY 的寄存器空间,而 CR、SR、ID 是最常用、最关键的几个。我把它叫做「PHY 调试入口三兄弟」。你只要把这几个读透了,80% 的链路问题就能定个八九不离十。