STM32以太网MAC Loopback的实现

发布者:stampie最新更新时间:2023-06-15 来源: elecfans关键字:STM32  以太网  MAC  Loopback 手机看文章 扫描二维码
随时随地手机看文章

前言

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

应用层的程序,或者协议栈出错,数据根本没有到STM32以太网外设。这种情况我们在调试的时候,在以太网输出函数low_level_output中打个断点就可以检查出来。

STM32以太网MAC出现问题,没有把数据发送出去。对于这种情况,可以通过STM32以太网的MAC loopback功能来检查MAC的收发是否正常。

STM32以太网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的数据,还需要注意一下几个地方:

MAC loopback模式下,MII接口的接收时钟(RX_CLK)和发送时钟(TX_CLK)还需要外部PHY来提供,所以PHY的初始化不能省。

以太网帧中的目标MAC地址应该和源MAC地址一样,或者设定为广播地址(FFFFFF:FF),否则MAC默认将会过滤接收到的数据。或者将ETH_MACFFR寄存器的RA置位,以接收所有的以太网帧。

对于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以太网外设的配置是否正确,工作是否正常。

这个例程提供两种工作模式:

正常模式

在这种模式下,可以正常与另一个设备(PC或者其他的开发板)通信,也就是可以发送和接收以太网帧。用户可以发送自定义的以太网帧数据,程序会自动构建以太网帧并发送。因为没有实现任何TCP/IP协议,如果想发送IP包或者TCP/UDP包,就需要自己先按照这些包的格式构建好数据。

MAC loopback模式

在这种模式下,STM32F769I-EVAL板子发送的数据被直接送回到MII接口的接收端。如果此时网口还连接到另一个设备的话,该设备也是可以接收到数据的。

例程配置

打开例程后,先要做以下的配置:

设置目标MAC地址(dst_addr)

如果发送广播,dst_addr设置为FFFFFF:FF。如果在MAC loopback模式下,dst_addr设置成和src_addr一样。

定义帧数据的类型(frame_type)

可以发送自定义的帧数据类型,或者通用的预先定义好的帧数据类型。比如,如果发送的是IPv4的数据,frame_type就是0x0800;如果发送自定义的类型,则可以使用未被分配的数值。在这个demo中,用的是0x0601。

初始化要发送的数据buffer

要发送的数据保存在teststring数组中。请注意,这个数组里只保存应用层要发送的数据,也就是以太网帧格式的数据段,不包括目标/源MAC地址,以太网帧数据类型和CRC校验码。

如果不使能MAC loopback功能,则在main.h中注释掉MAC_LOOPBACK_ENABLE宏

修改好以上的参数后,重新编译烧录后运行。

每次按下USER按键,触发一次数据发送。接收到的数据保存在rxbuffer,并且板子上的LD1灯会改变一次状态。

正常模式演示

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

MAC例程端的配置如下:


1. 接收数据测试

打开xcap,构造一个发给STM32F769I-EVAL板的以太网帧。

目标MAC地址:020000:00

Frame Type: Custom(0x0601)

数据:10字节,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55



在xcap中,选择创建好的报文,点击发送。

53cb2c7e-48bf-11eb-8b86-12bb97331649.jpg

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

53eb941e-48bf-11eb-8b86-12bb97331649.jpg

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

544b3d2e-48bf-11eb-8b86-12bb97331649.png

2.发送数据测试

按下板上的USER按键,触发一次发送。

此时运行在PC端的Wireshark可以捕获到STM32F769I-EVAL开发板发送的数据

547b7124-48bf-11eb-8b86-12bb97331649.jpg

MAC loopback模式演示

定义MAC_LOOPBACK_ENABLE宏,重新编译下载。

按下板上的USER按键,触发一次发送,数据被loopback到接收端。

查看rxbuffer接收到的数据:

54a33ba0-48bf-11eb-8b86-12bb97331649.png


关键字:STM32  以太网  MAC  Loopback 引用地址:STM32以太网MAC Loopback的实现

上一篇:STM32L1产品线中带A与不带A的差别
下一篇:从STM32到CONST的全局变量

推荐阅读最新更新时间:2024-11-11 12:11

