MDIO/MDC 管理总线:Clause 22/45 读写 PHY 寄存器与链路检测
更新时间:2026-09-19。前置:以太网 MII/RMII/GMII。数据走 xMII,配置和状态走 MDIO 这条低速管理总线。
本文要回答的问题
- MDIO 一帧长什么样,读和写的时序差在哪?
- Clause 22 和 Clause 45 各用于什么 PHY,地址机制差在哪?
- 怎么判断链路 up、速率/双工,自协商结果从哪读?
- PHY 地址、turnaround 位、轮询与中断有哪些坑?
一、电气与角色
两线:MDC 由 MAC 产生的管理时钟(非周期性,最大频率常 2.5MHz);MDIO 半双工双向数据线,上拉,类似开漏但 PHY 也可强推。一总线上最多挂 32 个 PHY,靠 5 位 PHY 地址(由引脚配置/上下拉)区分。MAC 是站管理实体(STA),PHY 是被管理设备。
二、Clause 22 帧格式(32 位)
字段: PRE(32个1) | ST | OP | PHYADR(5) | REGADR(5) | TA | DATA(16) | 空闲(Z)
写: 111... | 01 | 01 | phyaddr | regaddr | 1 0| 16位数据 |
读: 111... | 01 | 10 | phyaddr | regaddr | Z 0| ←PHY驱动16位
位: OP: 01=写 10=读- PRE:至少 32 个连续 1 做同步(部分 PHY 支持抑制前导)。
- ST=01:标识 MDIO 开始。
- TA(turnaround,2 bit):总线方向切换。写操作 MAC 驱动
10;读操作 MAC 先释放(高阻 Z),PHY 驱动0再接数据。读帧 TA 由 PHY 拉低是响应标志;若读到1(高阻被上拉)表示无应答/地址错。
常用 Clause22 寄存器:
| 地址 | 寄存器 | 用途 |
|---|---|---|
| 0 | BMCR | 复位、自协商使能、掉电、强制速率 |
| 1 | BMSR | 链路状态、自协商能力/完成 |
| 2/3 | PHY ID | 厂商 OUI/型号 |
| 4/5 | 广告/对端能力 | 自协商通告与对端能力 |
| 6 | 自协商结果 | 协商出的速率/双工 |
| 9/10.. | 厂商扩展 | 延迟、LED、RGMII 时钟等 |
三、链路检测与自协商
典型驱动流程:
- 复位/使能自协商(BMCR.ANENABLE=1,可能先 BMCR.RESET=1 等自清零)。
- 轮询 BMSR.LINKSTATUS(位2):注意该位是 latch-low——链路掉线时锁低,读后才刷新,故要读两次或结合自协商完成位判断,否则会误判。
- 读寄存器 6(或 BMSR+扩展状态)得速率(10/100/1000)与双工。
- 用结果配置 MAC 的 xMII 时钟/双工,保证两端一致(半/全双工不一致会晚冲突、错包)。
四、Clause 45(高速/多端口/光模块 PHY)
千兆以上、10G、backplane PHY 寄存器空间远超 32 个,Clause45 用两段式:
先「地址帧」(OP=00):指定端口地址 PRTAD + 设备地址 DEVAD + 16 位寄存器地址
再「读/写帧」(OP=11 读 / 01 写):访问刚才选中的寄存器即先「设指针」再「读写数据」,类似 I2C EEPROM 的字地址。用 Clause22 时序访问 Clause45-only PHY 会无响应。
五、可综合/控制器要点
MDIO 主机是一个带时钟分频(系统时钟→MDC)的移位状态机:PRE→ST→OP→移位 PHY/REG 地址→处理 TA 方向→并串/串并 16 位;读时在 TA 后切换三态由 PHY 驱动。位级操作与 I2C 主机思路相似但时序更固定。
六、常见的坑
- PHY 地址错:地址由引脚上下拉决定,多片相同或悬空导致读到 0/冲突。
- 读帧不处理 TA 高阻:MAC 没释放 MDIO,PHY 驱动不进来,读到 0xFFFF/0x0000。
- 拿 TA=1 当有效:读应答必须是 PHY 拉 0,读 1 说明无应答。
- BMSR latch-low 误判:只在启动读一次,掉线/恢复检测不到,要读两次刷新。
- 复位后立刻读:BMCR.RESET 自清零需时间,寄存器尚未就绪。
- Clause22/45 混用:10G/Clause45 PHY 用 22 帧读不到;某些 PHY 通过子句 22 的间接寄存器访问 clause45 空间。
- 自协商与强制不匹配:一端自协商、一端强制,结果落到半双工。
- MDC 超频/非规范占空比:超出 PHY 规定最大值导致读写不稳。
- 多 PHY 共用总线漏上拉:MDIO 高阻态电平不确定。
- 配置后不同步 MAC:读了新速率却没重配 MAC 的 RGMII 时钟/双工。
- 光模块/SerDes 状态查错寄存器:链路 up 还要看 PCS/Sync 标志而非仅铜口 BMSR。
相关与延伸
数据通路接口见 MII/RMII/GMII/RGMII;半双工/三态概念见 三态总线;两线时序对照 I2C 主机;配置总线寄存器访问见 APB。
总结
MDIO/MDC 是 MAC 管理 PHY 的两线半双工总线:Clause22 用 PRE+ST+OP+5 位 PHY 地址+5 位寄存器地址+TA+16 位数据的 32 位帧,写时 MAC 在 TA 驱动 10、读时释放由 PHY 把 TA 拉 0 再送数据;链路/速率/双工从 BMSR(注意 latch-low 要读两次)和自协商结果寄存器获取,Clause45 用「先地址帧设指针再数据帧」访问万兆 PHY 的大寄存器空间——PHY 地址、TA 高阻方向和 latch-low 误读是三大坑。