硬件設(shè)計(jì)實(shí)戰(zhàn):從原理圖到PCB調(diào)試)
做嵌入式聯(lián)網(wǎng)項(xiàng)目STM32F407配LAN8720A幾乎是繞不開(kāi)的組合。F407自帶MAC控制器外部PHY選LAN8720ARMII接口下只占7根信號(hào)線單3.3V供電成本也壓得下來(lái)這幾年工業(yè)采集網(wǎng)關(guān)、串口服務(wù)器、測(cè)試板卡上到處都能看到這套搭配。但恰恰是這種“參考手冊(cè)照抄就能用”的方案實(shí)際畫(huà)板時(shí)坑不少X1/X2時(shí)鐘走有源還是無(wú)源、TXD和TX_EN之間要不要做等長(zhǎng)、變壓器中心抽頭接到哪、PHY地址到底是0還是1……這些細(xì)節(jié)一旦翻車(chē)輕則網(wǎng)口插上不識(shí)別重則PHY發(fā)燙、整板功耗異常。這個(gè)項(xiàng)目本身不是多復(fù)雜的大板子但正好踩遍了以太網(wǎng)PHY硬件設(shè)計(jì)的主要雷區(qū)。如果你正要畫(huà)F407的板子或者已經(jīng)在調(diào)試LAN8720A死活不通這篇內(nèi)容值得花幾分鐘看完。我會(huì)從選型邏輯、原理圖每個(gè)引腳、外圍變壓器、PCB布局到聯(lián)調(diào)驗(yàn)證一條龍講清楚重點(diǎn)放“為什么這么做”而不是只給你一份能抄的圖紙。1. 方案選型為什么F407工程師多數(shù)選了LAN8720A1.1 F407以太網(wǎng)外設(shè)與PHY的基本分工STM32F407內(nèi)部集成了以太網(wǎng)MAC控制器但物理層信號(hào)收發(fā)做不了需要一顆外部PHY芯片來(lái)干活。MAC和PHY之間的接口有MII和RMII兩種模式MII需要16根信號(hào)線數(shù)據(jù)總線是4位的TXD[3:0]和RXD[3:0]還要單獨(dú)引出TX_CLK、RX_CLK、RX_DV、RX_ER、CRS、COL等控制信號(hào)引腳占用非常大對(duì)F407這種QFP100/144封裝的芯片來(lái)說(shuō)佈線壓力不小。RMII模式把數(shù)據(jù)線砍到2位收發(fā)一共只需要TXD[1:0]、RXD[1:0]、TX_EN、CRS_DV和REF_CLK這7根信號(hào)線100Mbps帶寬下用50MHz時(shí)鐘就能跑滿。說(shuō)白了RMII就是用“提高PHY側(cè)時(shí)鐘頻率”來(lái)?yè)Q“減少M(fèi)CU引腳占用”。F407的ETH外設(shè)這兩種模式都支持我在實(shí)際項(xiàng)目里基本都選RMII因?yàn)槭∠碌囊_能留給人機(jī)交互、傳感器采集、RS485擴(kuò)展這些更有價(jià)值的功能。LAN8720A是SMSC現(xiàn)在是Microchip旗下主打低功耗的百兆以太網(wǎng)PHY內(nèi)置1.2V穩(wěn)壓器單3.3V供電就能工作不需要額外的1.2V電源平面。官方標(biāo)稱正常工作電流大概六七十毫安實(shí)際跑起來(lái)也就幾十mA量級(jí)配合F407做低功耗網(wǎng)關(guān)非常合適。它支持Auto-MDIX自動(dòng)翻轉(zhuǎn)、自協(xié)商、節(jié)能以太網(wǎng)這些常規(guī)功能封裝是QFN24體積很小適合對(duì)板面積敏感的產(chǎn)品。1.2 與DP83848、KSZ8081、YT8512H的橫向?qū)Ρ扔腥藭?huì)問(wèn)為什么不用Ti的DP83848或者M(jìn)icrochip自家的KSZ8081還有國(guó)產(chǎn)的YT8512H這里我把幾個(gè)常見(jiàn)方案放在一起對(duì)比一下PHY芯片接口供電功耗典型值封裝參考設(shè)計(jì)復(fù)雜度LAN8720ARMII3.3V單電源約70mAQFN24低內(nèi)置穩(wěn)壓器DP83848IMII/RMII3.3V需額外注意模擬/數(shù)字電源隔離約110mALQFP48中等引腳多KSZ8081MII/RMII3.3V單電源約70mAQFN32低和LAN8720A接近YT8512HMII/RMII3.3V單電源約70mAQFN32低兼容類(lèi)設(shè)計(jì)從參數(shù)看LAN8720A并不是性能最強(qiáng)的那顆但它的優(yōu)勢(shì)在于應(yīng)用時(shí)間久、參考電路驗(yàn)證充分、價(jià)格便宜、QFN24封裝小而且F407官方評(píng)估板以及網(wǎng)上大量開(kāi)源項(xiàng)目都默認(rèn)用這顆芯片遇到問(wèn)題很容易找到對(duì)照資料。DP83848雖然是經(jīng)典老將穩(wěn)定性和溫度范圍不錯(cuò)但封裝大、外圍去耦要求高對(duì)多數(shù)中小項(xiàng)目來(lái)說(shuō)“沒(méi)必要”。KSZ8081和LAN8720A基本是同級(jí)別替代引腳不直接兼容需要改原理圖。YT8512H這幾年在一些國(guó)產(chǎn)方案里也不少晶振電路和寄存器初始化略有差異新手不建議拿來(lái)做首板。另外注意這些PHY基本都是電壓型PHY差分線可以直接和變壓器對(duì)接不需要額外加偏置電阻而部分老款電流型PHY需要外部電阻提供直流偏置接法完全不同。選型時(shí)如果看到別人設(shè)計(jì)里差分線上串了一堆電阻先確認(rèn)是阻抗匹配還是電流型PHY的偏置需求別盲目照抄。2. LAN8720A原理圖核心每個(gè)引腳都在干什么2.1 RMII接口信號(hào)與引腳規(guī)劃RMII模式下LAN8720A與F407相連的關(guān)鍵信號(hào)主要有以下幾組TXD[1:0]發(fā)送數(shù)據(jù)MCU側(cè)輸出到PHY由F407的ETH_TXD0/ETH_TXD1驅(qū)動(dòng)傳輸速率100Mbps時(shí)有效數(shù)據(jù)位2位10Mbps時(shí)仍按2位傳輸只是時(shí)鐘頻率降低。TX_EN發(fā)送使能高電平表示TXD上的數(shù)據(jù)有效必須和TXD[1:0]同步變化。RXD[1:0]接收數(shù)據(jù)PHY輸出給F407不需要額外時(shí)鐘線數(shù)據(jù)隨REF_CLK同步。CRS_DV載波偵聽(tīng)/數(shù)據(jù)有效復(fù)用線在RMII模式下同時(shí)承載CRS和RX_DV兩個(gè)信息PHY內(nèi)部處理后由這根線輸出給MCU的ETH_CRS_DV引腳。新手最容易在這里踩坑把CRS_DV接到F407的RX_DV專(zhuān)用引腳上導(dǎo)致接收路徑完全不通。MDC/MDIO管理接口用于讀寫(xiě)PHY內(nèi)部寄存器MCU通過(guò)MDC時(shí)鐘線和MDIO雙向數(shù)據(jù)線完成配置。原理圖階段我建議在每個(gè)RMII信號(hào)線上預(yù)留串聯(lián)電阻位阻值22到33Ω位置放在靠近MCU一側(cè)。這么做有兩個(gè)好處一是高速信號(hào)的振鈴能被適當(dāng)抑制二是調(diào)試時(shí)可以直接斷開(kāi)某一路信號(hào)方便用示波器單個(gè)排查。除了串阻還要在F407側(cè)給這些信號(hào)預(yù)留測(cè)試點(diǎn)特別是TXD[0]、TXD[1]、TX_EN、CRS_DV四根線。后面聯(lián)調(diào)時(shí)如果ping不通首先要確認(rèn)的就是這四個(gè)信號(hào)在PHY引腳上有沒(méi)有正確的電平翻轉(zhuǎn)。2.2 時(shí)鐘方案50MHz外部時(shí)鐘和無(wú)源晶振怎么選LAN8720A的X1/X2引腳支持兩種時(shí)鐘輸入方式這也是原理圖設(shè)計(jì)中最容易糾結(jié)的地方。第一種是外部50MHz時(shí)鐘直接接到X1X2懸空。這里的時(shí)鐘必須是有源時(shí)鐘或者M(jìn)CU輸出的時(shí)鐘信號(hào)不能是無(wú)源晶振。STM32F407的MCO1引腳PA8可以配置輸出PLL時(shí)鐘當(dāng)系統(tǒng)時(shí)鐘為168MHz、PLL分頻配置合適時(shí)MCO1正好可以輸出50MHz。把這個(gè)時(shí)鐘接到LAN8720A的X1就實(shí)現(xiàn)了MCU和PHY共用一個(gè)時(shí)鐘源省掉一顆晶振還避免兩個(gè)獨(dú)立晶振之間的頻率偏差。第二種是25MHz無(wú)源晶振接X(jué)1/X2由LAN8720A內(nèi)部PLL倍頻產(chǎn)生50MHz的REF_CLK。這種方案下如果F407側(cè)需要REF_CLK可以讓PHY的REF_CLK輸出給MCU也可以再單獨(dú)用一顆50MHz有源晶振給MCU但這樣就有兩個(gè)時(shí)鐘源設(shè)計(jì)冗余且可能存在相位抖動(dòng)問(wèn)題。我個(gè)人的選擇是優(yōu)先用F407的MCO1輸出50MHz給LAN8720A原理圖簡(jiǎn)單、時(shí)鐘同源調(diào)試時(shí)也只要量一個(gè)點(diǎn)。注意MCO1輸出要和GPIO復(fù)用功能配置正確CubeMX里選ETH外設(shè)時(shí)如果勾選了RMII會(huì)提示MCO1引腳沖突直接按工具分配即可。如果PA8被其他功能占用就老實(shí)使用25MHz無(wú)源晶振加PHY內(nèi)部PLL方案不再用雙時(shí)鐘源。無(wú)源晶振方案需要注意負(fù)載電容匹配LAN8720A數(shù)據(jù)手冊(cè)推薦值一般是18pF或22pF具體以晶振廠家規(guī)格為準(zhǔn)。晶振兩端建議各對(duì)地接一個(gè)電容晶振本體盡量靠近X1/X2引腳PCB上不要打過(guò)孔晶振下方不要走其他信號(hào)線。2.3 電源、去耦與PHY地址配置LAN8720A的電源引腳分幾類(lèi)VDD和VDDIO通常統(tǒng)一接3.3V負(fù)責(zé)芯片數(shù)字和I/O供電VDDCR是內(nèi)部1.2V核心電壓的輸出引腳不是輸入這個(gè)特別容易被搞反。VDDCR外部只需要加去耦電容絕對(duì)不能把3.3V直接灌進(jìn)去否則芯片大概率直接燒壞或者嚴(yán)重發(fā)燙。去耦電容的擺放原則是每個(gè)電源引腳就近放一個(gè)0.1uF陶瓷電容電容到電源引腳走線盡量短最好直接打過(guò)孔扇出芯片背面或電源入口處再加一個(gè)4.7uF到10uF的鉭電容做低頻儲(chǔ)能。很多人在原理圖上畫(huà)了電容但Layout時(shí)放得離引腳很遠(yuǎn)結(jié)果等于沒(méi)放。PHY地址通過(guò)PHYAD0引腳配置把PHYAD0拉低MDIO地址為0拉高地址為1。絕大多數(shù)STM32以太網(wǎng)驅(qū)動(dòng)和CubeMX配置默認(rèn)PHY地址為0如果你的板子為了布線方便把PHYAD0拉高了后續(xù)軟件初始化就一定會(huì)卡在PHY復(fù)位或讀取ID超時(shí)。所以原理圖階段就要把PHYAD0的接法固定下來(lái)并在工程文檔里記清楚。LAN8720A還有幾個(gè)復(fù)合功能引腳比如nINT/REGOFF這類(lèi)它們同時(shí)承擔(dān)中斷輸出、內(nèi)部LDO關(guān)斷控制等作用必須嚴(yán)格按參考設(shè)計(jì)接不能想當(dāng)然當(dāng)普通GPIO隨便拉高拉低。我見(jiàn)過(guò)有人把REGOFF誤接高電平導(dǎo)致內(nèi)部穩(wěn)壓器被關(guān)斷整個(gè)PHY根本沒(méi)有核心供電網(wǎng)口自然完全沒(méi)反應(yīng)。3. 外圍關(guān)鍵電路網(wǎng)絡(luò)變壓器、RJ45與ESD防護(hù)3.1 網(wǎng)絡(luò)變壓器的作用PHY芯片的差分信號(hào)線不能直接接到RJ45插座上中間一般要經(jīng)過(guò)網(wǎng)絡(luò)變壓器。變壓器在這里起了多重作用電氣隔離把PHY側(cè)的地和外部網(wǎng)線地徹底隔開(kāi)防止共地環(huán)路帶來(lái)的干擾和安全隱患共模抑制網(wǎng)線在長(zhǎng)距離傳輸中會(huì)感應(yīng)各種共模噪聲變壓器通過(guò)共模扼流圈結(jié)構(gòu)把這些噪聲濾掉阻抗匹配保證差分信號(hào)在PHY、變壓器、網(wǎng)線之間保持100Ω特征阻抗減小反射。以太網(wǎng)差分信號(hào)本質(zhì)上是帶直流偏置的高速信號(hào)變壓器通過(guò)磁耦合把直流分量隔掉只讓交流信號(hào)通過(guò)。所以不要因?yàn)椤鞍遄由峡臻g不夠”或者“只是調(diào)試用”就省掉變壓器那基本上是在給自己挖坑。之前有個(gè)朋友為了省那幾塊錢(qián)成本直接把PHY差分線接到RJ45針腳結(jié)果只有自己和自己測(cè)試沒(méi)問(wèn)題跟交換機(jī)一接就瘋狂丟包最后老老實(shí)實(shí)改板。RJ45可以選擇集成變壓器的型號(hào)比如HR911105A、RJ45帶網(wǎng)絡(luò)變壓器的模組都是常見(jiàn)選擇電氣上把變壓器和座子合二為一布局更省空間外圍也更簡(jiǎn)潔。如果選分離方案就是一顆獨(dú)立網(wǎng)絡(luò)變壓器模塊如HX1188NL1:1隔離普通RJ45靈活性更高但PCB上要分開(kāi)放布局要求也高。3.2 中心抽頭接法不要閉眼抄參考設(shè)計(jì)網(wǎng)絡(luò)變壓器內(nèi)部有兩組繞組分別對(duì)應(yīng)TX和RX差分對(duì)每組繞組都有中心抽頭這個(gè)中心抽頭的接法直接決定PHY能否正常工作。LAN8720A參考設(shè)計(jì)中中心抽頭的處理方式有其默認(rèn)推薦但不同變壓器廠商的繞線結(jié)構(gòu)可能不同最穩(wěn)妥的做法是查你所選變壓器型號(hào)的手冊(cè)看它推薦的抽頭接法。HR911105A這類(lèi)集成變壓器RJ45內(nèi)部一般已經(jīng)把中心抽頭和匹配電容都處理好了外部只管連接差分對(duì)即可方便但也要確認(rèn)內(nèi)部結(jié)構(gòu)是否與PHY匹配。分離式變壓器方案則常在RJ45內(nèi)側(cè)做Bob Smith端接四對(duì)線對(duì)與地之間通過(guò)51Ω或75Ω電阻再串1000pF/2kV高壓電容連到外殼地用來(lái)泄放共模干擾和靜電。注意外殼地要和數(shù)字地用高壓電容和大電阻跨接不能直接大面積短接防止機(jī)殼靜電直接灌進(jìn)板子。調(diào)試時(shí)如果出現(xiàn)link燈閃爍不穩(wěn)定或者只有10M能通100M不通先用示波器量差分對(duì)再用萬(wàn)用表量中心抽頭電壓。很多這類(lèi)問(wèn)題都是中心抽頭焊錯(cuò)位置或者焊接虛焊導(dǎo)致直流偏置不對(duì)PHY的接收端工作點(diǎn)異常信號(hào)質(zhì)量很差。3.3 ESD與防浪涌設(shè)計(jì)要點(diǎn)以太網(wǎng)接口是板卡最容易遭受靜電和浪涌沖擊的位置因?yàn)榫W(wǎng)線常年暴露在外部插拔瞬間、雷雨天氣的感應(yīng)浪涌都可能從RJ45侵入。在靠近RJ45內(nèi)側(cè)放置TVS陣列是標(biāo)配比如SLVU2.8-4、USBLC6-2SC6這類(lèi)專(zhuān)為以太網(wǎng)設(shè)計(jì)的TVS鉗位電壓選5V以內(nèi)的結(jié)電容盡量小幾pF級(jí)別接在差分線和外殼地之間。關(guān)鍵點(diǎn)在于TVS要放在變壓器的線纜側(cè)也就是靠近RJ45那一端不能放在PHY這邊。變壓器隔離的是PHY和網(wǎng)線如果TVS放在PHY側(cè)外部浪涌要先穿過(guò)變壓器此時(shí)變壓器已經(jīng)出現(xiàn)高壓擊穿風(fēng)險(xiǎn)TVS就幫不上忙。另外RJ45金屬外殼的固定腳要連接外殼地不要懸空。這些細(xì)節(jié)在原理圖上看起來(lái)都一樣但Layout和接地方式不同抗干擾能力差距非常大。4. 原理圖優(yōu)化與PCB布局經(jīng)驗(yàn)4.1 從參考設(shè)計(jì)出發(fā)可以做的3處優(yōu)化官方參考設(shè)計(jì)只能保證“能工作”離“好生產(chǎn)、好調(diào)試”還有一段距離。我在畫(huà)F407LAN8720A這塊板時(shí)做了幾處針對(duì)性優(yōu)化。第一所有RMII信號(hào)串聯(lián)電阻預(yù)留測(cè)試點(diǎn)位。串阻選33Ω靠近MCU引腳側(cè)放置旁邊留過(guò)孔做測(cè)試點(diǎn)。這樣調(diào)試時(shí)如果懷疑某根信號(hào)線有問(wèn)題可以直接斷開(kāi)串阻從MCU側(cè)和PHY側(cè)分別測(cè)量快速定位問(wèn)題。第二LAN8720A的復(fù)位電路不要只用一個(gè)簡(jiǎn)單的RC。nRST低電平有效上電后要保證復(fù)位時(shí)間足夠長(zhǎng)確保內(nèi)部穩(wěn)壓器穩(wěn)定輸出。我習(xí)慣用10kΩ電阻上拉加上1uF電容到地這樣上電復(fù)位時(shí)間約10毫秒足夠穩(wěn)妥。如果F407的復(fù)位引腳資源足夠也可以用GPIO控制PHY復(fù)位CubeMX里配置一個(gè)輸出引腳軟件上電后延時(shí)幾十毫秒再釋放復(fù)位這樣調(diào)試時(shí)可以隨時(shí)軟復(fù)位PHY。第三LED指示電路必須加限流電阻。LAN8720A的LED引腳內(nèi)部驅(qū)動(dòng)能力有限直接外接高亮LED不加電阻輕則亮度刺眼、影響壽命重則超過(guò)引腳最大電流。串470Ω到1kΩ電阻根據(jù)LED壓降計(jì)算即可。另外LED引腳默認(rèn)的極性是低電平點(diǎn)亮還是高電平點(diǎn)亮不同型號(hào)和引腳配置不一樣原理圖階段就要確認(rèn)。4.2 差分對(duì)、時(shí)鐘信號(hào)與整板布局PCB布局上高速信號(hào)最核心的原則是信號(hào)路徑要短回流路徑要完整阻抗要匹配。以太網(wǎng)PHY到變壓器這一段是真正的差分信號(hào)必須按100Ω差分阻抗布線寬和線距由疊層結(jié)構(gòu)決定一般表層差分線線寬5到7mil、間距8到10mil具體用阻抗計(jì)算工具算清楚。RMII信號(hào)雖然都是單端信號(hào)但TXD[0]、TXD[1]、TX_EN這三根線建議做等長(zhǎng)處理長(zhǎng)度差控制在1mm以內(nèi)。原因是這三個(gè)信號(hào)要同步發(fā)送如果時(shí)序偏差過(guò)大PHY側(cè)采樣時(shí)數(shù)據(jù)已經(jīng)發(fā)生變化就會(huì)出現(xiàn)偶發(fā)丟幀、網(wǎng)絡(luò)時(shí)延抖動(dòng)。實(shí)測(cè)中如果等長(zhǎng)差太多輕則100M不通重則自協(xié)商都不成功。地平面處理上變壓器下方要掏空整個(gè)內(nèi)層銅皮避免變壓器線圈通過(guò)寄生電容耦合到數(shù)字地平面形成共模干擾。變壓器區(qū)域的地單獨(dú)劃出來(lái)做EGNDEGND和主GND之間通過(guò)0Ω電阻或磁珠跨接再并聯(lián)一顆高壓電容增強(qiáng)高頻隔離。PHY芯片底部散熱焊盤(pán)必須接地通過(guò)多個(gè)過(guò)孔打到主地平面既散熱又降低地阻抗。4.3 晶振和50MHz時(shí)鐘的布局禁忌如果采用MCO1輸出50MHz給PHY這路時(shí)鐘線要當(dāng)作高速信號(hào)對(duì)待。它不能和TXD、RXD差分線長(zhǎng)距離并行間隔至少3倍線寬以上最好在兩路信號(hào)之間加一條地線隔離。時(shí)鐘線自己也要盡量短、直、少打過(guò)孔不能繞來(lái)繞去。這塊板第一次Layout時(shí)MCO1走線從PHY的RXD差分對(duì)附近繞了一圈結(jié)果實(shí)測(cè)以太網(wǎng)丟包率很高。后來(lái)把時(shí)鐘線改短、避開(kāi)差分區(qū)問(wèn)題才解決。凡是這類(lèi)高速數(shù)字信號(hào)時(shí)鐘路徑的每一寸都值得認(rèn)真對(duì)待。無(wú)源晶振方案更要注意晶振必須貼著X1/X2引腳放晶振下方不能走任何信號(hào)線晶振兩端電容的地過(guò)孔要直接到主地平面。5. CubeMX配置與硬件聯(lián)調(diào)全流程5.1 CubeMX端3個(gè)關(guān)鍵配置硬件畫(huà)完只是開(kāi)始F407的以太網(wǎng)外設(shè)初始化也要配合好。STM32CubeMX里打開(kāi)ETH外設(shè)后選擇RMII模式PHY Address這里填0要和PHYAD0引腳實(shí)際接法對(duì)應(yīng)。PHY Clock選擇MCO1輸出50MHz工具會(huì)自動(dòng)把PA8切換到復(fù)用功能并提示相關(guān)引腳沖突按提示確認(rèn)即可。復(fù)位腳配置成GPIO輸出比如用PA1接LAN8720A的nRSTCubeMX里把它配成GPIO Output初始電平設(shè)高或低都可以后面代碼里先拉低再拉高完成復(fù)位。DMA配置建議打開(kāi)收發(fā)各分配一個(gè)DMA通道減少CPU中斷負(fù)擔(dān)。MAC地址可以先用固定的靜態(tài)地址后期再考慮從外部存儲(chǔ)讀取。這里容易忽略的是MDIO必須配置為開(kāi)漏輸出帶上拉PHY的管理接口是雙向工作機(jī)制開(kāi)漏加外部上拉才能正常讀寫(xiě)寄存器。CubeMX里MDIO對(duì)應(yīng)的GPIO要選開(kāi)漏模式內(nèi)部上拉默認(rèn)打開(kāi)一般夠用如果板子上MDIO走線較長(zhǎng)建議在原理圖上再外接一個(gè)2.2kΩ上拉電阻。5.2 上電后按順序做的5分鐘驗(yàn)證拿到新板子不要急著跑網(wǎng)絡(luò)協(xié)議棧按下面的順序做驗(yàn)證能省大量排查時(shí)間。第一步測(cè)電源。用萬(wàn)用表量3.3V是否正常量LAN8720A的VDDCR引腳電壓應(yīng)該在1.2V左右。如果VDDCR是0V先檢查3.3V有沒(méi)有到芯片再懷疑焊接問(wèn)題如果VDDCR接近3.3V馬上斷電查是不是把外部電源錯(cuò)接到了VDDCR引腳。第二步示波器看50MHz時(shí)鐘。找到PHY的X1引腳或REF_CLK引腳用示波器量有沒(méi)有穩(wěn)定的50MHz方波或正弦波疊加上直流。沒(méi)有時(shí)鐘說(shuō)明MCO1配置不對(duì)或晶振沒(méi)起振此時(shí)后面所有驗(yàn)證都不用繼續(xù)。第三步量RMII信號(hào)。用示波器或邏輯分析儀看TXD、TX_EN、CRS_DV在MCU初始化后是否有信號(hào)翻轉(zhuǎn)。特別注意CRS_DV在空閑時(shí)是低還是高它應(yīng)該和PHY狀態(tài)一致。第四步插網(wǎng)線看link狀態(tài)。接上交換機(jī)或電腦網(wǎng)口看LAN8720A的link LED是否常亮或閃爍注意鎖定LED極性和工作模式。第五步讀PHY寄存器。通過(guò)MDIO接口讀取PHY IDLAN8720A應(yīng)該能讀到OUI和Model ID組合出來(lái)的固定值。能讀回ID說(shuō)明MDIO管理通道正常鏈路物理層已經(jīng)工作。// 以F407的LwIP驅(qū)動(dòng)為例讀取PHY ID寄存器 uint32_t phy_id 0; // LAN8720A的寄存器2是PHYIDR1寄存器3是PHYIDR2 uint32_t idr1 ETH_ReadPHYRegister(0, 2); // PHY地址0寄存器2 uint32_t idr2 ETH_ReadPHYRegister(0, 3); // PHY地址0寄存器3 phy_id (idr1 16) | idr2; // LAN8720A的IDR1/IDR2組合結(jié)果應(yīng)能識(shí)別為L(zhǎng)AN8720A家族5.3 軟件調(diào)試中容易踩的三個(gè)坑第一個(gè)坑是PHY地址不一致硬件PHYAD0引腳拉低了軟件里卻填地址1MDIO讀寫(xiě)全部超時(shí)。CubeMX里的PHY Address要和硬件一一對(duì)應(yīng)如果改了硬件跳線軟件也要跟著改。第二個(gè)坑是MDIO沒(méi)有上拉。MDIO是雙向開(kāi)漏信號(hào)必須有上拉電阻才能正常拉高。F407內(nèi)部上拉通常能用但自己在原理圖上加一顆2.2kΩ到3.3V最穩(wěn)妥。之前調(diào)一塊板子時(shí)MDIO走線穿過(guò)了一個(gè)排針區(qū)域寄生電容比較大內(nèi)部上拉不夠?qū)е伦x寄存器隨機(jī)失敗補(bǔ)了外部上拉后正常。第三個(gè)坑是復(fù)位后沒(méi)有延時(shí)。PHY上電后內(nèi)部需要時(shí)間完成自校準(zhǔn)和穩(wěn)壓器啟動(dòng)上電或復(fù)位釋放后至少要延時(shí)10毫秒再訪問(wèn)寄存器。很多驅(qū)動(dòng)代碼里復(fù)位后緊接著就訪問(wèn)PHY導(dǎo)致初始化失敗。我習(xí)慣在PHY復(fù)位釋放后直接延時(shí)20毫秒穩(wěn)一點(diǎn)沒(méi)壞處。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄6.1 問(wèn)題速查表現(xiàn)象可能原因排查順序插網(wǎng)線link燈完全不亮PHY供電、時(shí)鐘、復(fù)位不正常或變壓器中心抽頭接錯(cuò)量3.3V和VDDCR電壓示波器看50MHz時(shí)鐘檢查復(fù)位電平最后量變壓器引腳link燈亮但ping不通RMII信號(hào)線接錯(cuò)、MDIO配置錯(cuò)誤、軟件PHY地址不對(duì)確認(rèn)CRS_DV接的是ETH_CRS_DV而非RX_DV檢查CubeMX里PHY地址和MDIO引腳只有10M能通100M不通差分對(duì)阻抗不匹配或變壓器中心抽頭偏置不對(duì)或TX信號(hào)等長(zhǎng)差太多檢查差分線阻抗量中心抽頭電壓核對(duì)TXD[1:0]和TX_EN布線長(zhǎng)度偶爾丟包、ping時(shí)延抖動(dòng)時(shí)鐘質(zhì)量問(wèn)題、地平面分割、相鄰信號(hào)串?dāng)_示波器看MCO1時(shí)鐘抖動(dòng)檢查變壓器區(qū)是否掏空鋪銅檢查時(shí)鐘線是否靠近差分線PHY芯片發(fā)燙VDDCR外接錯(cuò)電源、電源去耦不足、引腳焊接短路斷電萬(wàn)用表量各電源引腳對(duì)地阻值排查焊接連錫核對(duì)VDDCR接法只有自己的板子不通換別人板子正常PHY復(fù)位時(shí)序不夠、軟件配置問(wèn)題在PHY復(fù)位后加長(zhǎng)延時(shí)確認(rèn)軟件PHY地址、時(shí)鐘配置匹配6.2 一次“玄學(xué)”問(wèn)題的排查實(shí)錄這塊板子調(diào)試時(shí)也遇到了一個(gè)非常典型的疑難雜癥網(wǎng)線插上link燈正常亮自協(xié)商能過(guò)但ping包偶發(fā)超時(shí)重試幾次又能通。一開(kāi)始懷疑軟件問(wèn)題把LwIP參數(shù)來(lái)回調(diào)沒(méi)解決。后來(lái)用示波器抓PHY的RXD信號(hào)發(fā)現(xiàn)接收數(shù)據(jù)在個(gè)別字節(jié)上有毛刺正好發(fā)生在差分線經(jīng)過(guò)變壓器到RJ45的那一段。用萬(wàn)用表逐個(gè)點(diǎn)量RJ45母座引腳對(duì)地阻值發(fā)現(xiàn)其中一個(gè)差分對(duì)引腳對(duì)地阻值比理論值低了接近一倍拆下來(lái)看是RJ45座子焊接時(shí)錫膏橋接把中心抽頭和其中一個(gè)差分腳之間拉了一條毛刺。這類(lèi)問(wèn)題最難的地方在于它不穩(wěn)定時(shí)好時(shí)壞。經(jīng)驗(yàn)是先分層——物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層一步步隔離再結(jié)合示波器看信號(hào)質(zhì)量不要一上來(lái)就懷疑協(xié)議棧。后面我把RJ45封裝改成底部開(kāi)大窗的手工焊盤(pán)徹底杜絕了焊接橋接隱患再也沒(méi)出現(xiàn)過(guò)類(lèi)似丟包。這個(gè)板子的經(jīng)驗(yàn)也是我在后續(xù)所有以太網(wǎng)項(xiàng)目里一定會(huì)執(zhí)行的一條原則LAN8720A外圍電路盡量照官方參考設(shè)計(jì)走但每處接法的“原因”必須自己搞清楚。中心抽頭為什么接這里、時(shí)鐘為什么從MCO出、串阻為什么要預(yù)留全弄明白了以后再換PHY芯片、再畫(huà)新板子都不會(huì)被同一批問(wèn)題絆住。如果你現(xiàn)在正在調(diào)F407LAN8720A把上面這些點(diǎn)挨個(gè)核對(duì)一遍大概率能少熬好幾個(gè)通宵。