3. MDIO硬件接口:MDC和MDIO信号,电气特性与上拉电阻
硬件接口是MDIO调试的基石。你协议写得再漂亮,信号如果不过关,一切都白搭。我刚入行那会儿就在这上面吃过亏——通信时好时坏,查了三天,最后发现是MDC的上升沿太慢。嗯,咱们先把这个基础打牢。
3.1 MDC和MDIO信号长什么样?
MDC(Management Data Clock)是时钟信号,由主设备(MAC/CPU)驱动。频率通常为2.5MHz,也可以更低。MDIO(Management Data Input/Output)是双向数据线,时序上对齐MDC的上升沿采样。
我习惯把MDC想象成一个节拍器,MDIO就是跟着节拍跳舞的舞者。每个MDC周期传输1bit,先发32个0做前导码(Preamble),然后是起始码(ST)、操作码(OP)、PHY地址(PHYAD)、寄存器地址(REGAD)、转弯位(TA)和数据(DATA)。这些协议细节下一章详细讲,今天只看信号本身。
- MDC:单方向(主→从),推挽输出,50%占空比。
- MDIO:双向(主↔从),开漏/推挽(取决于驱动模式),需要上拉电阻维持高电平空闲。
实际项目中,我见过有人把MDC和MDIO直接接到FPGA的普通GPIO上,结果通信速率只能跑到几百kHz——因为GPIO的上升时间太长。后来改用专用的MDC I/O,频率才稳定到2.5MHz。
3.2 电气特性参数
IEEE 802.3 Clause 22/45对MDIO接口的电气特性有明确定义。我归纳成一张表,调试时对照着查很方便。
| 参数 | 最小值 | 典型值 | 最大值 | 单位 |
|---|---|---|---|---|
| MDC频率 | - | 2.5 | 根据器件 | MHz |
| MDC高电平(VIH) | 2.0 | 3.3/1.8 | VDD+0.3 | V |
| MDC低电平(VIL) | -0.3 | 0 | 0.8 | V |
| MDIO输入阈值 | 2.0(高)/0.8(低) | - | - | V |
| MDIO上升时间 | - | 5 | 20 | ns |
| MDIO下降时间 | - | 5 | 20 | ns |
| 上拉电阻(推荐) | 1.5 | 4.7 | 10 | kΩ |
为什么会限定上升时间?因为MDC的采样沿是上升沿,MDIO必须在MDC上升沿之前稳定。如果MDIO变化太慢,很可能被采样到不稳定的值。说白了,就是建立时间(Setup time)和保持时间(Hold time)的要求。多数PHY要求MDIO的建立时间不小于10ns,保持时间不小于10ns。
3.3 上拉电阻的选择与坑
上拉电阻是MDIO接口的灵魂。MDIO在空闲时是高电平,靠上拉电阻把总线拉高。当主设备或从设备需要驱动低电平时,会主动拉低。这就意味着上拉电阻不能太大(否则拉不低),也不能太小(否则驱动电流太大)。
- 电阻值太小(<1.5kΩ):空闲时电流很大,主设备驱动低电平时需要吸电流,可能超出IOL能力,导致低电平抬升。我遇到过一块板子,上拉用了1kΩ,结果MDIO低电平测出来1.2V——PHY怎么都不认。
- 电阻值太大(>10kΩ):上升时间变长,总线噪声容限下降。特别是多个PHY挂在同一MDIO总线上时,总电容增大,上拉电阻必须相应减小。
- 推荐值4.7kΩ:这是一个平衡点,适用于大多数3.3V系统。如果是1.8V系统,我建议用2.2kΩ,因为电压低,同样电阻下驱动电流更小。
上拉电阻还有一个容易被忽略的作用:减少反射。MDIO走线如果过长,阻抗不匹配会产生振铃。上拉电阻配合线路特性阻抗,可以起到终接效果。当然,这不是精确的阻抗匹配,聊胜于无。
3.4 物理层连接示意
下面这张图展示了典型的MDIO物理接口连接。主设备(MCU/FPGA)通过MDC和MDIO与PHY相连,MDIO线上拉至VDD。注意上拉电阻应靠近主设备侧,或者靠近总线中间位置。
3.5 调试时的检查清单
每次碰到MDIO不通,我都会按这个清单排查硬件问题。你也可把它贴在实验台前。
- ☐ 示波器测量MDC频率:是否在目标值附近(2.5MHz ± 20%)?
- ☐ MDC波形:上升沿是否陡峭(<10ns)?有无振铃或台阶?
- ☐ MDIO空闲电平:是否为高(接近VDD)?低电平是否低于0.8V?
- ☐ 上拉电阻:实测值是否与设计一致?焊接是否虚焊?
- ☐ 线路长度:MDC/MDIO走线是否超过30cm?短线是否紧邻时钟线?
- ☐ 终端匹配:如果总线上有多个PHY,是否需要降低上拉电阻?