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

STM32 以太网 MAC Loopback 的实现

[复制链接]
STMCU小助手 发布时间:2022-7-29 15:59
前言
; ]0 R8 u! `' j, C0 i, F/ {' V1 O4 a在 STM32 以太网调试中经常会遇到“设备接收不到数据”,或者“设备发出的数据对端设备收不到”之类的问题。遇到这类
9 W& L$ U! m2 F问题首先要做的是定位问题发生的部位,这样做的好处就是可以指明下一步调试的方向,缩小分析的范围。以下图为例我们做个简单的说明,设备 A 和设备 B 通过以太网通信,现发现设备 B 无法接收设备 A 发送的消息,问题可能出现在几个地方:% t+ P( O/ r! M2 H( [8 r
应用层的程序,或者协议栈出错,数据根本没有到 STM32 以太网外设。这种情况我们在调试的时候,在以太网输出函数 low_level_output 中打个断点就可以检查出来。1 V" T! j* O, z6 P
STM32 以太网 MAC 出现问题,没有把数据发送出去。对于这种情况,可以通过 STM32 以太网的 MAC loopback 能来检查 MAC 的收发是否正常。8 f. J; Q+ p( b( s/ v" W5 ]
STM32 以太网 MAC 和外部 PHY 之间的通信出现问题。可以通过 PHY 提供的 loopback 功能来检查。+ o3 r1 `: p7 i9 X5 k* U. G
设备 A 端的收发没有问题,问题可能出现在线路上或者设备 B。可以通过在网口的接线上做网线交叉,也就是将 RJ-45 接口中 TX+RX+连接,TX-RX-连接,来进行检查。
: X4 x. P1 c, @6 C* K& z# m1 B
' l: t/ d% w* f* O* z5 L' T. k
! K+ e- ^8 X$ h
K[@CIK(4{U4@P`QXH6W6UB8.png
5 E: @4 @' e& r$ h, ]
8 w2 ~) M5 ~2 M4 O  c7 Y

- N9 h3 b4 t8 \# B- Z  }" `本文将主要介绍上面提到的 STM32 MAC loopback 方法。
7 _' v( o3 L- @" R3 p; Y' u4 L$ [( |6 e- l0 L8 f! y, E8 p5 @5 }

1 s! T4 t6 U4 ?7 `: T3 ^, [* `MAC loopback 模式
5 y9 M9 k$ c, R' I: q8 Y2 TMAC loopback 模式的使能很简单,将 ETH_MACCR 寄存器的 LM 位置位就可以了。; ?1 [" l3 X/ |( ^
MAC loopback 模式使能后,MAC 发送的数据帧通过 MII 接口发送给外部 PHY 的同时也发送到 MAC 接收端。这里需要注意的是 STM32 MAC loopback 模式只支持在 MII 接口下工作。
4 u; f) W$ y5 v9 O9 U7 ~, f7 N- V# s
( V' v8 ^; `1 M
76)JS8V8GTL}CY18@~WSJ_W.png
, l9 K9 D  f* }' u9 Y
) r" w: G0 J! A

