3. MDIO硬件接口:MDC和MDIO信号,电气特性与上拉电阻

硬件接口是MDIO调试的基石。你协议写得再漂亮,信号如果不过关,一切都白搭。我刚入行那会儿就在这上面吃过亏——通信时好时坏,查了三天,最后发现是MDC的上升沿太慢。嗯,咱们先把这个基础打牢。

一句话总结本章:MDC提供时序基准,MDIO承载数据,上拉电阻决定总线空闲状态与驱动能力——这三个参数搞定了,物理层至少不会掉链子。

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.03.3/1.8VDD+0.3V
MDC低电平(VIL)-0.300.8V
MDIO输入阈值2.0(高)/0.8(低)--V
MDIO上升时间-520ns
MDIO下降时间-520ns
上拉电阻(推荐)1.54.710kΩ
注意:MDIO的上升/下降时间如果超过20ns,很可能导致采样错误。我曾经用长线缆(超过30cm)连接PHY,发现MDIO边沿变缓,通信误码率直线上升。办法是在靠近PHY侧加一个74LVC1G07缓冲器。

为什么会限定上升时间?因为MDC的采样沿是上升沿,MDIO必须在MDC上升沿之前稳定。如果MDIO变化太慢,很可能被采样到不稳定的值。说白了,就是建立时间(Setup time)和保持时间(Hold time)的要求。多数PHY要求MDIO的建立时间不小于10ns,保持时间不小于10ns。

3.3 上拉电阻的选择与坑

上拉电阻是MDIO接口的灵魂。MDIO在空闲时是高电平,靠上拉电阻把总线拉高。当主设备或从设备需要驱动低电平时,会主动拉低。这就意味着上拉电阻不能太大(否则拉不低),也不能太小(否则驱动电流太大)。

  1. 电阻值太小(<1.5kΩ):空闲时电流很大,主设备驱动低电平时需要吸电流,可能超出IOL能力,导致低电平抬升。我遇到过一块板子,上拉用了1kΩ,结果MDIO低电平测出来1.2V——PHY怎么都不认。
  2. 电阻值太大(>10kΩ):上升时间变长,总线噪声容限下降。特别是多个PHY挂在同一MDIO总线上时,总电容增大,上拉电阻必须相应减小。
  3. 推荐值4.7kΩ:这是一个平衡点,适用于大多数3.3V系统。如果是1.8V系统,我建议用2.2kΩ,因为电压低,同样电阻下驱动电流更小。
实战经验:有一次调试交换机的MDIO,带了8个PHY。按照手册推荐4.7kΩ,结果MDIO波形像锯齿一样。算了算总电容:每个PHY约10pF,走线10pF,总电容约90pF。上拉电阻4.7kΩ时的时间常数τ = 4.7kΩ × 90pF ≈ 423ns,上升沿0~70%需要约τ,远大于20ns要求。后来改成1.5kΩ,波形才正常。

上拉电阻还有一个容易被忽略的作用:减少反射。MDIO走线如果过长,阻抗不匹配会产生振铃。上拉电阻配合线路特性阻抗,可以起到终接效果。当然,这不是精确的阻抗匹配,聊胜于无。

3.4 物理层连接示意

下面这张图展示了典型的MDIO物理接口连接。主设备(MCU/FPGA)通过MDC和MDIO与PHY相连,MDIO线上拉至VDD。注意上拉电阻应靠近主设备侧,或者靠近总线中间位置。

MDIO物理接口连接示意 主设备 (MCU/FPGA) 从设备 (PHY) MDC MDIO (双向) Rₚ VDD (3.3V / 1.8V) 上拉电阻靠近主设备侧 推荐值4.7kΩ (3.3V系统)

3.5 调试时的检查清单

每次碰到MDIO不通,我都会按这个清单排查硬件问题。你也可把它贴在实验台前。

  • ☐ 示波器测量MDC频率:是否在目标值附近(2.5MHz ± 20%)?
  • ☐ MDC波形:上升沿是否陡峭(<10ns)?有无振铃或台阶?
  • ☐ MDIO空闲电平:是否为高(接近VDD)?低电平是否低于0.8V?
  • ☐ 上拉电阻:实测值是否与设计一致?焊接是否虚焊?
  • ☐ 线路长度:MDC/MDIO走线是否超过30cm?短线是否紧邻时钟线?
  • ☐ 终端匹配:如果总线上有多个PHY,是否需要降低上拉电阻?
小技巧:在PHY侧加一个小电容(10pF左右)到GND,可以帮助滤除高频噪声,但会稍微增加上升时间。具体要不要加,看你的板子噪声情况。我一般在调试阶段预留焊盘,必要时再焊上。