打印
[应用相关]

(分享)STM32以太网 MAC Loopback的实现

[复制链接]
386|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2022-5-12 09:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AC, ST, ck
前言

在STM32以太网调试中经常会遇到“设备接收不到数据”,或者“设备发出的数据对端设备收不到”之类的问题。遇到这类问题首先要做的是定位问题发生的部位,这样做的好处就是可以指明下一步调试的方向,缩小分析的范围。以下图为例我们做个简单的说明,设备A和设备B通过以太网通信,现发现设备B无法接收设备A发送的消息,问题可能出现在几个地方:

l  应用层的程序,或者协议栈出错,数据根本没有到STM32以太网外设。这种情况我们在调试的时候,在以太网输出函数low_level_output中打个断点就可以检查出来。
l  STM32以太网MAC出现问题,没有把数据发送出去。对于这种情况,可以通过STM32以太网的MAC loopback功能来检查MAC的收发是否正常。
l  STM32以太网MAC和外部PHY之间的通信出现问题。可以通过PHY提供的loopback功能来检查。
l  设备A端的收发没有问题,问题可能出现在线路上或者设备B。可以通过在网口的接线上做网线交叉,也就是将RJ-45接口中TX+与RX+连接,TX-与RX-连接,来进行检查。

本文将主要介上面提到的STM32MAC loopback方法。
MAC loopback模式
MAC loopback模式的使能很简单,将ETH_MACCR寄存器的LM位置位就可以了。
MAC loopback模式使能后,MAC发送的数据帧通过MII接口发送给外部PHY的同时也发送到MAC接收端。这里需要注意的是STM32 MAC loopback模式只支持在MII接口下工作。



使用特权

评论回复
沙发
cr315|  楼主 | 2022-5-12 09:36 | 只看该作者
但要正确的接收到loopback的数据,还需要注意一下几个地方:

l  MAC loopback模式下,MII接口的接收时钟(RX_CLK)和发送时钟(TX_CLK)还需要外部PHY来提供,所以PHY的初始化不能省。
l  以太网帧中的目标MAC地址应该和源MAC地址一样,或者设定为广播地址(FF:FF:FF:FF:FF:FF),否则MAC默认将会过滤接收到的数据。或者将ETH_MACFFR寄存器的RA置位,以接收所有的以太网帧。
l  对于F7,H7这类带有cache的MCU型号,需要注意接收/发送描述符和接收/发送buffer的地址,以及cache属性。因为这部分存放在SRAM的数据CPU和以太网DMA都会去读写,如果使能cache(回写)可能会出现数据不一致的情况。也不能将其定义在STM32F769的DTCM RAM区域。
MAC loopback例程
例程说明
本文基于STM32F769I-EVAL板提供了一个以太网外设测试工程。工程中没有用到TCP/IP协议栈,只通过STM32F7的HAL驱动层,实现了以太网MAC层的数据收发,同时也实现了MAC loopback的功能。这个测试工程的目的是,检测STM32以太网外设的配置是否正确,工作是否正常。
这个例程提供两种工作模式:
l  正常模式
在这种模式下,可以正常与另一个设备(PC或者其他的开发板)通信,也就是可以发送和接收以太网帧。用户可以发送自定义的以太网帧数据,程序会自动构建以太网帧并发送。因为没有实现任何TCP/IP协议,如果想发送IP包或者TCP/UDP包,就需要自己先按照这些包的格式构建好数据。
l  MAC loopback模式
在这种模式下,STM32F769I-EVAL板子发送的数据被直接送回到MII接口的接收端。如果此时网口还连接到另一个设备的话,该设备也是可以接收到数据的。
例程配置
打开例程后,先要做以下的配置:
l  设置目标MAC地址(dst_addr)
如果发送广播,dst_addr设置为FF:FF:FF:FF:FF:FF。如果在MAC loopback模式下,dst_addr设置成和src_addr一样。
l  定义帧数据的类型(frame_type)
可以发送自定义的帧数据类型,或者通用的预先定义好的帧数据类型。比如,如果发送的是IPv4的数据,frame_type就是0x0800;如果发送自定义的类型,则可以使用未被分配的数值。在这个demo中,用的是0x0601。
l  初始化要发送的数据buffer
要发送的数据保存在teststring数组中。请注意,这个数组里只保存应用层要发送的数据,也就是以太网帧格式的数据段,不包括目标/源MAC地址,以太网帧数据类型和CRC校验码。
l  如果不使能MAC loopback功能,则在main.h中注释掉MAC_LOOPBACK_ENABLE宏

