第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在系统中的位置和连接关系。

MDIO系统架构与连接关系 MAC / 控制器 (发起读写) MDIO控制器 (总线主控) MDC时钟线 MDIO数据线 PHY #0 地址: 0x00 PHY #1 地址: 0x01 PHY #... 地址: 0x?? PHY #31 地址: 0x1F 说明 MDC是时钟线,由主控驱动;MDIO是双向数据线 所有PHY共享MDC和MDIO信号,靠唯一PHY地址区分 读写操作由主控发起,PHY收到地址匹配指令后应答

图中你可以看到:MDC和MDIO两根线是共享的,所有PHY都挂在同一总线上。主控通过发送特定的帧格式,带上目标PHY的地址,来完成读写操作。这个帧格式,就是我们后面章节要讲的重点。

注意:我曾经吃过一个亏——PHY地址配置冲突。两个PHY设成了同一个地址,结果读回来的数据完全混乱。后来我学乖了,每次做完硬件都先核对一下PHY地址,用示波器确认总线信号是否对。

1.5 小结一下

MDIO这个协议,虽然功能专一,但确实是嵌入式网络开发者的基本功。你想想看,不搞定PHY管理,网口的速率模式都不对,还谈什么数据传输?

这一章我们认识了MDIO是什么、用在哪里、和I2C/SPI比有什么特点。核心就一句话:MDIO是专门为管理以太网PHY芯片设计的串行总线。