SAM4E單片機之旅——22、GMAC和PHY的介紹與初始化

2020-11-27 電子產品世界

  網絡通信的作用不用多說,而這次進行的工作即是對乙太網通信過程中,需要用到的硬體部分進行初始化,也介紹了發送和接收數據的方法。

本文引用地址:http://www.eepw.com.cn/article/201704/358580.htm

  由於較為複雜,所以使用了ASF框架。但是也會對用到的庫函數的實現做一個介紹。

  一、 MAC、PHY和MII

  IEEE 802.3是現在常用的乙太網標準,它定義了物理層(Physical Layer, PHY)和介質訪問控制層(Media Access Control, MAC)的標準。另外,在OSI模型中,MAC則處於數據鏈路層的底層。

  而在硬體實現上,M4使用的GMAC外設實現了802.3中MAC的功能。開發板攜帶型號為KSZ8051MNL的PHY晶片以及RJ45接口則實現了物理層的功能:

 

  MAC和PHY之間交互的接口則是介質獨立接口(Media Independent Interface,MII)。MII包含一個數據通信接口,以及一個管理接口(Management Data Input/Output ,MDIO)。由於PHY的接口是面向MAC的,所以我們需要通過MAC來對PHY進行管理及數據交互。

  另外,更早制定的Ethernet II幀則是現在乙太網傳輸中常使用的幀格式。

  二、 GMAC的DMA緩衝區

  GMAC使用了一個DMA接口。和M4的通用DMAC一樣,它也可以自動進行多次傳輸,但是方式稍微有點區別。GMAC的DMA 對發送和接收使用不同的緩衝區列表,而緩衝區描述符列表是一個數組,而不是DMAC所使用的鍊表。數組的起始位置保存在寄存器(GMAC_RBQB、GMAC_TBQB)中,且緩衝區描述符中有一個欄位(Wrap)指示其是否為數組中的最後一個描述符。如接收緩衝區:

    

 

  在工作過程中,DMA會順序訪問每個緩衝區描述符,而在訪問最後一個描述符時,就會重新開始遍歷。

  對於接收緩衝,列表中每一個緩衝區的長度是一樣的,這個長度由DMA配置寄存器(GMAC_DCFGR)中的DRBS欄位指定。在DMA將數據寫入接收緩衝時,也會設置描述符相應的欄位,以表明每幀的起始與結束;同時,也會標註相關的信息,如是否為廣播幀等。

  對於發送緩衝,其幀長度、是否需要添加CRC等控制信息也均在描述符中表示。在準備好數據後,向GMAC_NCR寄存器寫入TSTART欄位即可觸發發送操作。

  三、 使用ASF初始化GMAC

  由於PHY是通過MAC訪問的,所有在設置PHY前要完成GMAC的設置。

  GMAC約有94個寄存器,其中約有40個為統計寄存器,約15個寄存器與1588和PTP相關,約15個寄存器與特殊地址和ID有關。另外,在有些狀態寄存器中,需要向特定位寫入1才會清除該位的狀態。

  使用的ASF模塊為Ethernet GMAC,然後conf_eth.h中可以設置MAC地址,IP位址,子網掩碼,網關以及緩衝區大小等參數。

  然後調用gmac_dev_init( ) 函數即可對GMAC進行初始化:

  pmc_enable_periph_clk(ID_GMAC);

  // MAC地址

  uint8_t mac_address[] =

  { ETHERNET_CONF_ETHADDR0, ETHERNET_CONF_ETHADDR1,

  ETHERNET_CONF_ETHADDR2,ETHERNET_CONF_ETHADDR3,

  ETHERNET_CONF_ETHADDR4, ETHERNET_CONF_ETHADDR5

  };

  // GMAC選項

  gmac_options_t gmac_option;

  gmac_option.uc_copy_all_frame = 0; // 不拷貝所有幀

  gmac_option.uc_no_boardcast = 0; // 不忽略廣播

  memcpy(gmac_option.uc_mac_addr,

  mac_address, sizeof(mac_address)); //拷貝MAC地址

  // GMAC驅動設置

  gmac_device_t gmac_dev;

  gs_gmac_dev.p_hw = GMAC; // 指定GMAC寄存器基址

  // 初始化GMAC

  gmac_dev_init(GMAC, &gmac_dev, &gmac_option);

  gmac_dev_init(Gmac* p_gmac, gmac_device_t* p_gmac_dev, gmac_options_t* p_opt) 函數完成了以下的工作:

  禁用發送接收,禁用GMAC所有中斷;清除統計寄存器,以及發送接受狀態寄存器。

  設置GMAC_NCFGR寄存器。根據p_opt,判斷是否拷貝所有幀,以及是否忽略廣播。同時,追加GMAC_NCFGR_PEN 和 GMAC_NCFGR_IRXFCS位。(我覺得這裡應該是個BUG,從其注釋判斷需要追加的應該是GMAC_NCFGR_RFCS位)

  設置好DMA緩衝,然後調用gmac_init_mem( ) 對緩衝區描述符等進行初始化。這個函數裡也會使能發送和接收,同時也會啟用一系列的中斷。設置完成後,DMA緩衝的信息將儲存在p_gmac_dev中。

  將MAC地址寫入特別地址寄存器1。

  四、 PHY的地址

  在MDIO通信過程中,每個PHY都會有一個4位的地址。而開發板攜帶的KSZ8051MNL晶片,可以在上電或復位時,根據引腳設置地址的低3位:

    

 

  在開發板中,上電時PHYAD[2:0]的值為001,即其地址為0x1。

  特別指出,地址0可作為該晶片的廣播地址,而開發板也做了這樣的配置。另外,在ASF中,錯誤地將PHY的地址定義成了0。這樣能正確工作的原因僅是0為廣播地址,而開發板只有一個PHY晶片。嚴謹起見,將這個地址修改為正確的值:

  #ifdef BOARD_GMAC_PHY_ADDR

  #undef BOARD_GMAC_PHY_ADDR

  #endif

  #define BOARD_GMAC_PHY_ADDR 1

  五、 在ASF中使用PHY

  使用的模塊為Ethernet Physical Transceiver。需要在conf_board.h 中聲明宏:

  /* 使用 ETH PHY: KSZ8051MNL */

  #define CONF_BOARD_KSZ8051MNL

  初始化。

  在PHY上電後,需要等待一段時間讓其運行穩定。之後就可以對其進行初始化了:

  if (ethernet_phy_init(GMAC, BOARD_GMAC_PHY_ADDR,sysclk_get_cpu_hz())

  != GMAC_OK) {

  puts("PHY Initialize ERROR!\r");

  return -1;

  }

  在該ethernet_phy_init( ) 函數中,完成了以下工作:

  設置MDIO的時鐘MDC。

  通過MDIO向PHY發送重置命令。

  檢查地址是否正確。檢查的邏輯是先讀取PHY的PHYID1的內容,再判斷讀出的內容是否正確。KSZ8051MNL晶片中,該寄存器的值是0x22。

  如果地址無效的話,因為MDIO有效地址只有32個,就遍歷這些地址。然後使用檢查出的新地址重新發送一次重置命令。

  如果初始化成功,則返回GMAC_OK。

  自協商。

  然後需要讓PHY協商通信速率、雙工模式:

  ethernet_phy_auto_negotiate(GMAC, BOARD_GMAC_PHY_ADDR);

  if (ethernet_phy_set_link(GMAC, BOARD_GMAC_PHY_ADDR, 0)

  != GMAC_OK) {

  puts("Set link ERROR!\r");

  return -1;

  }

  ethernet_phy_auto_negotiate() 函數就會完成PHY的協商工作,然後根據協商的結果設置GMAC的速率、雙工模式。ethernet_phy_set_link() 函數則會檢查鏈路的狀態,同時可以根據參數(第3個)應用PHY的自協商結果至GMAC中。

  中斷處理。

  ASF的GMAC模塊需要獲取相關的中斷,以進行相關的工作:如更新發送緩衝區描述符相關的信息,或是調用用戶定義的回調函數等。

  // 需要在NVIC中啟用相關中斷

  void GMAC_Handler(void)

  {

  gmac_handler(&gs_gmac_dev);

  }

  數據接收。

  先準備好一個緩衝,然後就可以調用gmac_dev_read() 讀取出接收到的幀的內容。

  //#define GMAC_FRAME_LENTGH_MAX 1536

  uint8_t eth_buffer[GMAC_FRAME_LENTGH_MAX];

  uint32_t frm_size;

  gmac_dev_read(&gmac_dev, (uint8_t *) eth_buffer,

  sizeof(eth_buffer), &frm_size);

  數據發送。

  gmac_dev_write(&gmac_dev, (uint8_t *)eth_buffer, frm_size, NULL);

  通過該函數即可使用GMAC發送數據,第4個參數是發送完成後的回調函數。該回調函數時是在gmac_handler() 中被調用的。

