第2章 MDIO物理层接口:MDC/MDIO引脚定义、信号时序要求、电气特性
好,咱们直接切入正题。要做MDIO通信,物理层接口是绕不开的第一步。说白了,就是两个引脚:MDC(管理时钟)和MDIO(管理数据)。你想想看,这是MAC和PHY之间的“对话通道”,搞不清楚它俩的脾气,后面调时序skew就是瞎忙活。
2.1 引脚定义与功能
MDC是时钟信号,由主设备(通常是MAC或CPU)驱动。MDIO是双向数据线,默认带上拉电阻。标准规定MDIO必须使用漏极开路或三态输出,这样多个设备才能挂在同一根线上。
- MDC:最高频率一般25MHz(有些老PHY支持12.5MHz),占空比45%~55%。我在一个交换机项目里遇到过MDC被画得太长、过孔太多,导致信号变形,PHY死活读不到正确ID。
- MDIO:双向数据,写操作时主设备驱动,读操作时PHY驱动。空闲时通过上拉电阻保持高电平。
关键事实:MDIO总线最多支持32个PHY设备,每个PHY有唯一的5位地址(通常通过硬件引脚配置)。
2.2 信号时序要求
时序这块我吃过亏,所以多啰嗦几句。MDIO协议基于MDC的上升沿采样数据。标准的时序参数表如下(以25MHz为例):
| 参数 | 符号 | 最小值 | 最大值 | 单位 |
|---|---|---|---|---|
| MDC频率 | f_MDC | 0 | 25 | MHz |
| MDC高电平时间 | t_HIGH | 16 | - | ns |
| MDC低电平时间 | t_LOW | 16 | - | ns |
| MDIO数据建立时间 | t_SU | 10 | - | ns |
| MDIO数据保持时间 | t_HD | 10 | - | ns |
嗯,要注意:MDIO在MDC上升沿之前必须建立稳定,之后还要保持一段时间。我曾经遇到过PHY偶尔返回错误数据,示波器一抓发现是PCB走线导致MDIO相对MDC的skew太大,建立时间不够。
2.3 电气特性
电气参数直接决定了你的PCB要不要加缓冲器、要不要做阻抗匹配。IEEE 802.3标准对MDIO接口的电气特性有明确规定,但实际项目中很多设计都不严格遵循,也能跑。我的建议是:按最差情况设计,留足余量。
- 输出高电平(V_OH):≥ 2.4V @ I_OH = 4mA
- 输出低电平(V_OL):≤ 0.4V @ I_OL = 4mA
- 输入高电平(V_IH):≥ 2.0V
- 输入低电平(V_IL):≤ 0.8V
- 上拉电阻:典型值1.5kΩ ~ 10kΩ,推荐4.7kΩ
- 最大容性负载:每根线不超过50pF(含PCB走线和PHY引脚电容)
注意:如果板子上挂多个PHY,总容性负载会叠加。我曾在一个4口交换机上看到MDIO信号上升沿变成“爬坡”,就是因为没考虑总线电容。解决办法要么降低MDC频率,要么加缓冲器。
2.4 连接拓扑与PCB设计要点
MDC和MDIO都是共享总线,顶层走线要尽量减少分支。我个人的习惯是:MDC走“菊花链”或“星形”拓扑,MDIO走“多点总线”。
- MDC走线:从主设备出发,逐一过每个PHY,末端串一个33Ω或22Ω电阻到地(阻尼反射)。
- MDIO走线:用一条主干线,每个PHY用短分支(< 10mm)接入,分支过长会导致时序紊乱。
- 上拉电阻:一般放在主设备端,阻值选4.7kΩ。如果总线负载重,可以降到2.2kΩ。
- 差分对待:虽然MDC和MDIO不是差分对,但建议它们走在一起,并且用GND包地。
下面这张图展示了我常用的MDIO总线连接结构——说白了就是MAC挂三颗PHY,MDC和MDIO怎么拉线的:
个人技巧:如果MDC线很长(超过10cm),我会在源端串联22Ω电阻抑制过冲。另外,MDIO上拉电阻尽量靠近主设备,我曾试过把上拉放在远端PHY旁边,结果主设备检测高电平的时间延迟了差不多3ns,导致第一个读周期出错。
2.5 波形与测量
调试的时候,示波器很重要。我习惯用高阻抗探头(10×档)测MDC和MDIO,避免负载效应。要看这几个点:
- MDC上升时间 < 5ns(25MHz时)
- MDIO在MDC上升沿前10ns内是否稳定
- MDIO在MDC上升沿后10ns内是否保持
- 空闲时MDIO电压 > 2.5V(良好上拉)
有一次我调一个2.5G PHY,发现读寄存器总是偶尔返回0xFFFF。抓波形后看到MDIO在MDC上升沿建立时间只有6ns,而PHY要求最少10ns。原因是PCB走线太长,容性负载把MDIO的上升沿拖慢了。解决办法是把MDC频率从25MHz降到12.5MHz,毛病立刻消失。
警告:千万不要在测量MDIO时用长地线夹子,那个电感会引入振铃,让你误以为信号有问题。用弹簧地线或者同轴探针,数据更可靠。