第 2 章 MDIO 硬件接口:引脚定义与时序要求
搞 MDIO 调试的第一步,不是抄代码,是先把物理层接口吃透。我见过不少工程师,上来就调驱动,结果示波器一挂,时钟和数据对不上——白忙活半天。这一章我们就从引脚定义和时序规矩入手,把硬件底子打牢。
2.1 引脚定义:就两根线
MDIO 总线就两根信号线,真的不能再简单了。但我还是要啰嗦一句:简单不等于随便。
| 信号 | 方向 | 说明 |
|---|---|---|
| MDC | 管理设备 → 被管理设备 | 时钟,由 MAC 或 MDIO 控制器输出 |
| MDIO | 双向 | 数据线,需外部上拉电阻(典型 1.5 kΩ~10 kΩ) |
关键点: MDIO 是开漏/开集电极结构,必须加上拉。否则空闲时高阻态,帧起始判断会出错。
我记得有一次帮客户调板子,MDIO 通信偶尔丢帧。查了半天,发现原理图上拉电阻画了但实际没焊。焊上 4.7 kΩ 后,一切正常。所以别小看这个电阻。
上拉电阻怎么选?
- 总线负载少(1~2 个 PHY):4.7 kΩ~10 kΩ。
- 总线负载多(5 个以上):1.5 kΩ~2.2 kΩ,保证上升沿够快。
我的习惯: 原型阶段直接焊 3.3 kΩ,兼容大多数场景。量产前根据实际 PHY 数量和走线长度再调整。
2.2 时序要求:别踩这些坑
MDIO 的时序其实挺宽容的,但一旦踩到边界,调试起来很头疼。我们先看标准要求,再说实战。
时钟 MDC
- 最高频率:IEEE 802.3 定义不超过 2.5 MHz。实际很多器件支持到 25 MHz(非标模式)。
- 占空比:40%~60%,最好 50%。
- 注意事项:MDC 信号要干净,毛刺会直接导致移位错误。
你想想看,2.5 MHz 的时钟周期是 400 ns。对硬件来说太慢,但正因如此,很多 FPGA 里的 MDIO 控制器直接用系统时钟分频,分频比设不对就容易出问题。
数据 MDIO 时序参数
| 参数 | 最小值 | 典型值 | 说明 |
|---|---|---|---|
| tsu (数据建立时间) | 10 ns | — | MDC 上升沿前数据必须稳定 |
| th (数据保持时间) | 10 ns | — | MDC 上升沿后数据保持 |
| tp (传播延迟) | — | — | 取决于总线上拉、负载电容 |
踩坑预警: 我曾经在一款 PHY(TI 的 DP83826)上遇到读回全 0 的故障。示波器一看,MDC 上升沿刚过,MDIO 数据还在跳变。原因是 PHY 输出延迟偏大,而控制器采样窗口太窄。最后的解决办法是把 MDC 频率从 2.5 MHz 降到 1.25 MHz,留出足够 setup 时间。
帧格式复习
每一帧 32 位:
- Preamble:32 个连续的 1
- Start:01
- OP code:10(读)/ 01(写)
- PHY address(5 bit)+ Register address(5 bit)
- Turnaround:Z0(读)/ 10(写)
- Data:16 位
嗯,这里要注意:读操作时,Turnaround 的第一个位是“高阻”(Z),由 PHY 释放总线;第二个位是“0”,由 PHY 驱动。如果上拉电阻没了,这个 Z 位就会拉低,整个帧直接废掉。
2.3 一张图看懂时序与连接
下面这张 SVG 把 MDIO 系统的物理连接和时序关键节点画在一起,方便你对照调试。
看图提示: 左边是控制器,右边是 PHY。MDC 是单方向,MDIO 是双向且需要上拉电阻。时序窗口重点看 MDC 上升沿前后各 10 ns 的数据稳定性。
2.4 避坑实战清单
- 上拉脱落: 我发誓,每一个 MDIO 调试案例里至少有 30% 是上拉问题。别修代码,先量电压。
- 时钟悬空: 如果 MDC 被误设为输入或 Hi‑Z,PHY 根本不会响应。
- 速率太高: 试过 10 MHz 吗?很多 PHY 能工作但时序余量极小,温度一高就出错。
- 帧间隔不够: 连续读写之间至少留 1 个时钟周期的空闲。有些 FPGA 实现会连续发帧,导致 PHY 内部状态机错乱。
曾经我翻车的一次经历: 调试一个 4 口交换机,MDIO 总线挂载了 5 个 PHY。用了很细的 PCB 走线,没铺地屏蔽。结果 MDIO 上的反射噪声让其中一个 PHY 的读数据总是错一位。解决方案:把上拉从 10 kΩ 换成 2.2 kΩ,并调整了 MDC 的 slew rate。问题秒解。
2.5 调试小工具:用示波器抓 MDIO
我习惯把示波器探头挂到 MDC 和 MDIO 上,直接看帧头。抓一次写操作就够判断硬件是否正常。
# 伪代码示意:发一个写操作(写 0x0010 到 PHY 地址 0x01 的寄存器 0x0F)
preamble: 0xFFFF_FFFF
start: 0b01
op code: 0b01 (写)
phy addr: 0b00001
reg addr: 0b01111
turn: 0b10
data: 0x0010
示波器上应该看到 32 个 MDC 时钟,MDIO 上先出现 32 个高电平(preamble),然后 01 等等。如果 preamble 里出现低电平,说明上拉或空闲状态有问题。