3. 常见 PHY 寄存器介绍
做 PHY 调试这些年,我最常打交道的寄存器就那三四个。控制寄存器、状态寄存器、PHY 标识符寄存器,说白了就是 PHY 的「大脑」「体检报告」和「身份证」。你拿到一个新的板子,连上示波器之前,第一步一定是读这几个寄存器。我习惯把它们叫做「三板斧」——砍下去,问题多半能暴露个七七八八。
3.1 控制寄存器(Control Register,CR)
控制寄存器地址通常是 0x00,也有厂商放在 0x10 的,但标准 MDIO 规范里就是 0x00。它的每一位都是你向 PHY 下达的指令,我们直接看最常见的位域:
| 位范围 | 名称 | 功能说明 |
|---|---|---|
| Bit 15 | Soft Reset | 软件复位,置 1 后 PHY 内部复位,完成后自动清 0 |
| Bit 14 | Loopback | 环回模式,置 1 时将 TX 数据环回到 RX |
| Bit 13 | Speed Selection (LSB) | 与 Bit 6 共同决定速率:00=10M, 01=100M, 10=1000M |
| Bit 12 | Auto-Negotiation Enable | 自动协商使能 |
| Bit 11 | Power Down | 低功耗模式 |
| Bit 10 | Isolate | 隔离模式,断开 PHY 与 MAC 的数据通路 |
| Bit 9 | Restart Auto-Negotiation | 重启自动协商 |
| Bit 8 | Full Duplex | 全双工模式(当不启用自动协商时有效) |
| Bit 6 | Speed Selection (MSB) | 与 Bit 13 组合使用 |
项目中我遇到过几次「复位后 PHY 不工作」的情况。读 CR 看到 Bit 15 一直为 1,说明复位没完成。后来发现是复位引脚被外部电容拉住了,软复位也没法生效。你想想看,硬件复位和软件复位是两套机制,互不干扰,但硬件有问题软件也救不了。
3.2 状态寄存器(Status Register,SR)
地址通常 0x01,只读。它告诉你 PHY 此时此刻的「心情」如何。我每次排查链路问题,第一步就是读 SR,看 Bit 2(Link Status)。
| 位范围 | 名称 | 取值含义 |
|---|---|---|
| Bit 15 | 100BASE-T4 | 是否支持 T4 |
| Bit 14 | 100BASE-X Full Duplex | 是否支持 100M 全双工 |
| Bit 13 | 100BASE-X Half Duplex | 是否支持 100M 半双工 |
| Bit 12 | 10BASE-T Full Duplex | 是否支持 10M 全双工 |
| Bit 11 | 10BASE-T Half Duplex | 是否支持 10M 半双工 |
| Bit 10 | 100BASE-T2 Full Duplex | 是否支持 T2 全双工 |
| Bit 9 | 100BASE-T2 Half Duplex | 是否支持 T2 半双工 |
| Bit 8 | Extended Status | 是否有扩展状态寄存器 |
| Bit 6 | MF Preamble Suppression | 是否支持省略前导码 |
| Bit 5 | Auto-Negotiation Complete | 自动协商是否完成 |
| Bit 3 | Remote Fault | 远端故障指示 |
| Bit 2 | Link Status | 链路状态:1=已连接,0=断开 |
| Bit 1 | Jabber Detect | 检测到持续超长帧 |
| Bit 0 | Extended Capability | 是否支持扩展寄存器 |
还有一次现场排查,客户说「网口灯不亮」,我让他读 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 根本没上电。
我开发验证工具时,第一步就是扫描 32 个 PHY 地址(0~31),读每个地址的 ID1 和 ID2。只有 ID 合法的地址才继续做后续配置。这样能避免因为地址错误而写入别人的寄存器。
3.4 其他常见寄存器一览
除了上面三个,自动协商宣告寄存器(0x04)、链接伙伴能力寄存器(0x05)、协商扩展状态寄存器(0x0F)也经常用到。但篇幅有限,我挑一个关键点:自动协商宣告寄存器的 Bit 5~Bit 9 定义了速度/双工能力,Bit 12~Bit 15 是流控(对称/非对称暂停帧)。
| 寄存器地址 | 名称 | 典型用途 |
|---|---|---|
| 0x00 | Control Register | 复位、环回、速度、自动协商控制 |
| 0x01 | Status Register | 链路状态、协商完成、能力集 |
| 0x02~0x03 | PHY Identifier | 识别芯片型号 |
| 0x04 | Auto-Negotiation Advertisement | 宣告本端能力 |
| 0x05 | Auto-Negotiation Link Partner Ability | 读取对端能力 |
| 0x06 | Auto-Negotiation Expansion | 扩展状态,如下一页请求 |
| 0x0F | Extended Status | 1000BASE-T 支持判断等 |
0x04 看本端宣告了什么能力,再读 0x05 看对端宣告了什么,两者做与运算,再查 0x01 的 Bit 5 确认协商完成。三步走完,90% 的协商问题都能定位。这张图很清楚:MDIO 控制器通过地址总线访问 PHY 的寄存器空间,而 CR、SR、ID 是最常用、最关键的几个。我把它叫做「PHY 调试入口三兄弟」。你只要把这几个读透了,80% 的链路问题就能定个八九不离十。