你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 以太网 MAC Loopback 的实现

[复制链接]
STMCU小助手 发布时间:2022-7-29 15:59
前言 + W5 W% ~! i1 ]. E, q
在 STM32 以太网调试中经常会遇到“设备接收不到数据”,或者“设备发出的数据对端设备收不到”之类的问题。遇到这类# U0 q1 Z) I4 `
问题首先要做的是定位问题发生的部位,这样做的好处就是可以指明下一步调试的方向,缩小分析的范围。以下图为例我们做个简单的说明,设备 A 和设备 B 通过以太网通信,现发现设备 B 无法接收设备 A 发送的消息,问题可能出现在几个地方:
; n& }, ]  K# z/ u" l•应用层的程序,或者协议栈出错,数据根本没有到 STM32 以太网外设。这种情况我们在调试的时候,在以太网输出函数 low_level_output 中打个断点就可以检查出来。
" w! b8 B' D. ~" |/ }0 a•STM32 以太网 MAC 出现问题,没有把数据发送出去。对于这种情况,可以通过 STM32 以太网的 MAC loopback 功能来检查 MAC 的收发是否正常。
. q# w  \9 b8 G* F8 V•STM32 以太网 MAC 和外部 PHY 之间的通信出现问题。可以通过 PHY 提供的 loopback 功能来检查。
# t% ~3 l/ @4 m( j- ]•设备 A 端的收发没有问题,问题可能出现在线路上或者设备 B。可以通过在网口的接线上做网线交叉,也就是将 RJ-45 接口中 TX+与 RX+连接,TX-与 RX-连接,来进行检查。
# H  |% p4 u$ J
3 `' a- H* ?! }# c) m4 y

4 l8 v, S; T- M* | K[@CIK(4{U4@P`QXH6W6UB8.png 3 \, O8 a7 Z7 }) q8 n

" A) N" C5 t: r
5 t2 a9 z9 g  @. y% `- {
本文将主要介绍上面提到的 STM32 MAC loopback 方法。
' x+ j- J6 e" ]) z  u7 P. P$ |3 A8 J0 z" b
6 O- k! t6 e# v  t" c
MAC loopback 模式
' M* C( z# T) m. eMAC loopback 模式的使能很简单,将 ETH_MACCR 寄存器的 LM 位置位就可以了。/ S. I1 N7 E' ^/ [: J0 T+ [1 g
MAC loopback 模式使能后,MAC 发送的数据帧通过 MII 接口发送给外部 PHY 的同时也发送到 MAC 接收端。这里需要注意的是 STM32 MAC loopback 模式只支持在 MII 接口下工作。
1 L0 ?: y" }8 N# y- y& H/ x% p0 c' M/ T7 C& V6 V

& @" q9 y) l+ ]& ^ 76)JS8V8GTL}CY18@~WSJ_W.png
, b) F3 Q! l' y* C1 q7 D9 f0 V0 \0 `' }# Y4 D* @

4 ~/ N& M" H9 c0 K- X但要正确的接收到 loopback 的数据,还需要注意一下几个地方:# k5 ~6 R2 i9 P. q' O# d
•MAC loopback 模式下,MII 接口的接收时钟(RX_CLK)和发送时钟(TX_CLK)还需要外部 PHY 来提供,所以PHY 的初始化不能省。" y( ?7 l, Q4 L6 T9 T8 h1 e
•以太网帧中的目标 MAC 地址应该和源 MAC 地址一样,或者设定为广播地址(FF:FF:FF:FF:FF:FF),否则 MAC 默认将会过滤接收到的数据。或者将 ETH_MACFFR 寄存器的 RA 置位,以接收所有的以太网帧。1 O9 I1 U+ Z9 @. P* w+ }3 y
• 对于 F7,H7 这类带有 cache 的 MCU 型号,需要注意接收/发送描述符和接收/发送 buffer 的地址,以及 cache 属性。因为这部分存放在 SRAM 的数据 CPU 和以太网 DMA 都会去读写,如果使能 cache(回写)可能会出现数据不一致的情况。也不能将其定义在 STM32F769 的 DTCM RAM 区域。. Q& R2 E! J$ b1 Q9 }" n! Y
9 X( x2 G& P- D, f5 R) M

