MDIO物理层接口:引脚定义、电气特性、总线拓扑
聊到MDIO总线,很多人第一反应是“两根线嘛,简单”。嗯,确实只有两根线——MDC(时钟)和MDIO(数据)。但这两根线的物理层处理不好,调试起来能让你怀疑人生。我早期做交换板项目时,就因为MDIO上拉电阻选错,导致三颗PHY里有两颗间歇性读回全0,查了整整两天。后来才发现问题出在物理层上。
引脚定义
先看标准定义。MDIO接口源自IEEE 802.3 Clause 22(后来扩展到Clause 45)。两根信号线分别是:
- MDC(Management Data Clock)—— 由主设备驱动,提供同步时钟。频率通常为2.5 MHz,Clause 45支持更高频率。
- MDIO(Management Data Input/Output)—— 双向数据线。主设备驱动输出时写寄存器,PHY驱动输出时读寄存器。
引脚命名在不同厂家的芯片上可能略有出入,比如有的叫MCD/MDIO,有的叫MDC/MDIO_SDA,但功能完全一致。我习惯在设计原理图时标成MASTER_MDC和MASTER_MDIO,清晰一点。
电气特性
电气参数,是很多人容易忽略的地方。你想想,两根线要跨板卡通过连接器走几十厘米,还要挂三四个PHY,信号质量必须管住。
| 参数 | IEEE 802.3要求 | 推荐设计值 | 说明 |
|---|---|---|---|
| VIH(输入高电平) | ≥ 2.0 V | 3.3V/2.5V电平兼容 | 常用1.8V系统需电平转换 |
| VIL(输入低电平) | ≤ 0.8 V | 保证噪声容限 | 别用直连1.2V IO |
| VOH(输出高电平) | ≥ 2.4 V(@2mA) | 推挽输出 | 上拉到电源电平 |
| VOL(输出低电平) | ≤ 0.4 V(@2mA) | 足够驱动接收 | 考虑多设备扇出 |
| 输出驱动电流 | ≥ 2 mA | 推荐4~8 mA | 长线时需要更大驱动 |
| 输入电容 | ≤ 10 pF | 实际5~8 pF | 每个PHY会增加总容性负载 |
| 上拉电阻 | 无明确要求 | 1.5 kΩ ~ 4.7 kΩ | 取决于走线长度和负载数 |
曾经踩过的坑: 我在一个4口交换机上,用了2.2 kΩ上拉到3.3V,结果MDIO信号在靠近主控端过冲接近1V,差点把MAC芯片的IO引脚打坏。后来换成3.3 kΩ加串联电阻,波形才干净。
总线拓扑
MDIO总线最常见的拓扑是多设备并联。也就是说,所有从设备(PHY)的MDIO引脚直接连在一起,MDC也直接连在一起,主设备(MAC/CPU/FPGA)驱动时钟并控制数据传输。
但具体怎么布局?两种主流方式——
- 单点扇出(星型):主设备到每个PHY的走线长度尽量一致,适用于PCB空间富余时。我一般推荐用这种,信号质量最好控制。
- 菊花链(总线形式):走线从主设备出发,依次经过PHY1→PHY2→PHY3。注意最后要加终端匹配(串联电阻到地)。这种省PCB面积,但要注意分支stub不能太长。
不管是哪一种,都必须在靠近主设备端添加一个上拉电阻——通常放在MDIO线上,阻值选3.3 kΩ居多。有些设计会在MDC上再加一个小电阻(22 Ω ~ 33 Ω)用于阻尼振铃。
个人习惯: 我会在原理图阶段就把MDIO的上拉电阻设计成可调节的——放两个焊盘,一个贴2.2 kΩ,一个贴4.7 kΩ。调试时根据信号质量选一个。省得打样回来再飞电阻。
布局与布线注意事项
讲完拓扑,聊聊实际PCB要注意的几个点——这些是我从四五个板子里总结出来的教训。
- 走线长度控制:MDC走线总长尽量不超过10cm。超过这个长度,信号边沿会变缓,时序裕量下降。尤其MDC频率用到5 MHz以上时。
- 避免长stub:每个PHY从主干分出去的那段MDIO线(stub)最好控制在20 mm以内。否则反射会造成数据眼图闭合。我曾经在一个8口汇聚板上,其中一颗PHY的stub走了60 mm,结果死活读不到ID。
- 电源去耦:MDIO的VDD引脚(如果PHY有独立I/O电源)必须就近放0.1 μF瓷片电容。否则信号边沿引起的电流抖动会把噪声耦合进去。
- 地平面完整性:MDIO和MDC最好走在同一层,相邻层要有完整地平面。别跨分割,否则回流路径一绕,串扰就来了。
实测建议: 板子回来后,先挂示波器看MDC和MDIO波形。重点关注MDIO在写操作时的上升沿和读操作时的转换时刻。如果看到台阶或过冲,优先调上拉电阻值(往大调)或加串联阻尼电阻。
总结
MDIO物理层看着简单,实际上很多奇怪问题都出在这里。记住几个关键点:上拉电阻别瞎选、走线长度管住、分支stub越短越好。按照上面说的拓扑和电气要求做,基本不会出什么妖蛾子。我自己的项目里,只要物理层布局规整,后面的驱动调试基本一次过。