相關焦點

  • 單片機控制TFT液晶屏顯示數字
    單片機控制TFT液晶屏顯示數字,此工程的硬體部分如下  單片機部分液晶電路接下來就是軟體部分程序的編寫,我們先來看main函數,main函數如下main函數裡做了3件事,第一件就是對TFT液晶屏的初始化,包括對TFT液晶屏接口的初始化和驅動晶片
  • 一文看懂STC單片機冷啟動和復位有什麼區別
    打開APP 一文看懂STC單片機冷啟動和復位有什麼區別 發表於 2018-04-03 09:13:22 還支持ISP下載,不用編程器,只要一個MAX232和一些廉價的元件就能寫程序,可擦寫10萬次。因此是一款很好用的單片機。
  • 如何利用MCS-51單片機對周期波頻率進行測量
    本文介紹了用目前應用比較廣泛的MCS-51系列單片機對周期波頻率進行測量,並通過LED以數字形式直觀地示出頻率,實現測量的智能化,省去間接對頻率計算的麻煩與錯誤。文章對其測量原理,設計和實現作了說明,介紹了主要程序,並進行了誤差分析。 目前單片機廣泛應用到國民經濟建設和日常生活的許多領域,成為測控技術現代化不可缺少的重要工具。
  • 基於C8051F040單片機的CAN總線和RS-232串口通信設計
    為了實現對CAN總線和RS-232串口雙向通信需求,提出了一種基於C8051F040單片機的數據通信方案,並完成系統設計。分析了CAN總線和RS-232串口的通信特點,介紹了單片機硬體,並對軟體的設計思路與流程做了詳盡描述,完成功能檢測。實驗結果表明,該設計達到了要求。
  • AT89S51單片機的復位操作及復位電路設計
    復位是單片機的初始化操作,只需給AT89S51的復位引腳RST加上大於2個機器周期(即24個時鐘振蕩周期)的高電平就可使AT89S51復位。 復位操作 當AT89S51進行復位時,PC初始化為OOOOH,使AT89S51單片機從程序存儲器的OOOOH單元開始執行程序。除了進入系統的正常初始化之外,當程序運行出錯(如程序「跑飛」)或操作錯誤使系統處於「死鎖」狀態時,也需按復位鍵即RST腳為高電平,使AT89S51擺脫「跑飛」或「死鎖」狀態而重新啟動程序。
  • 單片機復位電路作用原理以及與置位的區別
    關於單片機的置位和復位,都是為了把電路初始化到一個確定的狀態,一般來說,單片機復位電路作用是把一個例如狀態機初始化到空狀態,而在單片機內部,復位的時候單片機是把一些寄存器以及存儲設備裝入廠商預設的一個值。
  • 基於51單片機和IC射頻卡的射頻識別門禁系統設計
    本文引用地址:http://www.eepw.com.cn/article/201712/373673.htm  基於單片機和射頻識別技術的門禁系統是基於單片機STC89C52和IC射頻卡設計的射頻識別鎖系統,可用於實驗室、機房、辦公樓、檔案室、財務室等安全性要求較高的場所.
  • 單片機最小系統復位電路圖原理
    復位電路圖 復位電路圖單片機的置位和復位,都是為了把電路初始化到一個確定的狀態,一般來說,單片機復位電路作用是把一個例如狀態機初始化到空狀態,而在單片機內部,復位的時候單片機是把一些寄存器以及存儲設備裝入廠商預設的一個值。
  • 基於單片機的軌道壓力測試儀的實現
    系統的組成及其工作原理      本系統以PIC16F876A單片機為核心,通過軟體編程實現其對數據處理、系統實時控制。系統框圖如圖1所示,由主控MCU模塊、A/D採樣模塊、電源管理模塊、顯示模塊和傳感器組成。
  • 單片機霍爾測速_單片機霍爾測速程序 - CSDN
    和顯示當前的pwm佔空比0~100%。· 4.電機的速度可以通過按鍵調整,也可以開始暫停,正轉和反轉。注意:磁鐵和霍爾元件最近距離在2mm左右,太近可能會在電機轉動時碰到霍爾元件,太遠霍爾元件可能會檢測不到磁鐵。使用說明:液晶屏第一行顯示電機轉速,第二行顯示佔空比,佔空比數值越大,電機轉速越快。
  • 如何判斷單片機是否起振,如何判斷晶振的好壞?
    該怎麼判斷單片機是否起振?如何判斷晶振好壞?這一共有兩個問題,先說說怎麼判斷晶振好壞,晶振是CPU的心臟,晶振好壞直接影響CPU是否能夠正常工作,晶振輸出是一個非常有規律的時鐘波形,想要知道晶振是否有問題,直接使用示波器測量晶振的輸出即可。
  • STC單片機的種類與區別介紹
    在任何一款STC單片機的數據手冊裡都有對型號的分析介紹,可是現代社會,人們都很急躁,哪有時間仔細看數據手冊呀。於是我就接到了這些不難解釋的問題了。現在我在此做一個介紹文章,以後再有問到此問題的,我就直接讓他來看文章。我們來分析一下STC單片機的型號的意義吧。
  • 單片機應用系統的可靠性設計
    單片機應用系統的設計包括功能性設計、可靠性設計和產品化設計。其中,功能性是基礎,可靠性是保障,產品化是前途。因此,從事單片機應用系統開發工作的設計人員必須掌握可靠性設計。單片機應用系統普遍採用CMOS器件,因此,經常的運行狀態有靜態運行與動態運行之分。 靜態運行是指單片機在休閒或掉電方式下的工作狀態。 此時,單片機指令停止運行。 外圍電路被關斷或電源被關斷,系統中只有值守電路在工作。
  • STC12系列單片機解密介紹
    STC單片機是由深圳宏晶公司銷售的一款單片機晶片,至於設計和生產,有很多說法,網絡上可以查到的資料,有的說是美國公司按照SST公司的內核設計的,由宏晶公司貼牌銷售的,也有的說是由ST公司設計的。至於生產的說法更多,有的說是由臺積電生產。有的說是由臺灣其它公司代工生產的。
  • 一種基於MSP430單片機的交流頻率檢測系統
    系統的硬體部分主要由MSP430單片機以及整流橋、光電耦合器、三級管等器件構成;而軟體部分主要是基於MSP430單片機的C語言程序,包括系統的初始化、定時器的設置等。該系統的實驗結果和電路仿真吻合較好,具有一定的應用價值。
  • 基於MCS-51單片機和步進電機實現鍋爐筒壁孔加工控制系統的設計
    小拖板橫向移動以實現刀具的快進和工進。系統具有點動對刀、自動加工、暫停和繼續、急停報警、回零等主要功能。 2、 硬體結構與功能 系統硬體分布於一塊控制主板和兩塊驅動板上。 在以8031單片機為主的控制主板上,擴展一片27256EPROM,用於存放系統軟體,一片2764EPROM,用於固化經過調試的零件加工程序,一片帶掉電保護的6264RAM,用於隨機存儲手工編輯的零件加工程序。另外擴展一片8255並行I/O口,其B口用於輸出步進電機控制信號、C口和A口用於鍵盤和顯示器接口。
  • 基於STM32單片機啟動文件的作用和啟動過程解析
    基於STM32單片機啟動文件的作用和啟動過程解析 工程師周亮 發表於 2018-11-09 16:15:19 一、啟動文件的作用是: 1.初始化堆棧指針
  • 基於瑞薩QzROM單片機的EFT抗幹擾措施
    摘要:主要介紹了瑞薩QZROM單片機應用中的幾種EFT抗幹擾措施。本文引用地址:http://www.eepw.com.cn/article/117275.htm  關鍵詞:QzROM單片機;EFT;幹擾信號;抗幹擾措施QzROM單片機介紹  QzROM是應用了經過細微化處理的PROM技術的可編程存儲器。QzROM單片機是指搭載了新型存儲器QzROM的瑞薩單片機(圖1),廣泛應用於照相機、可攜式設備、家電及民用設備等。
  • LC振蕩電路測量電容和電感的設計原理介紹
    文中針對電容和電感的測量,簡單介紹了關於LC振蕩電路測量電容和電感的設計原理。框圖包括輸入切換部分、振蕩部分、分頻部分、單片機部分、顯示部分和鍵盤部分。
  • 單片機實例分享,自製數字示波器
    因此電路向LCM發送的是數據編碼信號,這就決定了它和模擬示波器的電路結構不一樣。本文介紹的數字示波器的結構框圖如圖22.3所示。它由垂直輸入電路、A/D轉換電路、數位訊號處理與控制電路、液晶屏顯示電路、電源電路等部分組成。