, b. q# E% M' B0 `MAC loopback 例程
, ~8 _7 W4 `% |% l8 M例程说明
, K+ o; C" B: Y3 h) X本文基于 STM32F769I-EVAL 板提供了一个以太网外设测试工程。工程中没有用到 TCP/IP 协议栈,只通过 STM32F7 的 HAL驱动层,实现了以太网 MAC 层的数据收发,同时也实现了 MAC loopback 的功能。这个测试工程的目的是,检测 STM32 以0 g; @' J  H( Z: Y. _! {0 r% k
太网外设的配置是否正确,工作是否正常。* i" o4 X6 z# h+ ~4 X0 j7 w/ ~8 B. [
这个例程提供两种工作模式:
& L9 ~. u. O8 w) {! K•正常模式* y) y- J6 g# J5 T$ y% I
在这种模式下,可以正常与另一个设备(PC 或者其他的开发板)通信,也就是可以发送和接收以太网帧。用户可以发送自定义的以太网帧数据,程序会自动构建以太网帧并发送。因为没有实现任何 TCP/IP 协议,如果想发送 IP 包
! H+ C  u8 d' w& S或者 TCP/UDP 包,就需要自己先按照这些包的格式构建好数据。+ Q+ W3 ]2 u" v: |2 Z: A
•MAC loopback 模式
5 p: ]2 n! o. t' Q在这种模式下,STM32F769I-EVAL 板子发送的数据被直接送回到 MII 接口的接收端。如果此时网口还连接到另一个设备的话,该设备也是可以接收到数据的。
* d( k' m' Y& X
4 z) X% D7 R/ K" ?3 w8 `; F9 b

* n) }, Q3 Y; e7 \, }7 a3 _例程配置 0 G; j7 e2 y1 [' r9 D; U: m
打开例程后,先要做以下的配置:
( `: ?6 D' r* i" ]+ e0 {) F' I& R9 Y•设置目标 MAC 地址(dst_addr)2 c, v: X6 ^) I) ~) M3 }% k7 x
如果发送广播,dst_addr 设置为 FF:FF:FF:FF:FF:FF。8 Z2 F8 O& C& E
如果在 MAC loopback 模式下,dst_addr 设置成和 src_addr 一样。
( C: x, S! T. }* Q! v) k0 n5 L" l•定义帧数据的类型(frame_type)
0 P; w" n# G, }可以发送自定义的帧数据类型,或者通用的预先定义好的帧数据类型。比如,如果发送的是 IPv4 的数据,frame_type 就是 0x0800;如果发送自定义的类型,则可以使用未被分配的数值。在这个 demo 中,用的是- a$ a0 N# Q$ m* g! A
0x0601。 , N7 P# b+ M& \
•初始化要发送的数据 buffer$ u# J+ S5 U* i* Y1 C) M
要发送的数据保存在 teststring 数组中。请注意,这个数组里只保存应用层要发送的数据,也就是以太网帧格式的数据段,不包括目标/源 MAC 地址,以太网帧数据类型和 CRC 校验码。
2 H  p; E: A" w8 _•如果不使能 MAC loopback 功能,则在 main.h 中注释掉 MAC_LOOPBACK_ENABLE 宏修改好以上的参数后,重新编译烧录后运行。& u# q- v4 l% \, Y- m" S4 x
每次按下 USER 按键,触发一次数据发送。接收到的数据保存在 rxbuffer,并且板子上的 LD1 灯会改变一次状态。 1 d4 k( _" O( e9 @/ s9 M
! U3 F  g' n7 @  O
完整版请查看:附件
- d. k4 q5 j# W8 n, L! g4 m" u* J4 o+ C$ T1 p
9 U) {* d) P6 L: t! ^$ H
- T* d4 Q, j% J8 ]6 l/ T$ F
3 G* i/ X' K. S7 P1 L

STM32以太网MAC Loopback的实现_V1.pdf

下载

445.91 KB, 下载次数: 55

赞 收藏 评论2 发布时间:2022-7-29 15:59

举报

2个回答
wzhigen11 回答时间:2023-1-18 11:19:29
HAO DE
3 ]. U/ i4 _  `9 c$ D
zxy309 回答时间:2024-10-30 11:16:01

好的 先看看

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版