MDIO总线电气特性与时序要求

咱们做嵌入式硬件,天天跟PHY芯片打交道。MDIO总线看着就两根线——MDC和MDIO,可别小看它。电气特性没搞对,时序没卡准,寄存器读回来全是乱码。我刚开始调PHY那会儿,就因为上拉电阻没算好,折腾了两天。今天我把这块硬骨头嚼碎了喂给你。

电气特性参数

MDIO总线是双向半双工结构。MDC是时钟,由主控(比如MAC或CPU)驱动;MDIO是数据线,双向漏极开路或三态。标准电气参数如下表:

参数最小值典型值最大值单位
输入低电平 (VIL)–0.3—0.8V
输入高电平 (VIH)2.0—VDD+0.3V
输出低电平 (VOL) @ IOL=4mA—0.40.6V
输出高电平 (VOH) @ IOH=–4mA2.4VDD–0.4—V
上拉电阻 (RPU)1.52.210kΩ
负载电容 (CLOAD)——150pF
上升/下降时间—10100ns
我曾经踩过的坑: 某次项目用了1kΩ上拉,结果驱动电流太大,PHY端的IO口直接烧了。后来查手册发现有些PHY的MDIO脚过流能力只有±8mA。上拉电阻宁大勿小,2.2kΩ是个安全起点。

MDIO总线靠上拉电阻维持高电平。主控和从机(PHY)都是开漏或三态输出。谁要发数据,谁就拉低或释放。电气连接上,MDC和MDIO最好分别接一个小电容到地(10pF左右),滤掉高频噪声。我习惯在靠近PHY侧加RC滤波,R=22Ω,C=33pF,波形干净很多。

时序要求

MDC时钟频率上限,标准里写的是2.5MHz。有些PHY支持12.5MHz(高速模式),但那是非标准扩展。我建议你按2.5MHz设计,兼容性最好。
为什么是2.5MHz?因为MDIO帧有64个时钟周期(读操作),2.5MHz下读完一个寄存器只需25.6μs,够快了。再快的话,太长线缆反射、信号完整性都难搞。

关键时序参数:
  • MDC周期:≥400ns(2.5MHz)
  • MDC高电平/低电平宽度:≥160ns
  • MDIO相对于MDC上升沿的建立时间:≥10ns
  • MDIO相对于MDC上升沿的保持时间:≥10ns
  • MDIO在MDC下降沿之后切换数据;主控在MDC上升沿采样

说白了,你的MCU或者FPGA如果GPIO翻转速度不够快,就别硬上高速。我见过有人用GPIO软件模拟MDIO,结果因为中断响应慢,时序跑偏,读回来的寄存器值一阵一阵对。这种场景下,还是老老实实用硬件MAC内置的MDC时钟。

MDIO读写帧结构

先看一个完整的读操作帧,包含32个位:

  • Preamble(前导码): 32个连续“1”,让PHY同步。
  • Start(起始): 2个位 —— 01。
  • OP Code(操作码): 2个位 —— 读为10,写为01。
  • PHY Address(PHY地址): 5个位,范围0~31。通常PHY地址由外部引脚决定,比如RTL8211的地址是00100。
  • Register Address(寄存器地址): 5个位,例如寄存器0是00000(基本控制寄存器)。
  • Turn Around(转向时间): 2个位 —— 读操作时,前1位是高阻(Z),后1位是PHY驱动数据;写操作时,主控连续发10。
  • Data(数据): 16个位,寄存器值。

下面这张时序图帮你把整个流程串起来:

MDIO 读寄存器帧时序 (IEEE 802.3 标准) MDC MDIO Start OP PHY Addr Reg Addr TA Data 前导码32个"1" 说明:MDC上升沿采样;MDIO在MDC下降沿之后变化。 主控在TA第一个位释放总线,PHY在第二个位开始驱动数据。
小技巧: 逻辑分析仪抓MDIO信号时,最好把MDC也一起抓。看上升沿对齐MDIO的电平。我调试时不看协议解析,直接看原始波形,一眼就能看出建立时间够不够。

实际设计中的注意事项

  • 上拉电阻选择: 2.2kΩ是黄金值。如果总线挂载多个PHY,适当减小电阻(比如1.5kΩ)以保证上升沿够快。但别低于1kΩ,否则驱动电流超标。
  • 线长与反射: MDC信号走线尽量短于5cm。超过10cm建议串接33Ω电阻做源端端接。我有个项目MDC走了15cm,结果上升沿出现振铃,后来在靠近主控端加22Ω串联电阻才解决。
  • 电平兼容: 主控是1.8V,PHY是3.3V?不行!必须加电平转换。MDIO和MDC都是双向漏极开路,用N沟道MOSFET双向电平转换器,或者直接选择支持多电平的PHY(如某些型号自带1.8V容忍)。
  • 噪声抑制: 建议在MDC和MDIO上分别对地接10pF~100pF电容。电容太大影响边沿速率,太小没效果。我一般用22pF。
再一次血的教训: 有一次我把MDIO和MDC并在一起走,以为都是信号线无所谓。结果串扰严重,读寄存器10次有3次CRC校验错误。从那以后我都把这两根线分开走,中间加地线隔离。

嗯,电气特性和时序这块其实不难,关键是一个个细节别放过。调PHY就跟谈恋爱一样——你得读懂它的时序脾气,它才会乖乖听你话。你把这些参数记牢,下次布板子的时候手就不会抖了。