第1章:MDIO协议简介
1.1 什么是MDIO?它从哪里来?
做嵌入式这些年,我调试过不少网络设备。很多人一上来就问我:“MDIO到底是个啥?”
其实,MDIO的全称是Management Data Input/Output,中文叫“管理数据输入输出接口”。它是个串行总线,专门用来管理以太网PHY芯片的。
嗯,这里要注意——它不是用来传网络数据的。它干的是“管家”的活儿。什么寄存器配置、速率协商、链路状态监控,全靠它。
它的历史也很有意思。我记得最早是IEEE 802.3标准里定义的,具体来说是第22条。那时候网络设备少,PHY芯片功能也不多。后来设备越来越复杂,又出了第45条标准,支持更大的寄存器空间。说白了,MDIO是在一路升级的。
| 标准版本 | 发布时间 | 主要特点 |
|---|---|---|
| IEEE 802.3 Clause 22 | 1998年 | 支持32个PHY,寄存器空间16位 |
| IEEE 802.3 Clause 45 | 2000年以后 | 支持更大地址空间,更灵活 |
1.2 它用在哪里?
你想想看,只要涉及以太网的硬件,基本都要和MDIO打交道。我在项目中见过最典型的场景有这么几类:
- 交换机设备:CPU通过MDIO管理多个PHY口,比如配置速率、双工模式
- 路由器/网关:需要读取PHY的链路状态,判断网线是否插好
- 嵌入式开发板:很多板载网卡芯片(像LAN8720、KSZ8081)都用MDIO
- 工业以太网:远程监控PHY健康状况,做故障诊断
核心观点:MDIO是PHY芯片的“控制面板”。没有它,你连PHY的寄存器门都摸不到。
1.3 和I2C、SPI比,它有什么不一样?
说实话,我刚开始做硬件时也容易弄混。这几条总线长得有点像,都是串行的。但它们的设计目标完全不同。
下面这张表是我自己总结的,你一看就明白:
| 对比项 | MDIO | I2C | SPI |
|---|---|---|---|
| 信号线数量 | 2根(MDC+MDIO) | 2根(SCL+SDA) | 3~4根(SCK+MOSI+MISO+CS) |
| 最大从设备数量 | 32个 | 理论上127个 | 理论上无限(靠片选) |
| 通信速度 | 最高约2.5MHz | 标准400kHz,快速1MHz | 可达几十MHz |
| 数据帧格式 | 固定45位/64位 | 灵活,起始+地址+读写位+数据 | 自由度高,主控定义 |
| 主要应用场景 | 以太网PHY管理 | 传感器、EEPROM、小范围控制 | 高速数据采集、显示、存储 |
这里我多说一句——你可能会问,既然I2C也是两线,为什么不用它管PHY?
原因很简单:专一性。MDIO协议是为管理PHY量身定做的,它的帧结构里直接包含了PHY地址、寄存器地址、读写操作位。I2C虽然通用,但协议状态机复杂,而且没有专门针对PHY管理的功能特性。
我个人习惯是:如果只管理PHY,不用I2C。多一事不如少一事。
经验之谈:SPI虽然速度快,但片选线多了占GPIO。我做过一个8口交换机,如果用SPI管8个PHY,片选线就得8根,除非用译码器。用MDIO的话,共享两根线就行,省事得多。
1.4 它到底长什么样?
为了让你更直观地理解,我画了一张图。它展示了MDIO在系统中的位置和连接关系。
图中你可以看到:MDC和MDIO两根线是共享的,所有PHY都挂在同一总线上。主控通过发送特定的帧格式,带上目标PHY的地址,来完成读写操作。这个帧格式,就是我们后面章节要讲的重点。
注意:我曾经吃过一个亏——PHY地址配置冲突。两个PHY设成了同一个地址,结果读回来的数据完全混乱。后来我学乖了,每次做完硬件都先核对一下PHY地址,用示波器确认总线信号是否对。
1.5 小结一下
MDIO这个协议,虽然功能专一,但确实是嵌入式网络开发者的基本功。你想想看,不搞定PHY管理,网口的速率模式都不对,还谈什么数据传输?
这一章我们认识了MDIO是什么、用在哪里、和I2C/SPI比有什么特点。核心就一句话:MDIO是专门为管理以太网PHY芯片设计的串行总线。