使用特权

评论回复
板凳
cr315|  楼主 | 2022-5-12 09:36 | 只看该作者
本帖最后由 cr315 于 2022-5-12 09:41 编辑

修改好以上的参数后,重新编译烧录后运行。
每次按下USER按键,触发一次数据发送。接收到的数据保存在rxbuffer,并且板子上的LD1灯会改变一次状态。

正常模式演示
在正常模式下,为了演示方便我们使用PC与STM32F769I-EVAL连接,在PC上运行XCAP来发送/接收以太网帧数据。
MAC例程端的配置如下:


1. 接收数据测试
打开xcap,构造一个发给STM32F769I-EVAL板的以太网帧。
目标MAC地址:02:00:00:00:00:00
Frame Type: Custom(0x0601)
数据:10字节,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55



使用特权

评论回复
地板
cr315|  楼主 | 2022-5-12 09:45 | 只看该作者
在xcap中,选择创建好的报文,点击发送。

这时就可以在Wireshark里捕获的数据包中看到刚刚发送出去的这个。

同时在STM32F769I-EVAL板这边也收到数据。

2.发送数据测试
按下板上的USER按键,触发一次发送。
此时运行在PC端的Wireshark可以捕获到STM32F769I-EVAL开发板发送的数据

MAC loopback模式演示
定义MAC_LOOPBACK_ENABLE宏,重新编译下载。
按下板上的USER按键,触发一次发送,数据被loopback到接收端。
查看rxbuffer接收到的数据:

使用特权

评论回复
5
Jacquetry| | 2022-10-5 21:36 | 只看该作者
额,没看懂

使用特权

评论回复
6
Pulitzer| | 2022-10-7 09:21 | 只看该作者

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2

使用特权

评论回复
7
Uriah| | 2022-10-7 16:22 | 只看该作者

断优先级有冲突导致UART-RX的正常接收

使用特权

评论回复
8
Bblythe| | 2022-10-7 19:21 | 只看该作者

现实中make_youtiao()这个函数需要处理的数据非常庞大

使用特权

评论回复
9
童雨竹| | 2023-6-1 08:18 | 只看该作者

大部分单片机都带有加密锁定位或者加密字节

使用特权

评论回复
10
Pulitzer| | 2023-6-1 09:21 | 只看该作者

144MHz超标点与晶体有关

使用特权

评论回复
11
公羊子丹| | 2023-6-1 10:24 | 只看该作者

让其作为芯片休眠唤醒脚

使用特权

评论回复
12
公羊子丹| | 2023-6-1 11:17 | 只看该作者

128以上的某些地址为特殊寄存器使用,不能给程序用

使用特权

评论回复
13
Wordsworth| | 2023-6-1 12:20 | 只看该作者

主定时器为TIM1,通道2配置为PWM输出

使用特权

评论回复
14
Uriah| | 2023-6-1 13:23 | 只看该作者

调用make_youtiao()

使用特权

评论回复
15
万图| | 2023-6-1 15:19 | 只看该作者

电压范围称为工作电源电压

使用特权

评论回复
16
Uriah| | 2023-6-1 16:22 | 只看该作者

时钟越快功耗越大、抗电磁干扰能力越弱

使用特权

评论回复
17
帛灿灿| | 2023-6-1 18:18 | 只看该作者

在掌握对象的变化频度时是有效的

使用特权

评论回复
18
Bblythe| | 2023-6-1 19:21 | 只看该作者

B声明的函数名的命名规则很不符合A的口味

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1324

主题

3814

帖子

0

粉丝