STM32 以太網(wǎng) MAC Loopback的實(shí)現(xiàn)
前言
在STM32以太網(wǎng)調(diào)試中經(jīng)常會(huì)遇到“設(shè)備接收不到數(shù)據(jù)”,或者“設(shè)備發(fā)出的數(shù)據(jù)對(duì)端設(shè)備收不到”之類的問(wèn)題。遇到這類問(wèn)題首先要做的是定位問(wèn)題發(fā)生的部位,這樣做的好處就是可以指明下一步調(diào)試的方向,縮小分析的范圍。以下圖為例我們做個(gè)簡(jiǎn)單的說(shuō)明,設(shè)備A和設(shè)備B通過(guò)以太網(wǎng)通信,現(xiàn)發(fā)現(xiàn)設(shè)備B無(wú)法接收設(shè)備A發(fā)送的消息,問(wèn)題可能出現(xiàn)在幾個(gè)地方:
應(yīng)用層的程序,或者協(xié)議棧出錯(cuò),數(shù)據(jù)根本沒有到STM32以太網(wǎng)外設(shè)。這種情況我們?cè)谡{(diào)試的時(shí)候,在以太網(wǎng)輸出函數(shù)low_level_output中打個(gè)斷點(diǎn)就可以檢查出來(lái)。
STM32以太網(wǎng)MAC出現(xiàn)問(wèn)題,沒有把數(shù)據(jù)發(fā)送出去。對(duì)于這種情況,可以通過(guò)STM32以太網(wǎng)的MAC loopback功能來(lái)檢查MAC的收發(fā)是否正常。
STM32以太網(wǎng)MAC和外部PHY之間的通信出現(xiàn)問(wèn)題。可以通過(guò)PHY提供的loopback功能來(lái)檢查。
設(shè)備A端的收發(fā)沒有問(wèn)題,問(wèn)題可能出現(xiàn)在線路上或者設(shè)備B。可以通過(guò)在網(wǎng)口的接線上做網(wǎng)線交叉,也就是將RJ-45接口中TX+與RX+連接,TX-與RX-連接,來(lái)進(jìn)行檢查。
本文將主要介紹上面提到的STM32 MAC loopback方法。
MAC loopback模式
MAC loopback模式的使能很簡(jiǎn)單,將ETH_MACCR寄存器的LM位置位就可以了。
MAC loopback模式使能后,MAC發(fā)送的數(shù)據(jù)幀通過(guò)MII接口發(fā)送給外部PHY的同時(shí)也發(fā)送到MAC接收端。這里需要注意的是STM32 MAC loopback模式只支持在MII接口下工作。
但要正確的接收到loopback的數(shù)據(jù),還需要注意一下幾個(gè)地方:
MAC loopback模式下,MII接口的接收時(shí)鐘(RX_CLK)和發(fā)送時(shí)鐘(TX_CLK)還需要外部PHY來(lái)提供,所以PHY的初始化不能省。
以太網(wǎng)幀中的目標(biāo)MAC地址應(yīng)該和源MAC地址一樣,或者設(shè)定為廣播地址(FFFFFF:FF),否則MAC默認(rèn)將會(huì)過(guò)濾接收到的數(shù)據(jù)。或者將ETH_MACFFR寄存器的RA置位,以接收所有的以太網(wǎng)幀。
對(duì)于F7,H7這類帶有cache的MCU型號(hào),需要注意接收/發(fā)送描述符和接收/發(fā)送buffer的地址,以及cache屬性。因?yàn)檫@部分存放在SRAM的數(shù)據(jù)CPU和以太網(wǎng)DMA都會(huì)去讀寫,如果使能cache(回寫)可能會(huì)出現(xiàn)數(shù)據(jù)不一致的情況。也不能將其定義在STM32F769的DTCM RAM區(qū)域。
MAC loopback例程
例程說(shuō)明
本文基于STM32F769I-EVAL板提供了一個(gè)以太網(wǎng)外設(shè)測(cè)試工程。工程中沒有用到TCP/IP協(xié)議棧,只通過(guò)STM32F7的HAL驅(qū)動(dòng)層,實(shí)現(xiàn)了以太網(wǎng)MAC層的數(shù)據(jù)收發(fā),同時(shí)也實(shí)現(xiàn)了MAC loopback的功能。這個(gè)測(cè)試工程的目的是,檢測(cè)STM32以太網(wǎng)外設(shè)的配置是否正確,工作是否正常。
這個(gè)例程提供兩種工作模式:
正常模式
在這種模式下,可以正常與另一個(gè)設(shè)備(PC或者其他的開發(fā)板)通信,也就是可以發(fā)送和接收以太網(wǎng)幀。用戶可以發(fā)送自定義的以太網(wǎng)幀數(shù)據(jù),程序會(huì)自動(dòng)構(gòu)建以太網(wǎng)幀并發(fā)送。因?yàn)闆]有實(shí)現(xiàn)任何TCP/IP協(xié)議,如果想發(fā)送IP包或者TCP/UDP包,就需要自己先按照這些包的格式構(gòu)建好數(shù)據(jù)。
MAC loopback模式
在這種模式下,STM32F769I-EVAL板子發(fā)送的數(shù)據(jù)被直接送回到MII接口的接收端。如果此時(shí)網(wǎng)口還連接到另一個(gè)設(shè)備的話,該設(shè)備也是可以接收到數(shù)據(jù)的。
例程配置
打開例程后,先要做以下的配置:
設(shè)置目標(biāo)MAC地址(dst_addr)
如果發(fā)送廣播,dst_addr設(shè)置為FFFFFF:FF。如果在MAC loopback模式下,dst_addr設(shè)置成和src_addr一樣。
定義幀數(shù)據(jù)的類型(frame_type)
可以發(fā)送自定義的幀數(shù)據(jù)類型,或者通用的預(yù)先定義好的幀數(shù)據(jù)類型。比如,如果發(fā)送的是IPv4的數(shù)據(jù),frame_type就是0x0800;如果發(fā)送自定義的類型,則可以使用未被分配的數(shù)值。在這個(gè)demo中,用的是0x0601。
初始化要發(fā)送的數(shù)據(jù)buffer
要發(fā)送的數(shù)據(jù)保存在teststring數(shù)組中。請(qǐng)注意,這個(gè)數(shù)組里只保存應(yīng)用層要發(fā)送的數(shù)據(jù),也就是以太網(wǎng)幀格式的數(shù)據(jù)段,不包括目標(biāo)/源MAC地址,以太網(wǎng)幀數(shù)據(jù)類型和CRC校驗(yàn)碼。
如果不使能MAC loopback功能,則在main.h中注釋掉MAC_LOOPBACK_ENABLE宏
修改好以上的參數(shù)后,重新編譯燒錄后運(yùn)行。
每次按下USER按鍵,觸發(fā)一次數(shù)據(jù)發(fā)送。接收到的數(shù)據(jù)保存在rxbuffer,并且板子上的LD1燈會(huì)改變一次狀態(tài)。
正常模式演示
在正常模式下,為了演示方便我們使用PC與STM32F769I-EVAL連接,在PC上運(yùn)行XCAP來(lái)發(fā)送/接收以太網(wǎng)幀數(shù)據(jù)。
MAC例程端的配置如下:
1. 接收數(shù)據(jù)測(cè)試
打開xcap,構(gòu)造一個(gè)發(fā)給STM32F769I-EVAL板的以太網(wǎng)幀。
目標(biāo)MAC地址:020000:00
Frame Type: Custom(0x0601)
數(shù)據(jù):10字節(jié),0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55
在xcap中,選擇創(chuàng)建好的報(bào)文,點(diǎn)擊發(fā)送。
這時(shí)就可以在Wireshark里捕獲的數(shù)據(jù)包中看到剛剛發(fā)送出去的這個(gè)。
同時(shí)在STM32F769I-EVAL板這邊也收到數(shù)據(jù)。
2.發(fā)送數(shù)據(jù)測(cè)試
按下板上的USER按鍵,觸發(fā)一次發(fā)送。
此時(shí)運(yùn)行在PC端的Wireshark可以捕獲到STM32F769I-EVAL開發(fā)板發(fā)送的數(shù)據(jù)
MAC loopback模式演示
定義MAC_LOOPBACK_ENABLE宏,重新編譯下載。
按下板上的USER按鍵,觸發(fā)一次發(fā)送,數(shù)據(jù)被loopback到接收端。
查看rxbuffer接收到的數(shù)據(jù):
責(zé)任編輯:xj
原文標(biāo)題:工程師筆記 | STM32以太網(wǎng) MAC Loopback的實(shí)現(xiàn)
文章出處:【微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5427瀏覽量
171841 -
STM32
+關(guān)注
關(guān)注
2270文章
10904瀏覽量
356350 -
Mac
+關(guān)注
關(guān)注
0文章
1107瀏覽量
51519
原文標(biāo)題:工程師筆記 | STM32以太網(wǎng) MAC Loopback的實(shí)現(xiàn)
文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論