STM32 ADC 多通道16路电压信号采集
下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma. 1.主控电路图: 2. USB转串口电路图 3.LM324电压跟随器电路图 4.滤波电路图 5.16路接口电路图 6.电源电路图 7.16路ADC初始化程序: void Adc_Init(void) { //先初始化IO口 RCC- APB2ENR|=0X7 2; //使能PORTA\PORAB\PORTC口时钟 GPIO
[单片机]
<font color='red'>STM32</font> ADC 多通道16路电压信号采集
STM32中用到的Cortex-M3寄存器说明
在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM公司发布的Cortex-M3 Technical Reference Manual (r2p0)。 在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM手册中寄存器的对应关系如下: 一、NVIC寄存器组 STM32的固件库中有如下定义: typedef struct { vu32 ISER ; u32 RESERVED0 ; vu32 ICER ; u32 RSERVED1 ; vu32 ISPR ; u32 RESERVED2 ;
[单片机]
下一代 macOS 或将支持 Mac 外接到 iPad
之前,Mac 用户和 iPad 用户想要桌面‘互通’,用两个屏幕进行多任务处理,只能通过第三方软件如 Luna Display 来操作。 好消息是,据熟悉 macOS 10.15 开发的人士称,Apple 可能正在开发一款新的 Mac 和 iPad 的显示屏功能,提供原生的‘互通’服务。    它能允许用户将任何应用程序的任何窗口发送到外部显示器上,这个外部显示器可以是连接到 Mac 甚至 iPad 的外部显示器,也就是说,iPad 可以变身 Mac 的扩展屏幕了。    内部称这个新功能为‘Sidecar’,可以通过简单的菜单访问,只要将鼠标悬停在 Mac 应用程序窗口的‘最大化’按钮上就能马上开启,菜单包括全
[嵌入式]
下一代 macOS 或将支持 <font color='red'>Mac</font> 外接到 iPad
STM32串口库函数版例程
定义: TXD1----- PA9-US1-TX RXD1----- PA10-US1-RX 速率:115200,n,8,1 /* Includes ------------------------------------------------------------------*/ #include stm32f10x.h #include platform_config.h #include stm32f10x_usart.h #include misc.h #include stdarg.h /* Private variables ---------------------------------------
[单片机]
STM32 FSMC 详解
LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS:Register Select 寄存器选择 WR:Write 写信号,低电平有效 RD:Read 读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。(这里原作者应该是搞反了,应该是
[单片机]
STM32 USART串口DMA 接收和发送的源码详解!
硬件平台:STM32F103ZET6; 开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。 串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3. 开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是
[单片机]
不到八千的新MacBook Air,有着万元PC都给不了你的快感
2008 年一月,时任苹果 CEO 史蒂夫·乔布斯在全球媒体面前打开了一个标准牛皮纸信封,并从里面取出了一台笔记本电脑。谁也没能想到,信封里的那台「性能羸弱」的笔记本电脑可以在世界范围内,甚至是笔记本电脑发展史上留下如此深刻的印记。没错,那台装在信封里极致纤薄又轻若无物的,不是别人,正式奠定了轻薄笔记本发展方向的 MacBook Air。 在发布后的 12 年里,即使其他厂牌争先恐后的追赶着 MacBook Air 的背影,其中在特定赛道上部分产品更是超越了 MacBook Air,但在 2020 年,MacBook Air 依旧是轻薄笔记本中的标杆产品,即使 windows 阵营端出了 X1 Carbon,SurfaceL
[嵌入式]
不到八千的新MacBook Air,有着万元PC都给不了你的快感
stm32的adc使用(借鉴)
STM32F407_ADC查询模式配置介绍 1.ADC对应管脚介绍 |---管脚------对应ADC----||---管脚------对应ADC----| | PA0 --- ADC123_IN0 || PA1 --- ADC123_IN1 | | PA2 --- ADC123_IN2 || PA3 --- ADC123_IN3 | | PA4 --- ADC12_IN4 || PA5 --- ADC12_IN5 | | PA6 --- ADC12_IN6 || PA7 --- ADC12_IN7 | | PB0 --- ADC12_IN8 || PB1 --- ADC12_IN9 | | PC4 --- ADC12_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved