DM9161以太网PHY设计指南:MII/RMII接口选型、网络变压器匹配与MDIO寄存器配置

做带以太网的嵌入式产品,很多人以为选完 MAC 控制器就万事大吉,真正卡住项目的往往是后面这颗 PHY。板子回来了,网口灯不亮;换条网线又能通;RMII 模式省了十几个引脚,却发现 50MHz 的 REF_CLK 不知道该由谁提供;变压器选了 1:1,链路就是时不时掉。这些问题很少写在"入门教程"里,却几乎每个做工业网关、RTU、智能电表的团队都会踩一遍。DM9161 是一颗把 PCS、PMA、TP-PMD、自协商、LED 驱动全部集成进 48 脚 LQFP 的单芯片以太网收发器,支持 MII/RMII/GPSI 三种 MAC 侧接口,是理解"MAC—PHY—变压器—RJ45"这条链路的好样本。本文基于 DM9161 数据手册,把接口选型、上电锁存配置、MDIO 寄存器、变压器匹配和 PCB 布局一次讲透。

一、MAC 与 PHY 到底谁管什么

以太网控制器通常被拆成两层:MAC(Media Access Control,媒体访问控制)和 PHY(Physical Layer,物理层)。MAC 负责成帧、CRC 校验、地址过滤、流量控制,它工作在"数字域",输出的是并行的半字节(nibble)数据;PHY 负责把数字信号变成双绞线上能跑的模拟波形——编码、加扰、驱动、均衡、时钟恢复,它工作在"模拟域"。两者之间那根标准的并行总线,就是 MII(Media Independent Interface,介质无关接口)。

DM9161 只做 PHY 这一层。它内部包含了 100BASE-TX 的 PCS(物理编码子层)、PMA(物理介质连接)、TP-PMD(双绞线物理介质相关子层),以及 10BASE-T 的编码解码器和自协商状态机。换句话说,MAC 交给它一串半字节,它负责变成网线上的差分波形;网线进来的波形,它负责还原成半字节交还 MAC。理解了这条分界线,后面所有的接口、时钟、寄存器问题都会顺理成章。

二、DM9161 的三种 MAC 侧接口

DM9161 在 MAC 侧提供三种接口模式,这是选型时第一个要拍板的事:

2.1 MII 与 RMII 的关键差异

对比项 MII RMII GPSI(仅 10M)
数据位宽 4 位(TXD/RXD[0:3]) 2 位(TXD/RXD[0:1]) 1 位串行
MAC 侧信号线数 约 21 根 约 9~10 根 7 根
参考时钟 PHY 输出 TXCLK/RXCLK,100M 时 25MHz、10M 时 2.5MHz 外部 50MHz REF_CLK,收发共用一个时钟 PHY 输出 10MHz
时钟来源 由 PHY 从 25MHz 晶振分频提供 可由 MAC 或独立 50MHz 晶振提供,接 XT2/REF_CLK PHY 提供
100M 支持 是 是 否
典型适用 FPGA、带 MAC 的 SoC、引脚充裕 STM32/低引脚 MCU + 外部 PHY 极低成本 10M 设备

💡 选型要点

RMII 省下来的不是"几根线",而是整个 4 位并行总线带来的布线难度:MII 的 8 根数据线 + 2 个独立时钟必须等长、远离干扰源,PCB 面积和层数都上去了。如果 MCU 支持 RMII(如 STM32F4/F7/H7 系列内置 MAC),优先选 RMII;只有在用 FPGA 自定义 MAC 或需要更细的时序观测时才用 MII。

三、上电锁存配置:Table A 与 PHY 地址

DM9161 有一批"双功能引脚",在复位上升沿会把引脚电平锁存进内部寄存器,决定芯片的工作模式。这是它最容易出错的地方——引脚上电瞬间拉错,芯片就按错误模式启动,而且软件不一定能改回来。

3.1 OP2/OP1/OP0:介质类型与速率选择

FDXLED/OP0、SPEEDLED/OP1、LINKLED/OP2 这三个 LED 引脚同时承担操作模式选择。上电复位时按 Table A 锁存,决定是自协商还是强制某种模式。

OP2 OP1 OP0 功能
0 0 0 双速 100/10 半双工(HDX)
0 0 1 强制 100FX 半双工
0 1 0 强制 100FX 全双工
0 1 1 强制 10TX 半双工
1 0 0 强制 10TX 全双工
1 0 1 强制 100TX 半双工
1 1 0 强制 100TX 全双工
1 1 1 自协商,开启全部能力(推荐)

