MCU微课堂
CKS32F107XX系列以太网介绍(二)
第七十二期 2026.03.03
MII/RMII接口概述
MII即媒体独立接口,也叫介质独立接口。它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口。
RMII即精简介质独立接口。规范降低了10/100 Mbit/s 下微控制器以太网外设与外部PHY 间的引脚数。根据IEEE 802.3u 标准,MII包括17 个数据和控制信号的引脚。RMII规范将引脚数减少为 9 个。图 1 和 图2分别为 MII、RMII 接口的信号示意图。

图1 MII接口信号
图2 RMII接口信号
引脚定义说明:

SMI 接口信号:MAC 通过此接口配置 PHY 工作在不同的通信模式。
数据发送信号:由 MAC 子层同步驱动,在 TX_EN 信号有效时才为有效信号(有效数据)。禁止 TX_EN 时,发送数据不会对 PHY 产生任何影响。MII 接口包括 4 根数据信号,RMII 接口是 2 根数据信号。
数据接收信号:由 PHY 同步驱动,在 DV 信号有效时才为有效信号(有效数据)。MII 接口包括 4 根数据信号,RMII 接口是 2 根数据信号。
发送使能信号:该信号表示 MAC 当前正针对 MII/RMII 发送半字节。该信号必须与报头的前半字节进行同步 (MII_TX_CLK / RMII_REF_CLK)。
时钟信号:MII 接口包括 TX_CLK、RX_CLK;RMII 接口 TX/RX 共用 REF_CLK 信号;该信号提供进行 TX/RX 数据传输时的参考时序。
MII 标称频率为:速率为 10 Mbit/s 时为 2.5 MHz;速率为 100 Mbit/s 时为 25 MHz。
RMII 标称频率为:速率为 10 Mbit/s 时为 5 MHz;速率为 100 Mbit/s 时为 50 MHz。
接收错误信号:该信号必须保持一个或多个周期 CLK,从而向 MAC 子层指示在帧的某处检测到错误。RMII 接口无此信号。
接收数据有效信号:该信号表示 PHY 当前正针对接收已恢复并解码的半字节。该信号必须与恢复帧的头半字节进行同步,并且一直保持同步到恢复帧的最后半字节。该信号必须在最后半字节随后的第一个时钟周期之前禁止。为了正确地接收帧,DV 信号必须在时间范围上涵盖要接收的帧,其开始时间不得迟于 SFD 字段出现的时间。RMII 接口此信号和载波侦听信号复用成1个信号引脚。
载波侦听信号:当发送或接收介质处于非空闲状态时,由 PHY 使能该信号。发送和接收介质均处于空闲状态时,由 PHY 禁止该信号。PHY 必须确保 CRS 信号在冲突条件下保持有效状态。该信号无需与 TX 和 RX 时钟保持同步。在全双工模式下,该信号没意义。RMII 接口此信号和接收数据有效信号复用成1个信号引脚。
冲突检测信号:检测到介质上存在冲突后,PHY 必须立即使能冲突检测信号,并且只要存在冲突条件,冲突检测信号必须保持有效状态。该信号无需与 TX 和 RX 时钟保持同步。RMII 接口无此信号。
CKS32F107XX通信实验
本实验由 CKS32F107 开发板 + DP83848 以太网模块配合完成。
1.MII模式配置
(1)DP83848 模块通过 J1 J2 J3 配置为 MII 模式;
(2)CKS32F107 开发板如下管脚通过杜邦线和 DP83848 模块连接;如图3;
图3 MII硬件连接示意图
(3)配置如图3 GPIO管脚为 Ethernet 功能;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
(4)配置以太网模块为 MII 模式;
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_MII);
(5)配置 PA8 输出25M 时钟;
/* PA8: MCO pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_MCOConfig(RCC_MCO_HSE); //输出 MCU HSE 25M,MII模式 4*25M=100M
2.RMII模式配置
(1)DP83848 模块通过 J1 J2 J3 配置为 RMII 模式;
(2)CKS32F107 开发板如下管脚通过杜邦线和 DP83848 模块连接;

图4 RMII硬件连接示意图
(3)配置如图 GPIO管脚为 Ethernet 功能;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
(4)配置以太网为 RMII 模式;
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);
(5)配置以太网为 RMII 模式;
/* PA8: MCO pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Set PLL3 clock output to 50MHz (25MHz /5 *10 =50MHz) */
RCC_PLL3Config(RCC_PLL3Mul_10);
RCC_PLL3Cmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLL3RDY) == RESET);
RCC_MCOConfig(RCC_MCO_PLL3CLK); //输出 MCU PLL3 50M,RMII模式: 2*50M=100M
3.实验结果
通过以上配置,无论 MII /RMII 都可以正常通讯,如下图 5。

图5 实验结果