MII是英文Medium Independent Interface的縮寫,翻譯成中文是“媒體獨立接口”,該接口一般應用于以太網硬體平台的MAC層和PHY層之間,MII接口的類型有很多,常用的有MII、RMII、SMII、SSMII、SSSMII、GMII、RGMII、SGMII、TBI、RTBI、XGMII、XAUI、XLAUI等。
MII接口:
RXD(Receive Data)[3:0]:資料接收信号,共4根信号線;
TX_ER(Transmit Error): 發送資料錯誤提示信号,同步于TX_CLK,高電平有效,表示TX_ER有效期内傳輸的資料無效。對于10Mbps速率下,TX_ER不起作用;
RX_ER(Receive Error): 接收資料錯誤提示信号,同步于RX_CLK,高電平有效,表示RX_ER有效期内傳輸的資料無效。對于10Mbps速率下,RX_ER不起作用;
TX_EN(Transmit Enable): 發送使能信号,隻有在TX_EN有效期内傳的資料才有效;
RX_DV(Reveive Data Valid): 接收資料有效信号,作用類型于發送通道的TX_EN;
TX_CLK:發送參考時鐘,100Mbps速率下,時鐘頻率為25MHz,10Mbps速率下,時鐘頻率為2.5MHz。注意,TX_CLK時鐘的方向是從PHY側指向MAC側的,是以此時鐘是由PHY提供的。
RX_CLK:接收資料參考時鐘,100Mbps速率下,時鐘頻率為25MHz,10Mbps速率下,時鐘頻率為2.5MHz。RX_CLK也是由PHY側提供的。
CRS:Carrier Sense,載波偵測信号,不需要同步于參考時鐘,隻要有資料傳輸,CRS就有效,另外,CRS隻有PHY在半雙工模式下有效;
COL:Collision Detectd,沖突檢測信号,不需要同步于參考時鐘,隻有PHY在半雙工模式下有效。
MII接口一共有16根線
Tx_CLK/Rx_CLK:分别是Tx和Rx的時鐘信号。他們都是由PHY驅動的。
TxD[0...3]/RxD[0...3]:分别是Tx和Rx的資料傳輸線。TxD是控制器驅動,RxD是PHY驅動。
Tx_EN/RX_DV:分别是Tx和Rx的開關。這兩根線都是PHY驅動。(事實上,雖然很多文檔都講Tx_EN是PHY驅動的;但在實作時,Tx_EN是由控制器來設定的,也就是控制器驅動的)。隻有在Tx_EN有效時,TxD才會被PHY接收;隻有在Rx_DV有效時,RxD才會被控制器接收。
Tx_ER/Rx_ER:分别是Tx和Rx的報錯線。這兩根線都是PHY驅動。即使是在Tx_EN或Rx_DV期間,隻要此兩根線有效,則出錯的那個周期所傳資料無效。10Mb以太網傳輸時,ER信号不影響正常傳輸,若不使用ER線,需将其接地。
CRS/COL:監聽媒體是否空閑/監聽是否有沖突發生。這兩根線都是由PHY驅動,并且隻在半雙工模式下有效。
另外需加上,MII接口的Management Interface:MDC和MDIO。通過它,控制晶片可以通路PHY的寄存器(前面100M實體層晶片中介紹的寄存器組,但不僅限于100M實體層晶片,10M實體層晶片也可以擁有這些寄存器),并通過這些寄存器來對實體層晶片進行控制和管理。
MDC:管理接口的時鐘。它是由控制器驅動,與TX_CLK和RX_CLK無任何關系。
MDIO:用來傳送MAC層的控制資訊和實體層的狀态資訊。它是一根雙向的資料線。因MDIO在某個時鐘周期内會空閑,呈高阻狀态,故使用時須将其上拉。
加上這兩根線,一共有18根線。事實上,一個控制器,可以通過Management Interface來管理32個PHY。即,MDC和MDIO是可以複用的。
詳解MDC、MDIO
之前一直困惑switch晶片是怎麼挂到router上去的, 把MDC和MDIO可以接32個PHY這個事實給忽略了。正好這次調試PHY,是以找了個GPIO驅動MDC,MDIO的驅動來搞搞清楚它到底怎麼工作的。
介紹這個驅動的原文在這裡: /Files/pied/一個用GPIO口模拟MDC_MDIO的驅動.pdf
但是看過之後覺得不是自己想要的,又找來找去,最後找到802.3的協定書,還有lattice的應用文檔《Accessing Control Registers through the MDIO bus》 ,ksz8021rnl的reference manul。綜合一下,有下面收獲:
MAC主要是通過MDIO(以MDC為時鐘)來讀寫PHY的寄存器,MDIO上資料幀的格式如下:
資料開始前,會發32個1,然後資料開始時先發一個0,然後恢複到1;接下來兩bit,10是讀,01是寫;緊接着的5位是PHY位址;下面5位是寄存器位址;接下來兩位的話,我的了解是,如果是讀,它用一個時鐘的時間轉到另一個方向(前面的指令式MAC->PHY,後面的data是PHY->MAC);接下來是16位的資料;空閑時線上為高阻。
時序圖就不貼了,根據器件不一樣會有些差别。值得注意的是,當一個MAC挂多個PHY的時候,要留意因為fan-out,MDC和MDIO的輸出被加到很大,802.3上寫如果是32個PHY,MDC的負載電容會達到320pF,MDIO的會達到470pF。
MDIO的幀格式介紹了,其實還沒完,裡面PHY add 和REG add不介紹下貌似過意不去。
關于PHY Add, PHY不同,會有不同設定。AR8032是在RX[3...1]上的strapping,ksz8021rnl的位址取決于引腳PHYAD[1:0]上的strapping,int6400的工作在PHY模式下時位址為引腳MD_A[4:3] 上的strapping。
而PHY register也有不同。下面是兩個不同的PHY Register。
這張來自802.3-2008_section2。
SMII接口:
SMII即Serial MII,串行MII的意思,跟RMII相比,連線進一步減少到4根;
TXD:發送資料信号,位寬為1;
RXD:接收資料信号,位寬為1;
SYNC:收發資料同步信号,每10個時鐘周期置1次高電平,訓示同步。
CLK_REF:所有端口共用的一個參考時鐘,頻率為125MHz,為什麼100Mbps速率要用125MHz時鐘?因為在每8位資料中會插入2位控制信号,請看下面介紹。
TXD/RXD以10比特為一組,以SYNC為高電平來訓示一組資料的開始,在SYNC變高後的10個時鐘周期内,TXD上依次輸出的資料是:TXD[7:0]、TX_EN、TX_ER,控制信号的含義與MII接口中的相同;RXD上依次輸出的資料是:RXD[7:0]、RX_DV、CRS,RXD[7:0]的含義與RX_DV有關,當RX_DV為有效時(高電平),RXD[7:0]上傳輸的是實體層接收的資料。當RX_DV為無效時(低電平),RXD[7:0]上傳輸的是實體層的狀态資訊資料。見下表:
當速率為10Mbps時,每一組資料要重複10次,MAC/PHY晶片每10個周期采樣一次。
MAC/PHY晶片在接收到資料後會進行串/并轉換。
SSMII接口:
SSMII即Serial Sync MII,叫串行同步接口,跟SMII接口很類似,隻是收發使用獨立的參考時鐘和同步時鐘,不再像SMII那樣收發共用參考時鐘和同步時鐘,傳輸距離比SMII更遠。
SSSMII接口:
SSSMII即Source Sync Serial MII,叫源同步串行MII接口,SSSMII與SSMII的差別在于參考時鐘和同步時鐘的方向,SSMII的TX/RX參考時鐘和同步時鐘都是由PHY晶片提供的,而SSSMII的TX參考時鐘和同步時鐘是由MAC晶片提供的,RX參考時鐘和同步時鐘是由PHY晶片提供的,是以顧名思義叫源同步串行。
GMII接口:
與MII接口相比,GMII的資料寬度由4位變為8位,GMII接口中的控制信号如TX_ER、TX_EN、RX_ER、RX_DV、CRS和COL的作用同MII接口中的一樣,發送參考時鐘GTX_CLK和接收參考時鐘RX_CLK的頻率均為125MHz(1000Mbps/8=125MHz)。
在這裡有一點需要特别說明下,那就是發送參考時鐘GTX_CLK,它和MII接口中的TX_CLK是不同的,MII接口中的TX_CLK是由PHY晶片提供給MAC晶片的,而GMII接口中的GTX_CLK是由MAC晶片提供給PHY晶片的。兩者方向不一樣。
在實際應用中,絕大多數GMII接口都是相容MII接口的,是以,一般的GMII接口都有兩個發送參考時鐘:TX_CLK和GTX_CLK(兩者的方向是不一樣的,前面已經說過了),在用作MII模式時,使用TX_CLK和8根資料線中的4根。
RGMII接口:
RGMII即Reduced GMII,是RGMII的簡化版本,将接口信号線數量從24根減少到14根(COL/CRS端口狀态訓示信号,這裡沒有畫出),時鐘頻率仍舊為125MHz,TX/RX資料寬度從8為變為4位,為了保持1000Mbps的傳輸速率不變,RGMII接口在時鐘的上升沿和下降沿都采樣資料。在參考時鐘的上升沿發送GMII接口中的TXD[3:0]/RXD[3:0],在參考時鐘的下降沿發送GMII接口中的TXD[7:4]/RXD[7:4]。RGMI同時也相容100Mbps和10Mbps兩種速率,此時參考時鐘速率分别為25MHz和2.5MHz。
TX_EN信号線上傳送TX_EN和TX_ER兩種資訊,在TX_CLK的上升沿發送TX_EN,下降沿發送TX_ER;同樣的,RX_DV信号線上也傳送RX_DV和RX_ER兩種資訊,在RX_CLK的上升沿發送RX_DV,下降沿發送RX_ER。
SGMII接口:
SGMII即Serial GMII,串行GMII,收發各一對差分信号線,時鐘頻率625MHz,在時鐘信号的上升沿和下降沿均采樣,參考時鐘RX_CLK由PHY提供,是可選的,主要用于MAC側沒有時鐘的情況,一般情況下,RX_CLK不使用。收發都可以從資料中恢複出時鐘。
在TXD發送的串行資料中,每8比特資料會插入TX_EN/TX_ER 兩比特控制資訊,同樣,在RXD接收資料中,每8比特資料會插入RX_DV/RX_ER 兩比特控制資訊,是以總的資料速率為1.25Gbps=625Mbps*2.
其實,大多數MAC晶片的SGMII接口都可以配置成SerDes接口(在實體上完全相容,隻需配置寄存器即可),直接外接光子產品,而不需要PHY層晶片,此時時鐘速率仍舊是625MHz,不過此時跟SGMII接口不同,SGMII接口速率被提高到1.25Gbps是因為插入了控制資訊,而SerDes端口速率被提高是因為進行了8B/10B變換,本來8B/10B變換是PHY晶片的工作,在SerDes接口中,因為外面不接PHY晶片,此時8B/10B變換在MAC晶片中完成了。8B/10B變換的主要作用是擾碼,讓信号中不出現過長的連“0”和連“1”情況,影響時鐘資訊的提取,關于8B/10B變換知識,我後續會單獨介紹。