CASE / 02 · 方案论证
STM32H7 的 MDIO 为什么配不全 KSZ8873:差在 2 个 bit 的 OP Code
客户想让 STM32H755 的以太网 MAC 通过 RMII 直连 KSZ8873RLL 交换机,并用 MDC/MDIO 配置交换机。手册层面的结论是:H7 的 MDIO 能寻址任意器件,但要经 MDC/MDIO 访问 KSZ8873 的全部配置寄存器,只能用 OP Code = 00 的私有 SMI 帧,而 H7 的 MDIO 控制器两种帧格式都发不出这种帧。方案改为 GPIO 软件模拟 SMI。客户当时在原理图阶段,全部结论未上板。
适用范围
| 芯片 | STM32H745/755/747/757(RM0399 覆盖的系列)+ KSZ8873RLL |
| 场景 | MCU 以太网 MAC 与交换机 MAC-to-MAC 直连,中间没有 PHY,并且需要由 MCU 改交换机配置 |
| 可推广到 | 任何「用 MCU 的以太网 MDIO 去访问器件私有管理帧」的场景:先比帧格式,再写代码 |
| 状态 | 方案论证;客户在原理图阶段;未上板 |
客户的问题
「库里面都是外接 PHY 的情况,H7 里面的 MDIO/MDC 好像不能单独操控去配置 8873。」
这句话里其实有两个问题,结论相反:
- H7 的 MDIO 能不能单独拿来访问非 PHY 器件?能。
- 能不能用它配置 KSZ8873 的全部寄存器?不能。但原因不在「库只支持 PHY」,而在帧格式。
论证过程
-
先看 H7 这边能力够不够。
RM0399 Rev 4 §61.6.1(第 3005 页):SMA 模块最多可访问 32 个 PHY,应用可以寻址其中任意一个的任意一个寄存器。底层只有
ETH_MACMDIOAR/ETH_MACMDIODR两个寄存器,没有「必须是 PHY」的约束。「库里都是外接 PHY」是 HAL 的组织方式,不是外设限制。 - 再看 KSZ8873 那边开放了多少。 DS00002348C §3.3.10(第 25 页):标准 MIIM 接口只能访问 8 个 16 位寄存器(标准 [0:5] + 自定义 [29, 31]),最高 5 MHz。交换机的全局、端口、高级配置寄存器(0x00–0xC6)都不在这里面,用标准 MDIO 配不了交换机。
- 全部寄存器走的是另一种帧。 同一手册 §3.3.11 TABLE 3-9(第 26 页):SMI 帧 Start of Frame = 01、OP Code = 00,读写靠 PHY 地址的 bit 4 区分,8 位寄存器地址由 {PHYAD[2:0], REGAD[4:0]} 拼成。
-
H7 的两种帧格式逐字段比对。
Clause 22 帧见 RM0399 第 3008 页 Table 574,Clause 45 帧见第 3007 页 Table 573:
寄存器层面(第 3151 页):
字段 KSZ8873 SMI 要求 H7 Clause 22 H7 Clause 45 START 0101对得上00对不上OPCODE 00只有 10读、01写,对不上有 00(Address),对得上GOC[1:0]= 00 标为「Reserved, must not be used」,并注明 Clause 22 下只有读、写两个命令有效。两条路都堵:Clause 22 起始位对、操作码不对;Clause 45 操作码对、起始位不对。只查其中一条,会误以为切到 Clause 45 还有机会。 -
源码交叉印证。
STM32CubeH7 V1.13.0 的 CMSIS 头文件
stm32h755xx.h第 7822–7833 行,这个字段只定义了WR、PRDIA、RD三个宏,没有 00。(手册叫GOC,头文件叫MOC,指的是同一个字段。) - 客户独立得出同样结论。 客户自己读完两份手册后判断「SMI 操作码为 0,H7 的 MAC 控制器发不出 0」,来问是否正确。我们补齐第 4 步的帧结构证据后确认:判断正确。
结论
- H7 硬件 MDIO 可以读 KSZ8873 的 8 个 MIIM 状态寄存器(链路、速率等)。
- H7 硬件 MDIO 不能写交换机配置寄存器,因为发不出 OP Code = 00 的 SMI 帧。
- 两种替代:改用 KSZ8873 的 SPI / I2C 管理接口(DS 第 8 页的引脚表里可以看到 SPI slave 模式),或用 GPIO 软件模拟 SMI 帧。推荐后者:不改原理图;同一套 bit-bang 代码换个 OP Code 就能兼发标准 MIIM 帧;寄存器配置是上电一次性动作,速度不是问题(接口上限 5 MHz,第 25 页)。
这条结论在手册层面是闭合的(KSZ8873 原文 + RM0399 两张帧结构表 + 寄存器位定义 + 官方头文件),但「GPIO 模拟 SMI 在这块板上跑通」没有实测。
落地时的三个硬件要点
- MDIO 脚必须外部上拉。 DS 第 8 页,Pin 43(SDA_MDIO):「an external pull-up is needed on this pin when it is in use」。SMI 读操作的 TA 周期主机要释放总线,靠这只上拉维持电平。
- 复位释放后至少等 100 µs 再发 SMI。 DS §7.10 TABLE 7-10 下方原文(页脚第 86 页,PDF 第 87 页):复位撤销后,须等待至少 100 µs 才能通过管理接口(I²C / SPI / SMI / MIIM)编程。这一步直接写进软件初始化流程。
- RMII 数据线上不要加下拉。 KSZ8873 有几根 RMII 信号线兼作上电 strap(例如 CRS_DV 输出兼 MII 模式选择),被外部拉低会改变 Port 3 的工作模式。这一条是我们依据 strap 定义作出的判断,手册没有直接给出这句警告,要在原理图评审时逐脚核对。
我们第一轮说错了什么
第一轮手上只有客户发来的一张 TABLE 3-7 截图,表里只有 REFCLKI_3(输入)。我们据此说「RMII 两端都是时钟输入,没有任何一端产生 50 MHz,必须外加有源晶振」,同时标注了「KSZ8873 是否另有时钟输出脚,待查」。
拿到完整手册后更正:DS 第 24 页,KSZ8873RLL「Uses a single 50 MHz clock reference (provided internally or externally)」,它的 REFCLKO_3 可以自己输出 50 MHz,TABLE 3-5 列出了五种时钟组合。同一页还有一条第一轮完全不知道的约束:如果改由外部提供 50 MHz,这路时钟必须同时接到 X1 脚,不能再挂 25 MHz 晶体,否则两个时钟源之间的偏差会影响 RMII 时序。
更正写进了第三轮答复,原结论没有静默覆盖。
验证状态与限制
| 项 | 状态 |
|---|---|
| H7 MDIO 可寻址任意器件 | 手册原文 |
| 经 MDC/MDIO 访问 KSZ8873 配置寄存器须走 SMI(OP = 00) | 手册原文 |
| H7 硬件 MDIO 发不出 SMI 帧 | 手册原文 + 官方头文件 未上板 |
| GPIO 模拟 SMI 可行 | 未上板 客户处于原理图阶段 |
| 客户最终实现结果 | 未反馈 |
可复用的经验
- 「库里没有」不等于「芯片不行」。先回到外设寄存器层面判断能力,再看库怎么封装。
- 器件私有管理帧,先比帧格式再写代码。START 和 OP Code 两个字段都要比,只比一个会漏掉。
- 只拿到一张截图时,结论要标清「待查」。第一轮那条「待查」,让第三轮的更正有据可循。
结论—依据—验证状态对照
| # | 结论 | 依据 | 类型 |
|---|---|---|---|
| 1 | H7 SMA 可寻址 32 个器件中任意一个的任意寄存器 | RM0399 Rev 4 §61.6.1,第 3005 页 | 手册原文 |
| 2 | KSZ8873 标准 MIIM 只开放 8 个寄存器,最高 5 MHz | DS00002348C §3.3.10,第 25 页 | 手册原文 |
| 3 | 经 MDC/MDIO 访问全部配置寄存器须走 SMI:Start = 01、OP = 00 | DS00002348C §3.3.11 TABLE 3-9,第 26 页 | 手册原文 |
| 4 | H7 Clause 22 帧 OPCODE 只有 10 / 01 | RM0399 Table 574,第 3008 页 | 手册原文 |
| 5 | H7 Clause 45 帧 OPCODE 有 00,但 START = 00 | RM0399 Table 573,第 3007 页 | 手册原文 |
| 6 | GOC[1:0] = 00 保留不可用 | RM0399 ETH_MACMDIOAR,第 3151 页 | 手册原文 |
| 7 | 头文件只定义 WR / PRDIA / RD 三个宏 | STM32CubeH7 V1.13.0 stm32h755xx.h 第 7822–7833 行 | 源码 |
| 8 | 因此 H7 硬件 MDIO 发不出 SMI 帧 | 由 3–7 推出 | 推断 未上板 |
| 9 | MDIO 脚需外部上拉 | DS00002348C TABLE 2-1 Pin 43,第 8 页 | 手册原文 |
| 10 | 复位后至少等 100 µs 再访问管理接口 | DS00002348C §7.10,页脚第 86 页(PDF 第 87 页) | 手册原文 |
| 11 | KSZ8873RLL 可自行输出 50 MHz(更正第一轮) | DS00002348C §3.3.9 TABLE 3-5,第 24 页 | 手册原文 |
| 12 | GPIO 模拟 SMI 在实板上可用 | — | 待验证 |
RM0399 为 Rev 4;KSZ8873 手册为 DS00002348C,从 PDF 第 38 页起页脚页码比 PDF 页码少 1,第 10 条两个页码都写出。
遇到类似问题
MCU 以太网接交换机、或接非标准 PHY 时卡在管理接口,发来这几项能更快收敛:两颗芯片的完整型号、对端器件手册里的管理帧格式表、打算走 MDIO / SPI / I2C 中的哪一条、当前处于原理图还是调试阶段。