MDIO硬件接口:引脚定义、电路设计要点、上拉电阻
硬件接口这玩意儿,看着简单,踩坑的人可不少。MDIO就两根线,MDC(时钟)和MDIO(数据),但要是电路设计没想清楚,时序乱飘、读回0xFF都是家常便饭。这章我们掰开聊聊这些细节。
1. 引脚定义——两根线能出什么幺蛾子?
MDIO总线一共两个信号,标准里写得清清楚楚,但实际项目中我见过有人把MDIO和MDC焊反,调了一整天。所以还是先明确一下:
| 信号 | 方向 | 描述 | 典型电平 |
|---|---|---|---|
| MDC | 主控 → PHY | 时钟信号,由主控驱动 | 2.5V / 3.3V |
| MDIO | 双向 | 数据信号,开漏/开集输出 | 2.5V / 3.3V |
这里注意:MDIO是双向开漏信号,不输出的时候靠外部上拉保持高电平。MDC是推挽输出,不用上拉。我之前在一个项目里把MDIO当成推挽去设计,结果多挂一个PHY就拉不起来了,尴尬。
2. 电路设计要点——别让信号坏在PCB上
很多工程师觉得就两根线,随便拉一下就行。但高速开关的时候,寄生参数会要你命。
- 驱动能力:主控的IO口要能驱动总线上所有PHY的输入电容。我一般留至少50%的余量,比如主控标称驱动8mA,实际负载不要超过4mA。
- 电平匹配:主控和PHY如果电平不同,需要加电平转换。最简单的是用分立MOS管搭建双向电平转换电路,或者选带电平容限的芯片。
- 走线长度:MDIO时钟通常几MHz到几十MHz,走线超过10cm建议加33Ω串联电阻,抑制振铃。我记得有一次调试板上MDC线走到15cm才想起来,结果上升沿过冲严重,读寄存器总超时。
- 端接:MDC末端可以不加端接,因为主控本身推挽输出;但MDIO总线末端最好留一个上拉电阻位置,方便调试时微调。
3. 上拉电阻——数值不是拍脑袋定的
为什么MDIO需要上拉?因为它是开漏输出,高电平完全靠外部电阻拉上去。电阻太小,功耗大且拉低时电流大;电阻太大,上升时间变长,时钟高电平期间数据还没稳定,读回来就是错的。
计算公式: 上升时间 ≈ 2.2 × R × C_total。C_total包括所有PHY输入电容、PCB寄生电容。比如总电容30pF,想要上升时间<50ns(假设MDC周期200ns),那么R < 50ns / (2.2 × 30pF) ≈ 758Ω。但还要考虑主控拉低时的电流:比如3.3V / 758Ω ≈ 4.3mA,很多IO口能承受。实际常用1kΩ~4.7kΩ。
下面这个表格是我在实验室测过的典型数据,供你参考:
| 上拉电阻值 | 上升时间(30pF负载) | 拉低电流(3.3V) | 适用场景 |
|---|---|---|---|
| 1kΩ | ≈66ns | 3.3mA | 高速总线(≥25MHz)或带多PHY |
| 2.2kΩ | ≈145ns | 1.5mA | 常见选择,兼顾速度和功耗 |
| 4.7kΩ | ≈310ns | 0.7mA | 低速总线(≤5MHz),低功耗 |
| 10kΩ | ≈660ns | 0.33mA | 极易出问题,一般不推荐 |
4. 电路结构全景图
下面这个图是一套典型的MDIO接口电路,主控通过MDC和MDIO连接两个PHY,上拉电阻靠近总线一侧放置,走线尽量短且等长。
5. 调试时怎么看这些信号?
电路焊好了,上电发现读不到PHY寄存器。别急,先拿示波器看MDC和MDIO。我一般这么查:
- 看MDC有无正常时钟:频率对不对?幅度够不够?特别是有电平转换时,确认接收端波形完整。
- 看MDIO空闲电平:应接近VDD。如果低了,检查上拉电阻是否虚焊或阻值太大。
- 看MDIO读写波形:用示波器单次触发抓MDIO的下降沿,观察32位frame。起始码是不是01?操作码正确吗?
个人习惯: 我会在MDIO线上并联一个5pF(不要太大),用来模拟多挂一个PHY的额外电容。如果这样波形还能接受,那实际量产就没问题。实测比理论计算更靠谱。
说白了,MDIO硬件接口就那么点东西。但就是这两根线,能让你从满脸自信折腾到怀疑人生。上拉电阻值、走线长度、电平匹配——每个点都确认一遍,链路问题至少能排除一半。