MDIO总线电气特性与时序要求
咱们做嵌入式硬件,天天跟PHY芯片打交道。MDIO总线看着就两根线——MDC和MDIO,可别小看它。电气特性没搞对,时序没卡准,寄存器读回来全是乱码。我刚开始调PHY那会儿,就因为上拉电阻没算好,折腾了两天。今天我把这块硬骨头嚼碎了喂给你。
电气特性参数
MDIO总线是双向半双工结构。MDC是时钟,由主控(比如MAC或CPU)驱动;MDIO是数据线,双向漏极开路或三态。标准电气参数如下表:
| 参数 | 最小值 | 典型值 | 最大值 | 单位 |
|---|---|---|---|---|
| 输入低电平 (VIL) | –0.3 | — | 0.8 | V |
| 输入高电平 (VIH) | 2.0 | — | VDD+0.3 | V |
| 输出低电平 (VOL) @ IOL=4mA | — | 0.4 | 0.6 | V |
| 输出高电平 (VOH) @ IOH=–4mA | 2.4 | VDD–0.4 | — | V |
| 上拉电阻 (RPU) | 1.5 | 2.2 | 10 | kΩ |
| 负载电容 (CLOAD) | — | — | 150 | pF |
| 上升/下降时间 | — | 10 | 100 | ns |
我曾经踩过的坑: 某次项目用了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信号时,最好把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就跟谈恋爱一样——你得读懂它的时序脾气,它才会乖乖听你话。你把这些参数记牢,下次布板子的时候手就不会抖了。