新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32以太網MAC Loopback的實現

        STM32以太網MAC Loopback的實現

        作者: 時間:2024-04-16 來源: 收藏

        調試中經常會遇到“設備接收不到數據”,或者“設備發出的數據對端設備收不到”之類的問題。遇到這類
        問題首先要做的是定位問題發生的部位,這樣做的好處就是可以指明下一步調試的方向,縮小分析的范圍。以下圖為例我們
        做個簡單的說明,設備 A 和設備 B 通過通信,現發現設備 B 無法接收設備 A 發送的消息,問題可能出現在幾個地方:
        ? 應用層的程序,或者協議棧出錯,數據根本沒有到 外設。這種情況我們在調試的時候,在以太網輸出
        函數 low_level_output 中打個斷點就可以檢查出來。
        ? 以太網 MAC 出現問題,沒有把數據發送出去。對于這種情況,可以通過 STM32 以太網的 MAC loopback 功
        能來檢查 MAC 的收發是否正常。
        ? STM32 以太網 MAC 和外部 PHY 之間的通信出現問題。可以通過 PHY 提供的 loopback 功能來檢查。
        ? 設備 A 端的收發沒有問題,問題可能出現在線路上或者設備 B。可以通過在網口的接線上做網線交叉,也就是將 RJ-
        45 接口中 TX+與 RX+連接,TX-與 RX-連接,來進行檢查。

        本文引用地址:http://www.104case.com/article/202404/457680.htm

        1713244810621896.png

        本文將主要介紹上面提到的 STM32 MAC loopback 方法。
        MAC loopback 模式
        MAC loopback 模式的使能很簡單,將 ETH_MACCR 寄存器的 LM 位置位就可以了。
        MAC loopback 模式使能后,MAC 發送的數據幀通過 MII 接口發送給外部 PHY 的同時也發送到 MAC 接收端。這里需要注意的是 STM32 MAC loopback 模式只支持在 MII 接口下工作.

        1713244852408828.png

        但要正確的接收到 loopback 的數據,還需要注意一下幾個地方:
        ? MAC loopback 模式下,MII 接口的接收時鐘(RX_CLK)和發送時鐘(TX_CLK)還需要外部 PHY 來提供,所以
        PHY 的初始化不能省。

        ?以太網幀中的目標 MAC 地址應該和源 MAC 地址一樣,或者設定為廣播地址(FF:FF:FF:FF:FF: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 設置為 FF:FF:FF:FF:FF: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 燈會改變一次狀態。

        更多內容,請您下載全文閱讀



        關鍵詞: STM32 以太網 MAC Loopback

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 淅川县| 邵东县| 德州市| 尚志市| 金乡县| 东平县| 黄龙县| 晋城| 化德县| 安丘市| 镇平县| 常德市| 湘潭县| 嘉鱼县| 宜州市| 英山县| 肇东市| 洮南市| 武功县| 大足县| 永新县| 尚志市| 嘉黎县| 胶州市| 巴里| 竹溪县| 扬州市| 乐山市| 武夷山市| 阿坝| 南康市| 富平县| 靖江市| 桓台县| 盐源县| 台东县| 达拉特旗| 青岛市| 济宁市| 铜鼓县| 淄博市|