2、MDIO物理层:电气特性、时钟、数据线、上拉电阻
MDIO 通信看着简单,就两根线:一根时钟 MDC,一根数据 MDIO。但我在项目中见过太多“软件调了半天,最后发现是物理层没搞对”的案例。说白了,物理层是地基,地基不稳,上层协议再完美也白搭。这一章我就把物理层那点门道掰开揉碎了讲。
2.1 电气特性——不只是电平那么简单
MDIO 接口的电气规范直接继承自 IEEE 802.3 标准。你想想看,一个 PHY 芯片可能工作在 3.3V,另一个可能是 1.8V,甚至现在的设备还有 1.2V 的 I/O 电压。电平不匹配,信号过不去,通信必然失败。
- 标准电平:MDC 和 MDIO 都是 CMOS 电平,高电平最低要求 2.0V(3.3V 系统),低电平最高 0.8V。注意这个阈值是“接收端”看的,发送端要保证驱动能力够。
- 驱动能力:我记得有一次调试,主控 GPIO 直接拉 MDIO,结果带不动两个 PHY。标准要求 MDIO 驱动至少能提供 4 mA 电流,实际项目中我建议留 6~8 mA 余量。
- 容性负载:每根线的总电容建议不超过 50 pF。具体可以这么算:PCB 走线电容约 1 pF/cm,加上每个 PHY 的引脚电容 5~10 pF。走线长了,上升沿就变缓,时序窗口就被吃掉。
2.2 MDC 时钟——别小看这根线
MDC 时钟由主控(MAC/CPU)提供,频率一般是 2.5 MHz 或 12.5 MHz,但实际可以用到 25 MHz(取决于 PHY 支持)。时钟频率越高,读写越快,但物理层压力也越大。
| 参数 | 2.5 MHz 模式 | 12.5 MHz 模式 |
|---|---|---|
| 周期 | 400 ns | 80 ns |
| 高电平最小宽度 | 160 ns | 32 ns |
| 低电平最小宽度 | 160 ns | 32 ns |
| 上升/下降时间 | ≤ 50 ns | ≤ 10 ns |
为什么要给你看这个表格?因为 MDIO 是同步协议,MDC 的占空比直接影响数据采样窗口。标准要求占空比在 40%~60% 之间,我习惯让主控输出 50% 占空比,最安全。
嗯,这里要注意:MDC 信号不要过长分支。如果你挂多个 PHY,MDC 走线最好用“菊花链”拓扑,而不是星形。星形分叉会导致反射,时钟边沿抖动。我吃过这个亏:一块板子上挂了 4 个 PHY,MDC 走成星形,结果远端两个 PHY 有时候读错寄存器。后来改成一串链过去,问题消失。
2.3 MDIO 数据线——双向传输的默契
MDIO 是一根双向数据线,这种设计省引脚,但增加了时序复杂度。它是三态总线,平时靠上拉电阻维持高电平,主控或从设备驱动低电平时拉低,释放时回到高电平。
- 数据方向切换:每个读写操作,MDIO 会有一次方向切换(写操作:主控一直驱动;读操作:主控发地址/控制后转成输入,从设备驱动数据)。切换时刻必须留出至少一个 MDC 周期的“转向间隙”。我习惯在切换前先释放总线,等一个时钟周期后再驱动。
- 信号完整性:MDIO 上的过冲/下冲不要超过 0.5V(3.3V 系统)。我曾经在一个高密度背板上,MDIO 走线长达 15 cm,末端反射严重,下冲到了 1V,直接导致 PHY 把“1”采样成“0”。后来加了个 33Ω 串联电阻,效果立竿见影。
2.4 上拉电阻——小元件大作用
MDIO 总线必须配上拉电阻,这个电阻决定总线空闲电平、上升时间和抗干扰能力。电阻值不能乱选,得算。
标准推荐上拉电阻范围 1.5 kΩ ~ 10 kΩ。我常用的值是 4.7 kΩ,兼容大多数场景。选值依据:
- 上升时间:R × C ≤ 1/10 的 MDC 周期(保守)。比如 2.5 MHz 周期 400 ns,RC 要 ≤ 40 ns。电容 50 pF,则 R ≤ 800 Ω。但 800 Ω 的上拉电流太大(3.3V 时约 4 mA),很多主控吃不消。
- 功耗与驱动权衡:所以实际平衡下来,2.2 kΩ ~ 4.7 kΩ 最常见。我试过 10 kΩ,在长走线 + 多 PHY 时上升沿太慢,读取时序出错。
- 位置:上拉电阻要靠近主控端放置,不要放在总线的远端。很多新手把电阻放到最后一个 PHY 旁边,结果总线空闲时主控侧电平被远端拉高,波形被反射弄坏。
- 上拉电阻接 MDIO 线,不要接 MDC 线(MDC 是纯输出,不需要上拉)。
- 如果主控内置上拉,实测启用了还要确认阻值是否合适。我碰到过内置 50 kΩ 上拉,根本带不动总线。
- 多从设备时,总线上只放一个上拉电阻,不要每个 PHY 引脚都加,并联后等效电阻会偏小,导致上升沿过冲。
MDIO 物理层结构概览
下面这张图帮你快速理清 MDIO 物理层的关键要素和信号流向: