物理層芯片稱(chēng)為PHY、數(shù)據(jù)鏈路層芯片稱(chēng)為MAC。
可以看到PHY的數(shù)據(jù)是RJ45網(wǎng)絡(luò)接口(網(wǎng)線(xiàn)口)穿過(guò)了的差分信號(hào),而PHY作用就是將差分信號(hào)轉(zhuǎn)為數(shù)字信號(hào),這塊內(nèi)容不用深究,制造商都設(shè)計(jì)好了。
那我們干什么呢?(主要是對(duì)phy芯片進(jìn)行模式選擇,比如工作速率,工作模式)
為什么要熟悉RJ45網(wǎng)口
上面說(shuō)到針對(duì)phy芯片我們只要進(jìn)行模式選擇(下文會(huì)介紹使用mdio接口,通過(guò)寄存器控制)
那模式選擇后,如何查看是否有效呢?最簡(jiǎn)單直接的就是通過(guò)RJ45網(wǎng)口的指示燈查看

RJ45 座子上一般有兩個(gè)燈,一個(gè)黃色(橙色),一個(gè)綠色,綠色亮的話(huà)表示網(wǎng)絡(luò)連接正常,黃色閃爍的話(huà)說(shuō)明當(dāng)前正在進(jìn)行網(wǎng)絡(luò)通信,黃燈閃動(dòng)頻率快表示網(wǎng)速好,這兩個(gè)燈由 PHY 芯片控制。
如果不懂物理層和數(shù)據(jù)鏈路層可以看一下網(wǎng)絡(luò)七層協(xié)議。

兩個(gè)模塊進(jìn)行通信
下圖是兩個(gè)主控直接的通信,比如我們的電腦 和 路由器?,但是如果沒(méi)有中間的介質(zhì)還能連接網(wǎng)絡(luò)嗎?答案是可以的。
如果phy芯片沒(méi)有,那么可以直接通過(guò)兩個(gè)mac連接進(jìn)行通信,之所以需要mac 、phy、變壓器的目的是為了轉(zhuǎn)換數(shù)據(jù)類(lèi)型適配所以的網(wǎng)線(xiàn),但是在一些電路上,沒(méi)必要加這么多東西。
比如搭載 Linux系統(tǒng)的arm芯片想要網(wǎng)絡(luò),可以直接通過(guò)mac和網(wǎng)卡芯片連接獲取,這時(shí)候就需要通過(guò)RGMII接口或者M(jìn)II接口 和?MDIO?連接網(wǎng)卡芯片。
(網(wǎng)卡芯片內(nèi)置也是mac+phy,有的只有mac 層這個(gè)要看具體的手冊(cè))

什么是MDIO協(xié)議
mido協(xié)議即SMI協(xié)議。
SMI協(xié)議也是一種通信協(xié)議類(lèi)似與I2C協(xié)議但是通信方式不一樣。
SMI包含兩根信號(hào)線(xiàn),一個(gè)MDC時(shí)鐘線(xiàn),一個(gè)MDIO雙向傳輸?shù)臄?shù)據(jù)線(xiàn)。如下圖為SMI應(yīng)用框圖。STA設(shè)備通過(guò)MDIO接口與PHY通信。STA(StaTIon Management)為主控設(shè)備,比如MCU、MAC、ONU等。

