以太网 MAC Loopback 的实现 – STM32为例
前言
在 STM32 以太网调试中,经常会遇到”设备接收不到数据”或者”设备发出的数据对端设备收不到”之类的问题。遇到这类问题,首先要做的是定位问题发生的部位,这样可以指明下一步调试的方向,缩小分析的范围。
以下图为例:设备 A 和设备 B 通过以太网通信,现发现设备 B 无法接收设备 A 发送的消息,问题可能出现在以下几个地方:
- 应用层或协议栈出错 — 数据根本没有到达 STM32 以太网外设。调试时在以太网输出函数
low_level_output中打个断点即可检查。 - STM32 以太网 MAC 出现问题 — 没有把数据发送出去。可以通过 STM32 以太网的 MAC loopback 功能来检查 MAC 的收发是否正常。
- MAC 和外部 PHY 之间的通信出现问题 — 可以通过 PHY 提供的 loopback 功能来检查。
- 设备 A 端收发正常,问题在线路或设备 B — 可以在网口接线上做网线交叉(将 RJ-45 接口中 TX+ 与 RX+ 连接,TX- 与 RX- 连接)来检查。

本文将主要介绍 STM32 MAC loopback 方法。
MAC Loopback 模式

使能方法
MAC loopback 模式的使能很简单:将 ETH_MACCR 寄存器的 LM 位置位 即可。
MAC loopback 模式使能后,MAC 发送的数据帧通过 MII 接口发送给外部 PHY 的同时,也发送到 MAC 接收端。
注意:STM32 MAC loopback 模式只支持在 MII 接口下工作。
正确接收 Loopback 数据的注意事项
使能 loopback 后,要正确接收到 loopback 数据,还需要注意以下几点:
1. PHY 初始化不可省略
MAC loopback 模式下,MII 接口的接收时钟(RX_CLK)和发送时钟(TX_CLK)还需要外部 PHY 来提供,所以 PHY 的初始化不能省。
2. MAC 地址过滤
以太网帧中的目标 MAC 地址应该和源 MAC 地址一致,或者设定为广播地址(FF:FF:FF:FF:FF:FF),否则 MAC 默认会过滤接收到的数据。也可以将 ETH_MACFFR 寄存器的 RA 位置位(Receive All),以接收所有的以太网帧。
3. Cache 和 RAM 区域注意事项
对于 F7、H7 这类带有 Cache 的 MCU 型号,需要注意接收/发送描述符和接收/发送 Buffer 的地址以及 Cache 属性:
- 这部分存放在 SRAM 的数据,CPU 和以太网 DMA 都会去读写
- 如果使能 Cache(回写),可能会出现数据不一致的情况
- 也不能将数据定义在 STM32F769 的 DTCM RAM 区域
例程说明
本文基于 STM32F769I-EVAL 开发板提供了一个以太网外设测试工程。工程中没有用到 TCP/IP 协议栈,只通过 STM32F7 的 HAL 驱动层实现了以太网 MAC 层的数据收发,同时也实现了 MAC loopback 的功能。
这个测试工程的目的是:检测 STM32 以太网外设的配置是否正确、工作是否正常。
两种工作模式
例程提供两种工作模式:
| 模式 | 说明 |
|---|---|
| 正常模式 | 可以正常与另一个设备(PC 或其他开发板)通信,发送和接收以太网帧。用户可以发送自定义的以太网帧数据,程序会自动构建以太网帧并发送。因为没有实现 TCP/IP 协议,如果想发送 IP 包或 TCP/UDP 包,需要自己按照包格式构建好数据。 |
| MAC Loopback 模式 | STM32F769I-EVAL 板子发送的数据被直接送回到 MII 接口的接收端。如果此时网口还连接到另一个设备,该设备也可以接收到数据。 |
例程配置
打开例程后,需要做以下配置:
1. 设置目标 MAC 地址(dst_addr)
- 如果发送广播:
dst_addr设置为FF:FF:FF:FF:FF:FF - 如果在 MAC loopback 模式下:
dst_addr设置成和src_addr一样
2. 定义帧数据类型(frame_type)
可以发送自定义的帧数据类型,或者使用通用的预先定义好的帧数据类型。例如:
- 发送 IPv4 数据:
frame_type = 0x0800 - 自定义类型:使用未被分配的数值。在本 demo 中,使用的是
0x0601
3. 初始化要发送的数据 Buffer
要发送的数据保存在 teststring 数组中。注意:这个数组里只保存应用层要发送的数据,即以太网帧格式的数据段,不包括目标/源 MAC 地址、以太网帧数据类型和 CRC 校验码。
4. 宏配置
在 main.h 中:
- 使能 MAC loopback:定义
MAC_LOOPBACK_ENABLE宏 - 不使能 MAC loopback:注释掉
MAC_LOOPBACK_ENABLE宏
修改好以上参数后,重新编译烧录后运行。
运行效果
每次按下 USER 按键,触发一次数据发送。接收到的数据保存在 rxbuffer,同时板子上的 LD1 灯会改变一次状态。
小结
MAC loopback 是定位以太网问题的重要工具。在排除”应用层/协议栈 → MAC 发送 → MAC 与 PHY 通信 → 线路/对端设备”这条链路时,MAC loopback 可以快速验证 MAC 本身的收发功能是否正常。结合 PHY loopback 和网线交叉测试,可以逐段定位问题所在,大幅提高调试效率。
完整版例程请查看 ST 社区原帖附件:https://shequ.stmicroelectronics.cn/thread-636029-1-1.html