在以太網傳輸中,MAC層控制鏈路層發送和接收幀的數量,而物理層則負責將一個幀轉換為適合於在物理介質上傳輸的表示。
一、RGMII與GMII的區別
RGMII(Reduced Gigabit Media Independent Interface)是Gigabit Media Independent Interface(GMII)的一個縮減版,包含MII(Media Independent Interface)的減少版。相比於GMII,RGMII使用比GMII更少的引腳(12根CAT5電纜中僅需要4根),從而為Gigabit Ethernet的應用節省了板級布線的成本。RGMII可以替代GMII,以使交換機和路由器在物理層接口上實現更高的集成度,以便在交換機和路由器上節省價格和面積。
二、RGMII與GMII和MII的區別
MII,即媒體獨立接口(Media Independent Interface),是一個用於物理層(PHY)和MAC層之間的標準接口。它有四條同步時鐘信號,兩條數據交換信號(TXD和RXD)和四條控制信號(RXERR、COL、CRS和RXDV)。
GMII(Gigabit Media Independent Interface)是MII的一種擴展,為在千兆速率下的以太網提供了額外的信號
RGMII是GMII的一種縮減版,以適配電信號傳輸在板上的接口中。RGMI採用四條同步時鐘信號,與MII類似,但是使用RMII只需要兩根差分引腳,而不需要兩根雙向控制引腳。RGMII是一種在Gigabit Ethernet中用於連接MAC到PHY的標準接口,具有與GMII接口類似的功能和時序。由於RGMI所需的引腳數量較少,因此對收發器芯片的成本和設計難度都有所降低。
三、RGMII的時鐘和數據信號時序
RGMII始終使用MII信號的雙倍速時鐘,即50MHz。RGMII使用八個接口信號:tx_clk、txd[3:0]、tx_ctl、rx_clk、rxd[3:0],以及rx_ctl。各個信號的含義如下:
- tx_clk:傳輸GPIO時鐘,由MAC提供。
- txd[3:0]:四條傳輸數據線,從MAC到PHY。
- tx_ctl:傳輸控制線,從MAC到PHY。
- rx_clk:接收GPIO時鐘,由PHY提供。
- rxd[3:0]:四條接收數據線,從PHY到MAC。
- rx_ctl:接收控制線,由PHY提供。
┌──────────────────────┐ │ │ │ A │ Phy │ │ │ ▲ │ │ tx_clk│───>|───▲───│ │ ▼ │ │ │ txd[3:0] │ │ │ tx_ctl │ │ │ MAC │ ▲ │ │ │ rx_clk│───|<───▼───│ │ ▼ │ │ rxd[3:0] │ │ rx_ctl │ └──────────────────────┘
四、RGMII的使用實例
下面的示例代碼將RGMII接口與PHY和MAC連接在一起以支持以太網通信。
/* Set up GPIO clocks */ volatile unsigned int * CM_WKUP_GPIO1_CLKCTRL = (unsigned int *)0x44E004C4; *CM_WKUP_GPIO1_CLKCTRL = 0x02; while((*CM_WKUP_GPIO1_CLKCTRL & 0x03) != 0x02); /* Set up GPIO pins for RGMII */ volatile unsigned int * CONTROL_PADCONF_MDI = (unsigned int *)0x44E107C4; *CONTROL_PADCONF_MDI = (0x08 << 16) | 0x100; // RGMII1_TX_EN volatile unsigned int * CONTROL_PADCONF_MDIO = (unsigned int *)0x44E107C8; *CONTROL_PADCONF_MDIO = (0x08 << 16) | 0x100; // RGMII1_TXD0 volatile unsigned int * CONTROL_PADCONF_RGMII_RX_BYPASS = (unsigned int *)0x44E107CC; *CONTROL_PADCONF_RGMII_RX_BYPASS = (0x08 << 16) | 0x100; // RGMII1_TXD1 volatile unsigned int * CONTROL_PADCONF_RGMII_RX_CTL = (unsigned int *)0x44E107D0; *CONTROL_PADCONF_RGMII_RX_CTL = (0x08 << 16) | 0x100; // RGMII1_RXD0 volatile unsigned int * CONTROL_PADCONF_RGMII_RXD0 = (unsigned int *)0x44E107D4; *CONTROL_PADCONF_RGMII_RXD0 = (0x08 << 16) | 0x100; // RGMII1_RXD1 volatile unsigned int * CONTROL_PADCONF_RGMII_RXD1 = (unsigned int *)0x44E107D8; *CONTROL_PADCONF_RGMII_RXD1 = (0x08 << 16) | 0x100; // RGMII1_RXD2 volatile unsigned int * CONTROL_PADCONF_RGMII_RXD2 = (unsigned int *)0x44E107DC; *CONTROL_PADCONF_RGMII_RXD2 = (0x08 << 16) | 0x100; // RGMII1_RXD3 volatile unsigned int * CONTROL_PADCONF_RGMII_RXD3 = (unsigned int *)0x44E107E0; *CONTROL_PADCONF_RGMII_RXD3 = (0x08 << 16) | 0x100; // RGMII1_RX_CLK /* Set up EGMII registers */ volatile unsigned int * GMAC_CTRL = (unsigned int *)0x4A100050; *GMAC_CTRL &= ~(1 << 11); // Disable RX and TX volatile unsigned int * GMAC_STATUS = (unsigned int *)0x4A100054; volatile unsigned int * GMAC_SYM_CTRL = (unsigned int *)0x4A10001C; // Set up the GMAC and RGMII to match the board's configuration *GMAC_SYM_CTRL = (0x2 << 2) | 0x07; // Enable GMAC *GMAC_CTRL |= (1 << 11);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159536.html