PHY為從設(shè)備。一個(gè)STA最多管理32個(gè)PHY。MDC信號(hào)由STA控制,MDIO信號(hào)根據(jù)通信方式的不同可以由STA或者PHY接管控制。如圖通常MDIO會(huì)接一個(gè)電阻上拉至接口電源。
MDIO的作用?
從上面的連接圖可以看到MDIO是用來(lái)連接主設(shè)備和多個(gè)PHY設(shè)備,并且通過(guò)MDIO來(lái)傳輸數(shù)據(jù)。
那么傳輸?shù)氖菙?shù)據(jù)是哪些呢?主要是傳輸鏈接狀態(tài)、傳輸速度與選擇、斷電、低功率休眠狀態(tài)、TX/RX模式選擇、自動(dòng)協(xié)商控制、環(huán)回模式控制等。
MDIO沒(méi)那么重要
MDIO在上面說(shuō)到的兩個(gè)模塊通信,我提到了 arm芯片和網(wǎng)卡芯片直接需要,那么這個(gè)真的有必要嗎?其實(shí)沒(méi)必要連接?。?!
換個(gè)話(huà)說(shuō) 不連接也可以使得網(wǎng)絡(luò)暢通,因?yàn)榫W(wǎng)絡(luò)的數(shù)據(jù)傳輸時(shí)靠RGMII不是靠MDIO,MDIO的作用僅僅只是用來(lái)查看一些狀態(tài)和功能,還有簡(jiǎn)單的控制,而這些簡(jiǎn)單的控制是完全可以有網(wǎng)卡芯片內(nèi)置去寫(xiě)死,arm層只要和網(wǎng)卡的寫(xiě)的一直就可以通訊。
但是為什么很多時(shí)候需要通過(guò)mdio來(lái)進(jìn)行讀寫(xiě)控制,這個(gè)只是在網(wǎng)絡(luò)通訊正常后的升級(jí)優(yōu)化,用來(lái)方便查看狀態(tài),就像寫(xiě)了個(gè)前端網(wǎng)頁(yè)來(lái)看后臺(tái)數(shù)據(jù)。
如果mido沒(méi)有讀通,或者讀取的數(shù)據(jù)是0xfffff,那么不一定是mdio的問(wèn)題,很多時(shí)候是網(wǎng)卡本身沒(méi)有啟動(dòng)!
MDIO讀寫(xiě)時(shí)序

Preamble:32bits的前導(dǎo)碼
Start:2bit的開(kāi)始位。
OP Code:2bits的操作碼,10表示讀,01表示寫(xiě)。
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ù)。在寫(xiě)命令中,不需要MDIO方向發(fā)生變化,則只是等待兩個(gè)時(shí)鐘周期準(zhǔn)備寫(xiě)入數(shù)據(jù)。
Data:16bits數(shù)據(jù),在讀命令中,PHY芯片將讀到的對(duì)應(yīng)PHYAD的REGAD寄存器的數(shù)據(jù)寫(xiě)到Data中,在寫(xiě)命令中,MAC將要寫(xiě)入對(duì)應(yīng)PHYAD的REGAD寄存器的值寫(xiě)入Data中。
Idle:空閑狀態(tài),此時(shí)MDIO無(wú)源驅(qū)動(dòng),處高阻狀態(tài),但一般用上拉電阻使其處在高電平,上拉電阻一般為1.5K。
為什么說(shuō)讀取的phy最多32個(gè)
因?yàn)閙dio中讀取的phy只提供5bit的字節(jié)即最高11111 轉(zhuǎn)成十進(jìn)制就是31即0-31就是32個(gè),但這是從讀取的方式判斷的,而mdio讀取是依照phy芯片本身地址空間就5位
為什么說(shuō)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è)寄存器由廠(chǎng)商自行實(shí)現(xiàn)。也就是說(shuō)不管你用的哪個(gè)廠(chǎng)家的 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),中間花了幾百塊問(wèn)過(guò)知乎的博主和一些領(lǐng)域內(nèi)的人,都沒(méi)有講解的很細(xì)致,最后還是通過(guò)實(shí)踐,把每一層都走一遍,把變壓器去掉,把phy去掉,linux系統(tǒng)的網(wǎng)卡函數(shù)看了一遍,phy芯片的手冊(cè)有看了很多。
本篇文章想幫助很多像我一樣的有些剛?cè)胄械拇蚬と耍ㄎ沂莻€(gè)女生,內(nèi)向靦腆但是又較真,學(xué)的嵌入式,入了這行,不甘心做不出來(lái),就自己花錢(qián)各種找資源,找人咨詢(xún),前期因?yàn)椴欢谋蝗撕鲇屏隋X(qián),還是堅(jiān)持繼續(xù)深入探討)。希望對(duì)你有幫助。
審核編輯:黃飛
?
電子發(fā)燒友App























評(píng)論