前言
在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中,選擇創建好的報文,點擊發送。
這時就可以在Wireshark里捕獲的數據包中看到剛剛發送出去的這個。
同時在STM32F769I-EVAL板這邊也收到數據。
2.發送數據測試
按下板上的USER按鍵,觸發一次發送。
此時運行在PC端的Wireshark可以捕獲到STM32F769I-EVAL開發板發送的數據
MAC loopback模式演示
定義MAC_LOOPBACK_ENABLE宏,重新編譯下載。
按下板上的USER按鍵,觸發一次發送,數據被loopback到接收端。
查看rxbuffer接收到的數據:
責任編輯:xj
原文標題:工程師筆記 | STM32以太網 MAC Loopback的實現
文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
-
以太網
+關注
關注
40文章
5452瀏覽量
172192 -
STM32
+關注
關注
2270文章
10915瀏覽量
356778 -
Mac
+關注
關注
0文章
1108瀏覽量
51567
原文標題:工程師筆記 | STM32以太網 MAC Loopback的實現
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論