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