STMCU小助手
发布时间:2022-7-29 15:59
|
前言 在 STM32 以太网调试中经常会遇到“设备接收不到数据”,或者“设备发出的数据对端设备收不到”之类的问题。遇到这类5 N$ M5 o2 Z7 a; j- l ? 问题首先要做的是定位问题发生的部位,这样做的好处就是可以指明下一步调试的方向,缩小分析的范围。以下图为例我们做个简单的说明,设备 A 和设备 B 通过以太网通信,现发现设备 B 无法接收设备 A 发送的消息,问题可能出现在几个地方: •应用层的程序,或者协议栈出错,数据根本没有到 STM32 以太网外设。这种情况我们在调试的时候,在以太网输出函数 low_level_output 中打个断点就可以检查出来。 •STM32 以太网 MAC 出现问题,没有把数据发送出去。对于这种情况,可以通过 STM32 以太网的 MAC loopback 功能来检查 MAC 的收发是否正常。4 Z3 f) t% f0 c8 z! U8 J •STM32 以太网 MAC 和外部 PHY 之间的通信出现问题。可以通过 PHY 提供的 loopback 功能来检查。 •设备 A 端的收发没有问题,问题可能出现在线路上或者设备 B。可以通过在网口的接线上做网线交叉,也就是将 RJ-45 接口中 TX+与 RX+连接,TX-与 RX-连接,来进行检查。 $ E9 B- \3 q D% H u8 D- W# w % w7 N D* T; W2 b- s/ [
: P& F. M! ?/ Y" i5 o% ]; d 本文将主要介绍上面提到的 STM32 MAC loopback 方法。' z# {, U: u) X % w8 f& }" [% V" \" c0 y2 ^ MAC loopback 模式 MAC loopback 模式的使能很简单,将 ETH_MACCR 寄存器的 LM 位置位就可以了。% J' f1 D, M0 Y* P$ z+ C1 b MAC loopback 模式使能后,MAC 发送的数据帧通过 MII 接口发送给外部 PHY 的同时也发送到 MAC 接收端。这里需要注意的是 STM32 MAC loopback 模式只支持在 MII 接口下工作。, C0 L; q/ F1 A/ _7 ~ . b$ G% ?( ` i
c( U1 H0 [! u" U8 c% H & q) ?; _3 c5 _* E) D0 N7 i 但要正确的接收到 loopback 的数据,还需要注意一下几个地方: •MAC loopback 模式下,MII 接口的接收时钟(RX_CLK)和发送时钟(TX_CLK)还需要外部 PHY 来提供,所以PHY 的初始化不能省。 •以太网帧中的目标 MAC 地址应该和源 MAC 地址一样,或者设定为广播地址(FF:FF:FF:FF:FF:FF),否则 MAC 默认将会过滤接收到的数据。或者将 ETH_MACFFR 寄存器的 RA 置位,以接收所有的以太网帧。 • 对于 F7,H7 这类带有 cache 的 MCU 型号,需要注意接收/发送描述符和接收/发送 buffer 的地址,以及 cache 属性。因为这部分存放在 SRAM 的数据 CPU 和以太网 DMA 都会去读写,如果使能 cache(回写)可能会出现数据不一致的情况。也不能将其定义在 STM32F769 的 DTCM RAM 区域。 w3 c. m$ Z2 q MAC loopback 例程 例程说明 本文基于 STM32F769I-EVAL 板提供了一个以太网外设测试工程。工程中没有用到 TCP/IP 协议栈,只通过 STM32F7 的 HAL驱动层,实现了以太网 MAC 层的数据收发,同时也实现了 MAC loopback 的功能。这个测试工程的目的是,检测 STM32 以+ {% a7 E6 Y8 g2 T# a 太网外设的配置是否正确,工作是否正常。$ t& J& b( F6 l* G) J! O' \ 这个例程提供两种工作模式: •正常模式 在这种模式下,可以正常与另一个设备(PC 或者其他的开发板)通信,也就是可以发送和接收以太网帧。用户可以发送自定义的以太网帧数据,程序会自动构建以太网帧并发送。因为没有实现任何 TCP/IP 协议,如果想发送 IP 包7 a, j/ j+ p0 S$ E$ x 或者 TCP/UDP 包,就需要自己先按照这些包的格式构建好数据。/ y2 [1 r5 k; s •MAC loopback 模式 在这种模式下,STM32F769I-EVAL 板子发送的数据被直接送回到 MII 接口的接收端。如果此时网口还连接到另一个设备的话,该设备也是可以接收到数据的。 ; r/ p/ @% _- ~& q) { 6 ?6 c; u6 F; d: t$ O, K# \ 例程配置 $ q3 ^$ S4 D; P6 Y4 ~% P 打开例程后,先要做以下的配置:. r$ ?) h! S8 C; O •设置目标 MAC 地址(dst_addr)) J' f( q' g8 p$ P 如果发送广播,dst_addr 设置为 FF:FF:FF:FF:FF:FF。- N8 T1 o1 A4 i, z* l3 | 如果在 MAC loopback 模式下,dst_addr 设置成和 src_addr 一样。9 p5 q& H8 c q- N! t& [ •定义帧数据的类型(frame_type)$ E% L% h6 S! \; D) E$ P5 z3 @# w 可以发送自定义的帧数据类型,或者通用的预先定义好的帧数据类型。比如,如果发送的是 IPv4 的数据,frame_type 就是 0x0800;如果发送自定义的类型,则可以使用未被分配的数值。在这个 demo 中,用的是 0x0601。 , T2 p4 L* j- R; _5 s2 m •初始化要发送的数据 buffer% M3 @; C/ `+ v 要发送的数据保存在 teststring 数组中。请注意,这个数组里只保存应用层要发送的数据,也就是以太网帧格式的数据段,不包括目标/源 MAC 地址,以太网帧数据类型和 CRC 校验码。! [; Y7 q! q' h/ E. q2 c •如果不使能 MAC loopback 功能,则在 main.h 中注释掉 MAC_LOOPBACK_ENABLE 宏修改好以上的参数后,重新编译烧录后运行。 每次按下 USER 按键,触发一次数据发送。接收到的数据保存在 rxbuffer,并且板子上的 LD1 灯会改变一次状态。 6 h4 k' {/ o6 Y0 A 5 J2 V+ a3 X0 K; q/ C. G0 J 完整版请查看:附件7 ]0 u" b5 i7 [( |, R* O # t. ?9 S8 O8 Z g ! @; ~8 l- B; x; ~ |
STM32以太网MAC Loopback的实现_V1.pdf
下载445.91 KB, 下载次数: 55
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版
好的 先看看