绝大多数工业设备应选 111(自协商),让 PHY 和对端交换机自动协商出 100M 全双工。只有当对端是固定模式、或需要绕过自协商排查问题时,才用强制模式。注意 OP 引脚复用 LED 输出,所以外部必须接上拉/下拉电阻确定默认电平,同时又要有 LED 驱动能力——通常用 LED + 限流电阻到 3.3V(对应逻辑 1)或到 GND(对应逻辑 0)来实现。

3.2 PHYAD[4:0]:PHY 地址与多 PHY 系统

PHYAD[4:0] 由 RXD[0:3] 和 CRS 引脚在复位时锁存,决定这颗 PHY 在 MDIO 总线上的地址。单 PHY 系统可以随便设一个(比如 0 或 1),但只要一根 MDIO 总线上挂了多颗 PHY(多网口设备很常见),地址就不能重复,否则 MAC 无法区分它们。此外,RXER/RPTR 引脚锁存决定 Node 还是 Repeater 模式,普通终端设备应设为 Node 模式(默认下拉为 0)。

⚠️ 常见坑:复位期间引脚被 LED 或外部电路"带偏"

这些锁存引脚在复位期间是输入,但复位结束后变成 LED 输出。如果外部用了低阻值电阻或直接接地/接电源,可能与 LED 驱动冲突;更隐蔽的问题是复位时间太短(RESET# 低电平保持不足),锁存电平还没稳定就开始采样,导致锁存到错误值。建议 RESET# 低电平保持 10ms 以上,并在锁存引脚上使用 4.7kΩ 级别的上下拉配合 LED 限流电阻。

四、MDIO 管理接口与寄存器配置

DM9161 通过 MDC/MDIO 两线管理接口读写内部寄存器,帧格式遵循 IEEE 802.3 的 Clause 22:起始码 + 操作码 + PHY 地址(5 位)+ 寄存器地址(5 位)+ 数据(16 位)。MDC 由 MAC 提供,最高 2.5MHz,最小周期 80ns。

4.1 常用寄存器一览

地址 寄存器 关键位 用途
0x00 BMCR 基本控制 bit15 软复位、bit13 速率、bit12 自协商使能、bit11 掉电、bit9 重启自协商 初始化与强制模式设置
0x01 BMSR 基本状态 bit5 自协商完成、bit2 链路状态(读后清零)、bit1 Jabber 轮询链路与协商状态
0x02/0x03 PHYID1/PHYID2 OUI 0x00606E 识别 PHY 型号,MAC 驱动自动匹配
0x04 ANAR 自协商通告 bit8~5 能力通告、bit4~0 选择子 限定本端可通告的速率/双工
0x05 ANLPAR 对端能力 bit8~5 对端能力 读取协商结果,判断链路是否降速
0x16 DSCR 厂商配置 bit10 TX/FX 选择、bit8 RMII 使能、bit4 自动降功耗 RMII、FX 模式等厂商扩展配置
0x17 DSCSR 配置与状态 bit15~12 协商结果(100FDX/100HDX/10FDX/10HDX) 直接读出协商后的工作模式
0x18 10BTCSR bit10 10BT GPSI 模式、bit0 极性反转状态 10M 相关配置与线序诊断

有两个细节值得单独说。其一,BMSR 的链路状态位(bit2)是"读后清零"的锁存位——如果链路曾经断开过,即使现在恢复了,不读它就一直是 0;很多驱动"链路已连接但状态显示断开"的 bug 就来自这里,正确做法是每次读 BMSR 后重新读一次确认。其二,DSCSR 的 bit15~12 直接给出协商结果,比去解析 ANLPAR 更省事,判断"是不是被降到了 10M 半双工"时非常方便。

4.2 软件 MDIO 读写实现(STM32)

如果 MCU 的硬件 MAC 不接管 MDIO(或调试阶段需要独立控制),可以用 GPIO 软件模拟 MDIO 时序。下面是可移植的读写函数:

/*
 * mdio_soft.h —— DM9161 软件 MDIO 读写
 * 引脚假设:MDC -> PA1(推挽输出),MDIO -> PA2(开漏/双向)
 * MDC 最高 2.5MHz,软件模拟时适当加延时即可
 */
#include "stm32f1xx_hal.h"

#define MDC_H()   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
#define MDC_L()   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
#define MDIO_H()  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
#define MDIO_L()  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define MDIO_IN() HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)

/* 在 MDC 上升沿前建立数据,这里以 MDC 低电平期写入 */
static void mdio_delay(void) { __NOP(); __NOP(); __NOP(); }

static void mdio_write_bit(uint8_t bit)
{
    MDC_L();
    if (bit) MDIO_H(); else MDIO_L();
    mdio_delay();
    MDC_H();          /* 从端在上升沿采样 */
    mdio_delay();
}

static uint8_t mdio_read_bit(void)
{
    uint8_t v;
    MDC_L();
    mdio_delay();
    MDC_H();
    mdio_delay();
    v = MDIO_IN() ? 1 : 0;   /* 在 MDC 高电平期读取 */
    return v;
}

/* Clause 22 帧:32 位前导 + 起始(01) + 读(10)/写(01) + PHYAD(5) + REGAD(5) + TA + DATA(16) */
void dm9161_write(uint8_t phyad, uint8_t regad, uint16_t data)
{
    int i;
    MDIO_H();                 /* 前导:MDIO 拉高 */
    for (i = 0; i < 32; i++) mdio_write_bit(1);
    mdio_write_bit(0); mdio_write_bit(1);   /* 起始码 01 */
    mdio_write_bit(0); mdio_write_bit(1);   /* 操作码 01 = 写 */
    for (i = 4; i >= 0; i--) mdio_write_bit((phyad >> i) & 1);
    for (i = 4; i >= 0; i--) mdio_write_bit((regad >> i) & 1);
    mdio_write_bit(1); mdio_write_bit(0);   /* 翻转位 10 */
    for (i = 15; i >= 0; i--) mdio_write_bit((data >> i) & 1);
}

uint16_t dm9161_read(uint8_t phyad, uint8_t regad)
{
    int i;
    uint16_t data = 0;

    MDIO_H();
    for (i = 0; i < 32; i++) mdio_write_bit(1);
    mdio_write_bit(0); mdio_write_bit(1);   /* 起始码 01 */
    mdio_write_bit(1); mdio_write_bit(0);   /* 操作码 10 = 读 */
    for (i = 4; i >= 0; i--) mdio_write_bit((phyad >> i) & 1);
    for (i = 4; i >= 0; i--) mdio_write_bit((regad >> i) & 1);

    /* 翻转:从端先拉高再拉低,此处直接进入数据采样 */
    (void)mdio_read_bit();
    (void)mdio_read_bit();
    for (i = 15; i >= 0; i--) {
        data = (uint16_t)((data << 1) | mdio_read_bit());
    }
    return data;
}

初始化流程一般是:写 BMCR 的 bit15 软复位 → 读 BMSR 确认复位完成 → 写 ANAR 限定通告能力(比如只允许 100M 全双工)→ 写 BMCR 的 bit12 使能自协商 + bit9 重启自协商 → 轮询 BMSR bit5 直到协商完成 → 读 DSCSR 确认最终速率与双工。这套流程在几乎所有符合 Clause 22 的 PHY 上通用,换芯片只需改 PHY 地址。

五、网络变压器与匹配电阻

PHY 的差分引脚不能直接接 RJ45,中间必须经过网络变压器。变压器承担三个作用:电气隔离(把网线侧与设备侧的地隔开,承受 1500V 以上耐压)、共模抑制(抑制网线上的共模干扰)、阻抗匹配(把 PHY 的差分阻抗匹配到双绞线的 100Ω)。

5.1 1:1 与 1.25:1 变压器

对比项 1:1 变压器(标准) 1.25:1 变压器(降功耗)
发送端串联电阻 50Ω ×2(RX±、TX± 各一对) 78Ω ×2
带隙基准电阻 BGRES 6.8kΩ,1% 8.5kΩ,1%
发送差分电压 约 2.0V 峰峰值 更低,相应降低驱动电流
功耗 标准 更低,适合功耗敏感设计
兼容性 最通用,变压器选择多 需变压器支持 1.25:1 变比

BGRES 引脚(第 48 脚)外接的 6.8kΩ 1% 电阻是 DM9161 的"定标电阻",芯片用它产生内部基准电流,进而决定发送驱动电流。这个电阻必须用 1% 精度、靠近第 47/48 脚放置,周围不要走高速信号。换成 1.25:1 变压器时,这个电阻要相应改为 8.5kΩ,否则发送幅度会偏离规范。

5.2 常见变压器型号与 RJ45 侧端接

数据手册给出的等效型号包括 Pulse PE-68515/H1102、YCL PH163112/PH163539、DELTA LFE8505-DC/LFE8563-DC/LFE8583-DC、GTS FC-618SM、MACOM HS9016/HS9024 等。选型时注意它们是"电气等效"而非"引脚兼容",换料要重新核对引脚定义。

RJ45 侧还需要一组端接:变压器网线侧中心抽头各接 75Ω 1% 电阻,汇合后经 0.1µF/2kV(或 0.01µF/2kV)电容接到机壳地(Chassis GND)。这组 75Ω + 高压电容构成 Bob Smith 端接,用于泄放共模电流、改善 EMC。注意是接到机壳地而非数字地,两者在单点通过高压电容连接。

六、时钟与供电

6.1 25MHz 晶振(MII 模式)

MII 模式下,DM9161 需要 25MHz 参考时钟。可以用晶振,也可以用有源振荡器。晶振要求是基频、串联谐振型,接在 XT1(第 43 脚)与 XT2(第 42 脚)之间,两端各用 22pF 电容对地。数据手册给出的时钟指标:周期 40ns ± 50ppm,高/低电平宽度 16~24ns。50ppm 意味着 25MHz 下允许约 ±1.25kHz 的频率偏差,普通无源晶振(±30ppm)足够,但要注意负载电容匹配,否则实际频率会偏。

6.2 RMII 模式的 50MHz REF_CLK

RMII 模式最大的坑就在时钟。此时 XT2 变成 REF_CLK 输入,需要外部提供 50MHz,占空比 35%~65%,建立时间 4ns、保持时间 2ns。这个 50MHz 有两个来源:

无论哪种方式,MCU 和 PHY 必须共用同一个 50MHz 时钟源。如果各自用各自的晶振,两个时钟存在频差和相位漂移,RMII 会随机丢包甚至完全不通——这是 RMII 调试中最常见、也最隐蔽的故障。

6.3 供电与去耦

DM9161 是 3.3V 单电源供电,工作范围 3.135~3.465V。I/O 可承受 5V(绝对最大输入 5.5V),所以与 5V MCU 直连也不会有问题。功耗方面:100BASE-TX 工作约 88mA,10BASE-T 空闲约 30mA,自协商约 45mA,掉电模式仅 3mA。掉电与降功耗模式对电池供电或需要"网口待机唤醒"的设备很有用。

去耦要求明确:每对电源引脚旁都要放 0.1µF 或 0.01µF 电容,且距引脚不超过 3mm。模拟电源(AVDD,第 1/2/9 脚)和数字电源(DVDD)建议通过磁珠隔离,磁珠在 100MHz 的阻抗不低于 75Ω(如 Panasonic EXCCL4532U 或等效),磁珠两侧分别配 10µF、0.1µF、0.01µF 电容。

七、PCB 布局要点

以太网部分对布局非常敏感,数据手册专门给出了一节应用笔记,几条硬规则值得抄下来:

💡 一个反直觉的结论

很多工程师习惯性地把模拟地和数字地"分得干干净净",但在以太网 PHY 上,数据手册建议用单一地平面。原因是高速差分信号的回流路径对地平面完整性要求极高,一旦被分割,回流被迫绕行,环路面积增大,EMI 不降反升。正确做法是:单一完整地平面,靠元器件的物理分区(模拟器件集中、数字器件集中)来隔离,而不是切地。

八、常见故障排查

故障现象 可能原因 排查方法
网口灯完全不亮 复位未完成 / 晶振不起振 / OP 引脚锁存错误 测 XT1 是否有 25MHz(或 XT2 是否有 50MHz);读 BMSR 看能否通信;确认 OP[2:0] 上电电平
MDIO 读回全 1 或全 0 PHY 地址错 / MDC 过快 / 上拉缺失 用软件扫描 PHYAD 0~31;把 MDC 降到 1MHz 以下;MDIO 需 1.5k~2.2kΩ 上拉
链路时通时断 变压器变比与 BGRES 不匹配 / 时钟源不一致(RMII) 核对 1:1 配 6.8kΩ、1.25:1 配 8.5kΩ;确认 MCU 与 PHY 共用同一 50MHz 源
协商后只有 10M 半双工 线序/线材问题 / ANAR 通告能力被限制 读 ANLPAR 与 DSCSR;检查网线是否只有 2 对;确认 ANAR 允许 100M 全双工
能 ping 通但丢包严重 差分走线不等长 / 匹配电阻位置错 / 地平面被分割 检查 RX±/TX± 是否成对等长;50Ω 电阻是否靠近 PHY;确认地平面完整
EMC 辐射超标 Bob Smith 端接缺失 / 变压器下方地不完整 补 75Ω + 2kV 电容到机壳地;检查变压器与 RJ45 下方地平面

结语

DM9161 这颗 PHY 本身不难用,难的是它把以太网链路里所有"看不见的约束"都暴露给了硬件工程师:接口模式决定引脚和时钟拓扑,上电锁存引脚决定芯片启动状态,MDIO 寄存器决定软件能否正确控制,变压器与 BGRES 决定信号幅度是否合规,地平面与差分走线决定 EMC 能否过关。把这五件事按顺序理清——先定 MII 还是 RMII,再确认锁存引脚电平,然后跑通 MDIO 读写,最后按手册核对变压器与布局——绝大多数"网口不通"的问题都能在打样前避免。对于工业网关、RTU、智能电表这类需要稳定有线以太网的设备,DM9161 的集成度和成熟度依然是可靠选择。

需要定制开发?

沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付

立即微信咨询

电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应

🎧 本文已制作播客节目
双主持对话音频,随时随地收听本文内容
收听播客 →