: D: m8 V& ~. r- [" R3 t" h但要正确的接收到 loopback 的数据,还需要注意一下几个地方:
' }! ]$ a2 E/ Z" u7 G/ rMAC loopback 模式下,MII 接口的接收时钟(RX_CLK)和发送时钟(TX_CLK)还需要外部 PHY 来提供,所以PHY 的初始化不能省。
+ L# d0 N, E, Q( a& h& {4 K3 S以太网帧中的目标 MAC 地址应该和源 MAC 地址一样,或者设定为广播地址(FF:FF:FF:FF:FF:FF),否则 MAC 认将会过滤接收到的数据。或者将 ETH_MACFFR 寄存器的 RA 置位,以接收所有的以太网帧。: i6 o" P. f& O% s- j. e- R7 b, D  \
• 对于 F7,H7 这类带有 cache 的 MCU 型号,需要注意接收/发送描述符和接收/发送 buffer 的地址,以及 cache 属性。因为这部分存放在 SRAM 的数据 CPU 和以太网 DMA 都会去读写,如果使能 cache(回写)可能会出现数据不一致的情况。也不能将其定义在 STM32F769 DTCM RAM 区域。
" A- l  q/ k) ^3 N
8 e& o0 {4 c0 M  f( T  o: z

4 ~1 c. A1 a/ pMAC loopback 例程
' e- l" {( u, p- W4 Z1 P/ w0 H例程说明
+ P7 C# Z5 c7 J  k& ?7 L* W本文基于 STM32F769I-EVAL 板提供了一个以太网外设测试工程。工程中没有用到 TCP/IP 协议栈,只通过 STM32F7 的 HAL驱动层,实现了以太网 MAC 层的数据收发,同时也实现了 MAC loopback 的功能。这个测试工程的目的是,检测 STM32
: i4 `. k+ i8 B" V太网外设的配置是否正确,工作是否正常。
+ Z, p6 h9 R$ X/ k7 a) R) Y这个例程提供两种工作模式:& T! `$ \$ J! v: T( V. m4 M) I
正常模式& z7 C9 l- d3 {$ n( k5 t
在这种模式下,可以正常与另一个设备(PC 或者其他的开发板)通信,也就是可以发送和接收以太网帧。用户可以发送自定义的以太网帧数据,程序会自动构建以太网帧并发送。因为没有实现任何 TCP/IP 协议,如果想发送 IP
' O: Y$ o7 F( S+ m或者 TCP/UDP 包,就需要自己先按照这些包的格式构建好数据。- N: q5 j* S) R7 s
MAC loopback 模式9 M! x' t* J9 I7 i; H+ \4 W
在这种模式下,STM32F769I-EVAL 板子发送的数据被直接送回到 MII 接口的接收端。如果此时网口还连接到另一个设备的话,该设备也是可以接收到数据的。+ B. S6 d$ n7 a& M3 t! x

" x& s5 `& R9 m- G  h  N: W
: X! q, q2 d  x5 J; Q. K7 Y
例程配置 " }( s( ?  M5 ?* K+ {  k
打开例程后,先要做以下的配置:
* L. v  z9 s) V2 W% D3 O* M! }设置目标 MAC 地址(dst_addr* ]7 i2 N# `- Q$ I6 J! P
如果发送广播,dst_addr 设置为 FF:FF:FF:FF:FF:FF。# Q* h: o6 m4 ~" R+ S$ J, f
如果在 MAC loopback 模式下,dst_addr 设置成和 src_addr 一样。
1 G, \: T) \8 ]( H0 j" M5 n定义帧数据的类型(frame_type
1 ?4 [. \3 j. D' Q6 ]可以发送自定义的帧数据类型,或者通用的预先定义好的帧数据类型。比如,如果发送的是 IPv4 的数据,frame_type 就是 0x0800;如果发送自定义的类型,则可以使用未被分配的数值。在这个 demo 中,用的是
0 l4 J5 e# F7 P# d+ l  i  J, y0x0601。
! B/ n* Q- j. N+ S初始化要发送的数据 buffer
& L# b7 h/ a1 V$ h要发送的数据保存在 teststring 数组中。请注意,这个数组里只保存应用层要发送的数据,也就是以太网帧格式的数据段,不包括目标/MAC 地址,以太网帧数据类型和 CRC 校验码。
! `0 {$ B/ E9 i0 k* M- u如果不使能 MAC loopback 功能,则在 main.h 中注释掉 MAC_LOOPBACK_ENABLE 修改好以上的参数后,重新编译烧录后运行。4 v  d0 Q2 _% B. u. m9 k
每次按下 USER 按键,触发一次数据发送。接收到的数据保存在 rxbuffer,并且板子上的 LD1 灯会改变一次状态。 3 h% Q% v$ _4 J8 w: {

: i' E. _3 J0 |9 j7 Y2 i6 w- b1 x完整版请查看:附件
3 e+ v8 |& p7 m6 n% z3 U% R1 W8 {$ v$ T/ S* A: r

& c  {: \/ B* D. o  t  b& D4 G
: [8 j/ n1 s/ E0 c

0 N, {, m4 p7 N. d- i

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

下载

445.91 KB, 下载次数: 34

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

举报

2个回答
wzhigen11 回答时间:2023-1-18 11:19:29
HAO DE
6 r* v& m6 E4 ?/ k$ B8 P- ]+ t8 J
zxy309 回答时间:6 天前

好的 先看看

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版