STM32以太網(wǎng)MAC Loopback的實(shí)現
在 STM32 以太網(wǎng)調試中經(jīng)常會(huì )遇到“設備接收不到數據”,或者“設備發(fā)出的數據對端設備收不到”之類(lèi)的問(wèn)題。遇到這類(lèi)
問(wèn)題首先要做的是定位問(wèn)題發(fā)生的部位,這樣做的好處就是可以指明下一步調試的方向,縮小分析的范圍。以下圖為例我們
做個(gè)簡(jiǎn)單的說(shuō)明,設備 A 和設備 B 通過(guò)以太網(wǎng)通信,現發(fā)現設備 B 無(wú)法接收設備 A 發(fā)送的消息,問(wèn)題可能出現在幾個(gè)地方:
? 應用層的程序,或者協(xié)議棧出錯,數據根本沒(méi)有到 STM32 以太網(wǎng)外設。這種情況我們在調試的時(shí)候,在以太網(wǎng)輸出
函數 low_level_output 中打個(gè)斷點(diǎn)就可以檢查出來(lái)。
? STM32 以太網(wǎng) MAC 出現問(wèn)題,沒(méi)有把數據發(fā)送出去。對于這種情況,可以通過(guò) STM32 以太網(wǎng)的 MAC loopback 功
能來(lái)檢查 MAC 的收發(fā)是否正常。
? STM32 以太網(wǎng) MAC 和外部 PHY 之間的通信出現問(wèn)題??梢酝ㄟ^(guò) PHY 提供的 loopback 功能來(lái)檢查。
? 設備 A 端的收發(fā)沒(méi)有問(wèn)題,問(wèn)題可能出現在線(xiàn)路上或者設備 B??梢酝ㄟ^(guò)在網(wǎng)口的接線(xiàn)上做網(wǎng)線(xiàn)交叉,也就是將 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ā)送的數據幀通過(guò) MII 接口發(fā)送給外部 PHY 的同時(shí)也發(fā)送到 MAC 接收端。這里需要注意的是 STM32 MAC loopback 模式只支持在 MII 接口下工作.
但要正確的接收到 loopback 的數據,還需要注意一下幾個(gè)地方:
? MAC loopback 模式下,MII 接口的接收時(shí)鐘(RX_CLK)和發(fā)送時(shí)鐘(TX_CLK)還需要外部 PHY 來(lái)提供,所以
PHY 的初始化不能省。
?以太網(wǎng)幀中的目標 MAC 地址應該和源 MAC 地址一樣,或者設定為廣播地址(FF:FF:FF:FF:FF:FF),否則 MAC 默
認將會(huì )過(guò)濾接收到的數據?;蛘邔?ETH_MACFFR 寄存器的 RA 置位,以接收所有的以太網(wǎng)幀。
? 對于 F7,H7 這類(lèi)帶有 cache 的 MCU 型號,需要注意接收/發(fā)送描述符和接收/發(fā)送 buffer 的地址,以及 cache 屬
性。因為這部分存放在 SRAM 的數據 CPU 和以太網(wǎng) DMA 都會(huì )去讀寫(xiě),如果使能 cache(回寫(xiě))可能會(huì )出現數據不
一致的情況。也不能將其定義在 STM32F769 的 DTCM RAM 區域.
MAC loopback 例程
例程說(shuō)明
本文基于 STM32F769I-EVAL 板提供了一個(gè)以太網(wǎng)外設測試工程。工程中沒(méi)有用到 TCP/IP 協(xié)議棧,只通過(guò) STM32F7 的 HAL驅動(dòng)層,實(shí)現了以太網(wǎng) MAC 層的數據收發(fā),同時(shí)也實(shí)現了 MAC loopback 的功能。這個(gè)測試工程的目的是,檢測 STM32 以太網(wǎng)外設的配置是否正確,工作是否正常。
這個(gè)例程提供兩種工作模式:
? 正常模式
在這種模式下,可以正常與另一個(gè)設備(PC 或者其他的開(kāi)發(fā)板)通信,也就是可以發(fā)送和接收以太網(wǎng)幀。用戶(hù)可以
發(fā)送自定義的以太網(wǎng)幀數據,程序會(huì )自動(dòng)構建以太網(wǎng)幀并發(fā)送。因為沒(méi)有實(shí)現任何 TCP/IP 協(xié)議,如果想發(fā)送 IP 包
或者 TCP/UDP 包,就需要自己先按照這些包的格式構建好數據。
? MAC loopback 模式
在這種模式下,STM32F769I-EVAL 板子發(fā)送的數據被直接送回到 MII 接口的接收端。如果此時(shí)網(wǎng)口還連接到另一個(gè)
設備的話(huà),該設備也是可以接收到數據的。
例程配置
打開(kāi)例程后,先要做以下的配置:
? 設置目標 MAC 地址(dst_addr)
如果發(fā)送廣播,dst_addr 設置為 FF:FF:FF:FF:FF:FF。
如果在 MAC loopback 模式下,dst_addr 設置成和 src_addr 一樣。
? 定義幀數據的類(lèi)型(frame_type)
可以發(fā)送自定義的幀數據類(lèi)型,或者通用的預先定義好的幀數據類(lèi)型。比如,如果發(fā)送的是 IPv4 的數據,
frame_type 就是 0x0800;如果發(fā)送自定義的類(lèi)型,則可以使用未被分配的數值。在這個(gè) demo 中,用的是
0x0601。
? 初始化要發(fā)送的數據 buffer
要發(fā)送的數據保存在 teststring 數組中。請注意,這個(gè)數組里只保存應用層要發(fā)送的數據,也就是以太網(wǎng)幀格式的數
據段,不包括目標/源 MAC 地址,以太網(wǎng)幀數據類(lèi)型和 CRC 校驗碼。
? 如果不使能 MAC loopback 功能,則在 main.h 中注釋掉 MAC_LOOPBACK_ENABLE 宏
修改好以上的參數后,重新編譯燒錄后運行。
每次按下 USER 按鍵,觸發(fā)一次數據發(fā)送。接收到的數據保存在 rxbuffer,并且板子上的 LD1 燈會(huì )改變一次狀態(tài)。
更多內容,請您下載全文閱讀。
評論