物理層芯片稱為PHY、數(shù)據(jù)鏈路層芯片稱為MAC。
可以看到PHY的數(shù)據(jù)是RJ45網(wǎng)絡接口(網(wǎng)線口)穿過了的差分信號,而PHY作用就是將差分信號轉(zhuǎn)為數(shù)字信號,這塊內(nèi)容不用深究,制造商都設計好了。
那我們干什么呢?(主要是對phy芯片進行模式選擇,比如工作速率,工作模式)
為什么要熟悉RJ45網(wǎng)口
上面說到針對phy芯片我們只要進行模式選擇(下文會介紹使用mdio接口,通過寄存器控制)
那模式選擇后,如何查看是否有效呢?最簡單直接的就是通過RJ45網(wǎng)口的指示燈查看
RJ45 座子上一般有兩個燈,一個黃色(橙色),一個綠色,綠色亮的話表示網(wǎng)絡連接正常,黃色閃爍的話說明當前正在進行網(wǎng)絡通信,黃燈閃動頻率快表示網(wǎng)速好,這兩個燈由 PHY 芯片控制。
如果不懂物理層和數(shù)據(jù)鏈路層可以看一下網(wǎng)絡七層協(xié)議。
兩個模塊進行通信
下圖是兩個主控直接的通信,比如我們的電腦 和 路由器?,但是如果沒有中間的介質(zhì)還能連接網(wǎng)絡嗎?答案是可以的。
如果phy芯片沒有,那么可以直接通過兩個mac連接進行通信,之所以需要mac 、phy、變壓器的目的是為了轉(zhuǎn)換數(shù)據(jù)類型適配所以的網(wǎng)線,但是在一些電路上,沒必要加這么多東西。
比如搭載 Linux系統(tǒng)的arm芯片想要網(wǎng)絡,可以直接通過mac和網(wǎng)卡芯片連接獲取,這時候就需要通過RGMII接口或者MII接口 和?MDIO?連接網(wǎng)卡芯片。
(網(wǎng)卡芯片內(nèi)置也是mac+phy,有的只有mac 層這個要看具體的手冊)
什么是MDIO協(xié)議
mido協(xié)議即SMI協(xié)議。
SMI協(xié)議也是一種通信協(xié)議類似與I2C協(xié)議但是通信方式不一樣。
SMI包含兩根信號線,一個MDC時鐘線,一個MDIO雙向傳輸?shù)臄?shù)據(jù)線。如下圖為SMI應用框圖。STA設備通過MDIO接口與PHY通信。STA(StaTIon Management)為主控設備,比如MCU、MAC、ONU等。
PHY為從設備。一個STA最多管理32個PHY。MDC信號由STA控制,MDIO信號根據(jù)通信方式的不同可以由STA或者PHY接管控制。如圖通常MDIO會接一個電阻上拉至接口電源。
MDIO的作用?
從上面的連接圖可以看到MDIO是用來連接主設備和多個PHY設備,并且通過MDIO來傳輸數(shù)據(jù)。
那么傳輸?shù)氖菙?shù)據(jù)是哪些呢?主要是傳輸鏈接狀態(tài)、傳輸速度與選擇、斷電、低功率休眠狀態(tài)、TX/RX模式選擇、自動協(xié)商控制、環(huán)回模式控制等。
MDIO沒那么重要
MDIO在上面說到的兩個模塊通信,我提到了 arm芯片和網(wǎng)卡芯片直接需要,那么這個真的有必要嗎?其實沒必要連接!?。?/p>
換個話說 不連接也可以使得網(wǎng)絡暢通,因為網(wǎng)絡的數(shù)據(jù)傳輸時靠RGMII不是靠MDIO,MDIO的作用僅僅只是用來查看一些狀態(tài)和功能,還有簡單的控制,而這些簡單的控制是完全可以有網(wǎng)卡芯片內(nèi)置去寫死,arm層只要和網(wǎng)卡的寫的一直就可以通訊。
但是為什么很多時候需要通過mdio來進行讀寫控制,這個只是在網(wǎng)絡通訊正常后的升級優(yōu)化,用來方便查看狀態(tài),就像寫了個前端網(wǎng)頁來看后臺數(shù)據(jù)。
如果mido沒有讀通,或者讀取的數(shù)據(jù)是0xfffff,那么不一定是mdio的問題,很多時候是網(wǎng)卡本身沒有啟動!
MDIO讀寫時序
Preamble:32bits的前導碼
Start:2bit的開始位。
OP Code:2bits的操作碼,10表示讀,01表示寫。
PHYAD:5bits的PHY地址。
REGAD:5bits的寄存器地址,即要讀或?qū)懙募拇嫫鳌?/p>
Turn Around:2bits的TA,在讀命令中,MDIO在此時由MAC驅(qū)動改為PHY驅(qū)動,并等待一個時鐘周期準備發(fā)送數(shù)據(jù)。在寫命令中,不需要MDIO方向發(fā)生變化,則只是等待兩個時鐘周期準備寫入數(shù)據(jù)。
Data:16bits數(shù)據(jù),在讀命令中,PHY芯片將讀到的對應PHYAD的REGAD寄存器的數(shù)據(jù)寫到Data中,在寫命令中,MAC將要寫入對應PHYAD的REGAD寄存器的值寫入Data中。
Idle:空閑狀態(tài),此時MDIO無源驅(qū)動,處高阻狀態(tài),但一般用上拉電阻使其處在高電平,上拉電阻一般為1.5K。
為什么說讀取的phy最多32個
因為mdio中讀取的phy只提供5bit的字節(jié)即最高11111 轉(zhuǎn)成十進制就是31即0-31就是32個,但這是從讀取的方式判斷的,而mdio讀取是依照phy芯片本身地址空間就5位
為什么說reg地址最多32個?
同樣mdio中讀取的reg只提供5bit的字節(jié)即最高11111 轉(zhuǎn)成十進制就是31即0-31就是32個
PHY 芯片寄存器地址空間為 5 位,地址 0-31 共 32 個寄存器, IEEE 定義了 0-15 這 16 個寄存器的功能, 16~31 這 16 個寄存器由廠商自行實現(xiàn)。也就是說不管你用的哪個廠家的 PHY 芯片,其中 0~15 這 16 個寄存器是一模一樣的。?僅靠這 16 個寄存器是完全可以驅(qū)動起 PHY 芯片的,至少能保證基本的網(wǎng)絡數(shù)據(jù)通信。
一些感想
這個也是我看了大量的參考文獻和一步步的實踐總結(jié)的經(jīng)驗,中間花了幾百塊問過知乎的博主和一些領(lǐng)域內(nèi)的人,都沒有講解的很細致,最后還是通過實踐,把每一層都走一遍,把變壓器去掉,把phy去掉,linux系統(tǒng)的網(wǎng)卡函數(shù)看了一遍,phy芯片的手冊有看了很多。
本篇文章想幫助很多像我一樣的有些剛?cè)胄械拇蚬と耍ㄎ沂莻€女生,內(nèi)向靦腆但是又較真,學的嵌入式,入了這行,不甘心做不出來,就自己花錢各種找資源,找人咨詢,前期因為不懂的被人忽悠了錢,還是堅持繼續(xù)深入探討)。希望對你有幫助。
審核編輯:黃飛
?
評論