試核心:CFG0/CFG1引腳如何配置I2C地址與模式)
做GMSL方案的車載攝像頭、激光雷達(dá)或者域控項目調(diào)試時第一階段基本都卡在同一個地方I2C掃不到設(shè)備。這時候硬件工程師會讓你先量一下CFG0和CFG1的電平很多人第一次聽這兩個引腳名是懵的。GMSL的Strapping Pins CFG0/CFG1說的就是在串行器或解串器芯片上靠外部上下拉電阻設(shè)定芯片地址、工作模式等信息的硬件配置引腳。這篇文章就把這兩個引腳講透從原理到實操再到我調(diào)板時踩過的坑一次說清楚。這類內(nèi)容適合正在做GMSL相關(guān)項目的人看特別是硬件工程師、嵌入式驅(qū)動工程師和做車載攝像頭模組的同學(xué)。如果你只是聽說過GMSL但還沒開始用也能通過這篇文章建立完整的硬件配置認(rèn)知框架。1. 為什么做GMSL配置時躲不開CFG0/CFG11.1 GMSL方案到底是什么它和普通I2C設(shè)備有什么不同GMSL全稱是Gigabit Multimedia Serial Link也就是千兆多媒體串行鏈路由Maxim Integrated現(xiàn)在屬于ADI提出后來在車載高清攝像頭、激光雷達(dá)、毫米波雷達(dá)這些傳感器數(shù)據(jù)傳輸場景里成了事實標(biāo)準(zhǔn)。它最核心的特點是用了同軸電纜一根線把攝像頭的MIPI CSI-2視頻信號、I2C控制信號、GPIO觸發(fā)信號全部打包成高速差分串行數(shù)據(jù)在一條同軸線上同時雙向傳輸。視頻下行帶寬高控制信號上行低速兩者用不同頻段復(fù)用在同一根同軸電纜里這技術(shù)細(xì)節(jié)以后聊POCPower over Coax同軸電纜供電的時候再展開。和普通I2C設(shè)備最大的區(qū)別在于GMSL鏈路里有兩類芯片靠近攝像頭傳感器一側(cè)的叫串行器也就是Serializer通常標(biāo)記為MAX96717、MAX96715這些型號靠近域控或SoC一側(cè)的叫解串器也就是Deserializer常見型號是MAX96755、MAX96712這類。域控的I2C控制器只能直接訪問解串器而解串器要訪問遠(yuǎn)端串行器必須通過GMSL鏈路把I2C數(shù)據(jù)包封進(jìn)高速串行流里轉(zhuǎn)發(fā)過去。這就帶出一個關(guān)鍵問題一條GMSL鏈路上有兩顆芯片每顆都需要有自己獨(dú)立的I2C地址否則控制器沒法區(qū)分當(dāng)前到底在和誰通信。默認(rèn)情況下同一型號的串行器和同一型號的解串器出廠地址是一樣的這不炸了兩片全叫0x40總線上寫誰呢解決這個問題的方案之一就是芯片在復(fù)位釋放的瞬間把特定IO引腳的電平鎖存下來用于改變芯片內(nèi)部寄存器里的地址映射這些引腳就是Strapping Pins其中最重要的一對就是CFG0和CFG1。1.2 為什么用硬件引腳而不是純軟件配置不少人會問既然芯片內(nèi)部有寄存器為什么不能上電后直接用軟件改地址非要板子上拉幾個電阻這里面的邏輯很現(xiàn)實。第一芯片剛上電時I2C從機(jī)還沒有一個獨(dú)立的地址就算軟件想寫寄存器也不知道往哪個地址寫這是雞生蛋的問題。第二GMSL鏈路建立本身就需要先通過I2C配置鏈路一旦不通遠(yuǎn)離控制器的那顆芯片完全無法被訪問你必須給它一個出廠就能被識別到的地址。第三硬件Strapping Pin在芯片復(fù)位釋放時被采樣這個機(jī)制不依賴任何固件和驅(qū)動屬于“裸機(jī)可識別”級別哪怕后面固件崩潰了只要硬件連接還在地址就不會變。用硬件引腳做地址分配的思路在生活中其實很常見。就像每家每戶的信箱編號——不是等郵遞員來了再臨時問“你家?guī)滋枴倍情T牌號早就釘在門上了。Strapping Pin就是這顆芯片的“門牌號”它在上電那一瞬間被鎖存下來之后整個運(yùn)行周期都有效除非硬件重新復(fù)位。當(dāng)然不是所有GMSL芯片都只靠CFG0/CFG1兩個引腳有些芯片會有CFG0到CFG7八個引腳用于表達(dá)更復(fù)雜的配置信息但原理完全一致。大多數(shù)主流串行器和解串器產(chǎn)品里CFG0/CFG1組合是最核心的兩個配置位所以我下面都以這對引腳為主來做拆解。2. CFG0/CFG1引腳的功能與配置規(guī)則2.1 引腳電平如何轉(zhuǎn)化為地址和模式把CFG0/CFG1引腳接高電平VIO或者接低電平GND給芯片一個確定的邏輯值芯片在復(fù)位釋放時將這兩個邏輯值鎖存到內(nèi)部寄存器中。這個鎖存過程通常發(fā)生在芯片的復(fù)位引腳從低拉高、電源電壓達(dá)到門限之后的一段固定時間內(nèi)具體時間窗口每顆芯片略有差異常見的是幾十微秒到幾百微秒。過了這個采樣窗口你再怎么撥動這兩個引腳的電平都不會改變當(dāng)前地址必須重新復(fù)位才能重新采樣。這兩個引腳能編碼的狀態(tài)是兩兩組合每種組合可以對應(yīng)一個獨(dú)立的I2C設(shè)備地址也可以對應(yīng)一種工作模式或者一條GMSL鏈路的物理順序。不同的芯片型號、封裝、版本映射關(guān)系都可能有差異所以做設(shè)計時第一件事永遠(yuǎn)是查對應(yīng)型號的數(shù)據(jù)手冊去找到“Configuration Pins”或“Strapping Pins”那一章把映射表抄出來。網(wǎng)上很多方案是拿MAX96717配MAX96755來做的如果你也用的是這兩個可以直接參照后面章節(jié)的地址配置方法但換型號就要重新確認(rèn)。這里有一個非常重要的概念Strapping Pin鎖存的是“地址映射”不是“最終地址”。什么意思芯片內(nèi)部地址寄存器里面有一個I2C目標(biāo)地址寄存器Strapping Pin的值一般會決定這個目標(biāo)地址是從默認(rèn)值開始加偏移還是直接切換到另一個預(yù)設(shè)值。比如某些解串器上CFG0/CFG1兩個引腳接法對應(yīng)關(guān)系是這樣的CFG0接高、CFG1接低時設(shè)備地址從默認(rèn)0x80偏移到0x82反過來CFG0接低、CFG1接高時偏移到0x84。注意有些芯片數(shù)據(jù)手冊里會把I2C地址寫成7位格式比如0x40而實際總線通信時是8位格式等于0x80因為最低位是讀寫標(biāo)志位。這是我調(diào)試時最容易犯糊涂的地方后面講到排查問題的時候再詳細(xì)說。2.2 不同芯片型號的典型配置組合參考為了讓大家有一個直觀的參考我整理了常見GMSL串行器和解串器關(guān)于CFG0/CFG1的典型配置邏輯但請務(wù)必以你手里那顆芯片的官方數(shù)據(jù)手冊為準(zhǔn)這里只是幫你建立找規(guī)律的思路。CFG0電平CFG1電平典型含義以常見串行器為例典型含義以常見解串器為例低GND低GND設(shè)備地址0x40默認(rèn)值設(shè)備地址0x80默認(rèn)值低GND高VIO設(shè)備地址0x42設(shè)備地址0x82高VIO低GND設(shè)備地址0x44設(shè)備地址0x84高VIO高VIO設(shè)備地址0x46設(shè)備地址0x86看到這個規(guī)律了嗎CFG0和CFG1組合起來相當(dāng)于一個兩位的二進(jìn)制數(shù)接低算0接高算1。串行器這邊組合值作為一個偏移疊加到默認(rèn)地址0x40上偏移量等于組合值的兩倍解串器這邊默認(rèn)地址通常是0x80但偏移規(guī)則要具體情況具體分析。有一些芯片的CFG引腳不僅影響I2C地址還會影響GMSL鏈路速率模式、GPIO功能映射、I2C速率上限等參數(shù)配置之前需要通讀寄存器手冊。我的建議是在原理圖設(shè)計階段就把CFG0/CFG1的期望電平用表格方式標(biāo)注在原理圖上比如“CFG0: 1上拉到VIO”、“CFG1: 0下拉到GND”并且把這個表和固件配置地址寫到一塊。這樣后面硬件調(diào)試、軟件聯(lián)調(diào)的時候兩邊拿著同一份表格能省掉大量靠猜來排查地址的時間。2.3 上拉下拉電阻值和電平精度的工程取舍CFG0/CFG1的電平不是直接把引腳接到VIO或GND那么簡單一般在引腳和電源或者地之間串聯(lián)一顆電阻。從電路功能上講直接接死其實也能工作但串聯(lián)電阻主要是為了調(diào)試靈活性和兼容性考慮。電阻阻值的選擇上4.7kΩ到10kΩ是常見區(qū)間。為什么不能太大因為引腳內(nèi)部通常有一個小的下拉電流源或者漏電流電阻太大時引腳上的壓降會大到把邏輯電平拉到不確定區(qū)域。我見過有人用100kΩ上拉到3.3V結(jié)果實測引腳下降到1.1V而芯片的高電平門限是2.0V直接導(dǎo)致采樣的邏輯值錯誤設(shè)備地址完全不對。反過來電阻也不能太小否則靜態(tài)功耗增大在汽車電子這種對靜態(tài)電流有嚴(yán)格要求的場景會造成不必要的電量損耗。另外有個容易被忽略的點CFG0/CFG1的電平參考電壓是VIO引腳電壓不是芯片主電源電壓。如果VIO接的是1.8V那么CFG引腳的高電平就是1.8V低電平是0V。用3.3V上拉去配1.8V的VIO輕則采樣邏輯異常重則超過引腳絕對最大額定值。所以設(shè)計時上拉電阻的另一端一定要接到VIO別想當(dāng)然地接到3.3V或者5V上。3. 實戰(zhàn)從原理圖到PCBA的完整配置流程3.1 設(shè)計前的確認(rèn)清單別漏掉的那張映射表新做一個GMSL攝像頭方案時硬件原理圖階段就要把CFG0/CFG1的配置定下來。但很多工程師習(xí)慣先把原理圖丟出去等到板廠已經(jīng)開工了才發(fā)現(xiàn)地址配錯了。這其實是流程管理的問題因為CFG0/CFG1雖然只是兩顆電阻的接法但它的影響范圍覆蓋整個鏈路通信改起來牽一發(fā)動全身。我一般的流程是先建一個引腳配置確認(rèn)清單至少包含以下幾項串行器型號、封裝、引腳編號確認(rèn)CFG0/CFG1對應(yīng)哪些封裝引腳解串器型號、封裝、引腳編號目標(biāo)I2C地址串行器是多少解串器是多少和SoC端地址是否沖突CFG0/CFG1組合值與目標(biāo)地址的映射關(guān)系必須從數(shù)據(jù)手冊里摘錄原文VIO電壓等級上拉電阻接哪一路電源該配置是否影響GMSL鏈路模式或其他功能這張表單我建議在原理圖評審階段就發(fā)給硬件、軟件、系統(tǒng)三個人同時過一遍。軟件這邊還好說反正API接口層可以適配不同地址怕就怕硬件改了一顆電阻軟件不知道還是拿舊地址去掃描結(jié)果白白查了兩天找不到原因。3.2 原理圖階段兩顆電阻怎么擺都有講究確認(rèn)了映射關(guān)系之后原理圖設(shè)計就是畫兩顆電阻的事一顆上拉到VIO一顆下拉到GND。這時候有幾個細(xì)節(jié)需要考慮。第一CFG0和CFG1的走線要盡量短直接從芯片引腳拉到電阻端。雖然這是靜態(tài)電平信號不像I2C那樣講究信號完整性但如果走線太長且旁邊有高速開關(guān)電源可能耦合噪聲導(dǎo)致復(fù)位釋放瞬間采到錯誤電平。第二上電瞬間電源的爬升斜率要關(guān)注如果VIO爬升太慢芯片復(fù)位釋放時VIO還沒到高電平門限這時CFG引腳即使上拉了也可能被采為低電平。這個問題的典型處理方法是把復(fù)位RC延時調(diào)大一點確保復(fù)位釋放發(fā)生在VIO穩(wěn)定之后。第三兩個引腳不要為了對稱美觀就照搬參考設(shè)計而要根據(jù)實際芯片封裝引腳排布來決定避免過孔太多、繞線太長。原理圖里建議加注釋說明這兩顆電阻的用途比如“R120: CFG0 pull-up to VIO, I2C addr0x42”。這個注釋在PCB Layout評審、生產(chǎn)測試、后期維護(hù)階段都能幫大忙。我接手過一塊別人畫的板子上面一堆電阻沒有網(wǎng)絡(luò)名沒有注釋為了確認(rèn)CFG0為什么上拉只能拿著萬用表一顆顆點效率極低。3.3 焊板后實測驗證怎么確認(rèn)引腳真的鎖存對了板子焊接完成、準(zhǔn)備上電調(diào)試時不要急著接攝像頭或者加載驅(qū)動先手動驗證CFG0/CFG1是否被正確鎖存。我的標(biāo)準(zhǔn)流程是這樣的先用萬用表測CFG0/CFG1引腳對GND的電壓確認(rèn)硬件連接無誤該高的高、該低的低。注意這里測的是芯片引腳本身的電壓不是電阻另一端的電源電壓防止電阻虛焊導(dǎo)致引腳懸空。然后給系統(tǒng)上電用I2C掃描工具掃描總線。市面上常見的USB轉(zhuǎn)I2C調(diào)試器都可以比如Aardvark、Total Phase或者直接用樹莓派的I2C接口也行。掃描結(jié)果里應(yīng)該能看到目標(biāo)設(shè)備地址出現(xiàn)在總線上。如果掃描出來的地址和設(shè)計值不一致先別懷疑寄存器配置大概率是Strapping Pin采樣出了問題。重新斷電用萬用表再量一次引腳電壓確認(rèn)之前的設(shè)計值無誤。如果電壓都對但地址不對那就需要把這個芯片的復(fù)位引腳手動拉低再拉高重新觸發(fā)采樣同時用示波器抓復(fù)位釋放時刻CFG引腳的電平波形看是否有毛刺。實測下來CFG0/CFG1配錯地址導(dǎo)致的典型現(xiàn)象是I2C掃描總線上多了一個地址或者少了一個地址。多了一個地址通常是串行器被分配了和總線上其他設(shè)備相同的地址少了一個地址通常是引腳懸空或者電平不確定芯片內(nèi)部把這個值判成了保留組合。3.4 I2C地址沖突檢查一上總線就有兩臺設(shè)備響應(yīng)GMSL系統(tǒng)里最大的隱患之一就是I2C地址沖突。一塊域控板上可能同時接多路攝像頭每路串行器、每路解串器都要有獨(dú)立地址。雖然GMSL的轉(zhuǎn)發(fā)機(jī)制可以做到在物理層隔離I2C請求但如果地址分配不合理同一I2C總線上兩個設(shè)備響應(yīng)同一個地址控制器收到的數(shù)據(jù)就是兩個設(shè)備響應(yīng)結(jié)果的疊加通信數(shù)據(jù)完全不可信而且表現(xiàn)非常隨機(jī)。我用過一個四路攝像頭方案四個解串器集成在一顆四通道芯片里地址用內(nèi)部寄存器配置外部只需要給每個通道配置串行器地址。四顆串行器型號相同、默認(rèn)地址一樣就必須靠每顆芯片旁邊的CFG0/CFG1組合來錯開。四顆串行器的地址分配方案可以這樣設(shè)計第1路串行器CFG0接地CFG1接地地址0x40第2路串行器CFG0接地CFG1接高地址0x42第3路串行器CFG0接高CFG1接地地址0x44第4路串行器CFG0接高CFG1接高地址0x46但要注意不是所有芯片都支持四個地址有些芯片只有三個有效組合其中一個組合是屏蔽地址或者測試模式。所以設(shè)計前要仔細(xì)確認(rèn)數(shù)據(jù)手冊里的地址映射表不要想當(dāng)然認(rèn)為四個組合一定對應(yīng)四個地址。還有一個容易踩的坑很多SoC的I2C控制器本身也在總線上占用一個地址或者總線上還有其他傳感器共用這條總線。GMSL設(shè)備的地址范圍通常集中在0x40到0x4F、0x80到0x8F這些區(qū)域規(guī)劃地址時要先把總線上所有設(shè)備的地址列出來做成一張地址分配表避免沖突。這張表要同步給軟件團(tuán)隊驅(qū)動初始化時就按這張表來枚舉設(shè)備。3.5 多路攝像頭場景下的地址規(guī)劃實戰(zhàn)多路攝像頭場景比單路復(fù)雜得多我舉個具體的四路方案來演示完整規(guī)劃過程。假設(shè)SoC通過一條I2C總線控制一顆四通道解串器這顆解串器的I2C地址由自身引腳和寄存器共同決定設(shè)為默認(rèn)地址0x80。四路串行器地址通過CFG0/CFG1分別配置為0x40、0x42、0x44、0x46。理論上SoC訪問0x80時和四顆串行器直接通信嗎不行還要在解串器里配置一個I2C地址轉(zhuǎn)發(fā)表把遠(yuǎn)端串行器的地址映射到解串器內(nèi)部的不同通道。這個映射關(guān)系到GMSL機(jī)制的一個核心概念在解串器內(nèi)部四個通道地址可以各不相同比如把通道0的串行器映射成0x40通道1映射成0x42以此類推。驅(qū)動初始化時會依次訪問0x40、0x42、0x44、0x46但實際上這些請求都被解串器截獲根據(jù)對應(yīng)通道轉(zhuǎn)發(fā)到遠(yuǎn)端的串行器。所以串行器的CFG0/CFG1地址必須和驅(qū)動初始化時的通道枚舉順序精確匹配否則鏈路建鏈后無法正常通信。我在一次實際項目里就遇到這種事三路攝像頭前兩路圖像正常第三路黑屏。查了半天最后定位到第三路串行器的CFG0/CFG1電阻在貼片時被貼錯位置實際地址是0x44但軟件按0x46去訪問自然沒反應(yīng)。這個案例再次印證了CFG0/CFG1的硬件連接必須和軟件地址表保持完全一致的結(jié)論。4. 常見問題與排查技巧實錄4.1 設(shè)備掃描不到先查地址還是先查鏈路I2C掃不到GMSL設(shè)備時很多人第一反應(yīng)是查鏈路配置、查寄存器但我會先查地址。為什么因為地址查詢成本最低一個I2C掃描命令就能搞定卻能排除一大半問題。具體排查順序如下用I2C掃描工具掃描整個地址空間看是否有設(shè)備應(yīng)答如果掃描結(jié)果為空優(yōu)先用示波器或萬用表確認(rèn)SDA、SCL線序是否正確、上拉電阻是否焊接如果SCL有波形、SDA無應(yīng)答再回頭量CFG0/CFG1引腳電壓確認(rèn)地址是否和預(yù)期一致如果CFG引腳電壓正常再查解串器的LOCK引腳或寄存器確認(rèn)GMSL鏈路是否已經(jīng)建鏈如果鏈路未建鏈需要查串行器側(cè)的電源、時鐘、復(fù)位以及同軸線纜連接這個順序能幫你快速定位問題層級先排除地址配置問題再排除鏈路物理問題最后才深入到協(xié)議和寄存器配置。很多新手容易跳過第一步直接開始查寄存器結(jié)果發(fā)現(xiàn)一切正常但就是不通最后才想到是地址配置被貼反了浪費(fèi)時間。4.2 I2C地址是0x40還是0x807位和8位格式別搞混GMSL芯片數(shù)據(jù)手冊里對I2C地址的標(biāo)注有兩種習(xí)慣一種是寫7位地址比如0x40另一種是寫8位地址比如0x80。這兩種寫法差一位原理上是同一個設(shè)備但如果你在驅(qū)動程序里寫錯了就會出現(xiàn)永遠(yuǎn)掃不到設(shè)備的詭異現(xiàn)象。最簡單的換算方法8位地址等于7位地址左移一位最低位是0表示寫操作是1表示讀操作。比如7位地址0x40對應(yīng)8位地址0x807位地址0x62對應(yīng)8位地址0xC4。很多Linux內(nèi)核里的I2C子系統(tǒng)API默認(rèn)使用7位地址而數(shù)據(jù)手冊寄存器表里可能寫的是8位地址這中間需要一次轉(zhuǎn)換。我踩過的坑是某款解串器數(shù)據(jù)手冊里明確寫“I2C device address is 0x80”我當(dāng)時在驅(qū)動里直接寫0x80結(jié)果總線掃描一直失敗。后來仔細(xì)看才發(fā)現(xiàn)內(nèi)核的i2c-core會把傳入地址當(dāng)成7位再用所以實際發(fā)出去的是0x80左移一位后的0x100直接超范圍無效。正確寫法是傳0x40讓內(nèi)核自動轉(zhuǎn)換為8位0x80。4.3 上電時序?qū)FG引腳采樣的影響怎么排查上電時序問題比電阻焊接問題更隱蔽。CFG0/CFG1的采樣發(fā)生在復(fù)位釋放瞬間如果此時VIO電源還沒有穩(wěn)定即使引腳接了正確的上拉電阻芯片也可能采到中間電平或錯誤電平。排查這類問題需要用示波器同時抓三路信號VIO電源爬升波形、復(fù)位引腳波形、CFG0引腳波形。正常的時序應(yīng)該是VIO先爬升到穩(wěn)定電壓然后復(fù)位引腳從低拉高而CFG引腳在復(fù)位拉高之前就已經(jīng)穩(wěn)定在目標(biāo)電平。如果抓到VIO還沒穩(wěn)住復(fù)位就釋放了解決辦法有幾個調(diào)整復(fù)位RC延時增大RC常數(shù)讓復(fù)位釋放晚于VIO穩(wěn)定如果SoC GPIO控制復(fù)位增加固件延時先讓電源穩(wěn)定再釋放復(fù)位在CFG引腳到地之間并聯(lián)一個小電容比如0.1uF抑制上電瞬間的毛刺干擾我之前在一塊板子上就遇到這個問題常溫下一切正常低溫環(huán)境下I2C偶爾掃不到設(shè)備。后來用示波器抓低溫啟動波形發(fā)現(xiàn)電源芯片低溫啟動變慢復(fù)位RC時間不夠?qū)е翪FG引腳還沒穩(wěn)定就被采樣。把復(fù)位RC常數(shù)從10ms改成50ms后問題徹底消失。這個案例充分說明Strapping Pin不是只畫兩顆電阻那么簡單上電時序是整個配置可靠性的隱藏前提。4.4 常見問題速查表把實際調(diào)試中經(jīng)常遇到的問題整理成速查表方便回頭對照。現(xiàn)象可能原因排查方法解決措施I2C掃描無任何設(shè)備應(yīng)答SDA/SCL線序接反、上拉缺失萬用表測SDA/SCL電壓修正接線補(bǔ)齊上拉電阻掃描結(jié)果多出未知地址CFG引腳懸空采樣到綜合電平萬用表測CFG引腳電壓補(bǔ)焊上下拉電阻確認(rèn)電平掃描到設(shè)備但讀寫無響應(yīng)7位/8位地址格式混用檢查驅(qū)動中地址格式統(tǒng)一用7位地址格式低溫或異常啟動時偶爾掃不到VIO未穩(wěn)復(fù)位已釋放示波器抓上電時序增大復(fù)位RC延時或軟件延時地址正確但鏈路建不起來串行器電源或時鐘異常查串行器側(cè)電源和MFP時鐘修復(fù)對應(yīng)供電或時鐘電路多路中某一路不通該路CFG電阻貼錯量CFG引腳電壓對比設(shè)計表返修電阻或修改軟件地址表復(fù)位后地址仍不變芯片處于復(fù)位狀態(tài)未重新采樣確認(rèn)復(fù)位引腳釋放拉低復(fù)位再拉高重新采樣這張表里的每一項都是我在實際項目中踩過的或者同事踩過的希望你看完能少走彎路。4.5 飛線改配置的小技巧有時候板子已經(jīng)打樣回來了才發(fā)現(xiàn)CFG0/CFG1配置需要改這時候飛線是最高效的辦法。飛線的基本原則是要改成低電平就把引腳對GND飛一根線或者把原上拉電阻摘掉再對地飛線要改成高電平就把引腳對VIO飛一根線。飛線盡量短直接從芯片引腳飛到最近的電源或地過孔避免在板上繞一大圈形成天線效應(yīng)。飛線改完以后一定要重新斷電再上電讓芯片重新采樣Strapping Pin否則你會覺得改了和沒改一樣。另外飛線只能用于調(diào)試驗證不能作為量產(chǎn)方案。量產(chǎn)板必須在改版時把原理圖和PCB一起更新避免后續(xù)生產(chǎn)還是按舊圖紙貼片。4.6 寄存器改動和硬件配置的聯(lián)動關(guān)系說一個很多人忽略的點硬件Strapping Pin設(shè)的地址是芯片上電時的“默認(rèn)地址”但芯片正常工作后內(nèi)部寄存器里的地址是可以被軟件修改的。也就是說CFG0/CFG1不是一錘子買賣。為什么還要保留這個機(jī)制因為存在一個時序上的需求SoC上電時先要訪問默認(rèn)地址來發(fā)送初始化序列這個初始化序列會把串行器的地址從一個默認(rèn)值改成新的值以釋放總線地址空間給其他設(shè)備。所以你會看到某些驅(qū)動里有一段“change I2C address”的邏輯把0x40改成0x42之類的操作。這屬于正常的寄存器配置流程不是硬件配置失效。不過要特別注意如果軟件改了設(shè)備地址但后面又觸發(fā)了芯片復(fù)位芯片會重新回到Strapping Pin設(shè)定的默認(rèn)地址。所以如果調(diào)試中出現(xiàn)“地址多變”的問題不要懷疑CFG引腳先查是不是有未處理的復(fù)位信號或看門狗復(fù)位在起作用。我遇到過某塊板子因為看門狗超時不斷復(fù)位芯片導(dǎo)致動態(tài)改寫的地址反復(fù)失效看起來就像CFG配置不穩(wěn)定一樣。這類問題光看原理圖很難發(fā)現(xiàn)得抓時序才能定位。5. 工具和調(diào)試方法推薦5.1 I2C調(diào)試工具怎么選調(diào)試GMSL鏈路一個稱手的I2C調(diào)試工具能讓你效率翻倍。我自己的經(jīng)驗是不同階段用不同工具沒有一把萬能鑰匙。開發(fā)初期做寄存器驗證推薦用USB轉(zhuǎn)I2C調(diào)試器支持命令行掃描和腳本自動化方便批量讀寫寄存器。這里給個小建議如果你用Total Phase Aardvark可以直接用它的Control Center軟件做圖形化操作比命令行直觀不少。Linux環(huán)境下我還會在樹莓派上寫一個I2C讀寫小腳本配合gpio控制復(fù)位腳實現(xiàn)一鍵初始化鏈路、一鍵掃描設(shè)備。量產(chǎn)測試階段重點是快速判斷每臺設(shè)備的實際I2C地址是否和配置表匹配。我會寫一段自動化測試腳本掃描總線上所有地址和預(yù)期表比對不一致就直接上報。這個腳本還能順帶驗證上電時序做法是腳本控制復(fù)位引腳延時不同的時間后掃描地址確認(rèn)Strapping Pin采樣是否都正確。5.2 示波器抓取CFG引腳采樣波形的幾個技巧排查CFG引腳采樣問題時示波器是終極診斷工具。但抓這個波形有幾個技巧不掌握的話容易誤判。首先觸發(fā)放置在復(fù)位引腳上用下降沿觸發(fā)準(zhǔn)備然后拉低復(fù)位再拉高復(fù)位觸發(fā)點就是復(fù)位釋放的上升沿。此時在CFG引腳通道上應(yīng)該看到的是一個穩(wěn)定的高或低電平而不是隨機(jī)的跳動信號。如果CFG引腳在復(fù)位釋放后還持續(xù)跳變幾十毫秒說明引腳可能處于懸空狀態(tài)或者上拉電阻虛焊。其次盡量使用差分探頭或短地線夾避免長地線引入噪聲。CFG引腳是靜態(tài)電平對噪聲容忍度其實很高但在高速開關(guān)電源旁邊時地彈和輻射噪聲可能讓波形出現(xiàn)毛刺。我見過一次CFG引腳的示波器波形上疊加了高達(dá)1V的開關(guān)噪聲毛刺芯片直接判成了高電平而萬用表量出來是低電平。示波器一抓真相立現(xiàn)。最后把VIO的爬升波形和復(fù)位釋放波形放在同一畫面里看時序關(guān)系。設(shè)定好觸發(fā)位置一次上電就能把三路信號全部抓下來判斷是否符合“VIO先穩(wěn)、復(fù)位后釋放、CFG先定”的時序要求。5.3 GMSL鏈路建立后怎么快速確認(rèn)通信正常CFG0/CFG1配置正確只是第一步還要確認(rèn)GMSL鏈路通信正常。除了I2C讀寫之外有幾個寄存器位是必查的。串行器側(cè)查LOCK狀態(tài)和視頻流發(fā)送狀態(tài)寄存器確認(rèn)傳感器端PCLK、MIPI信號是否正常送入。解串器側(cè)查LOCK狀態(tài)和通道鎖定寄存器確認(rèn)同軸鏈路的鎖定狀態(tài)。還有GPIO狀態(tài)寄存器可以用來確認(rèn)同軸電纜的通斷。經(jīng)驗之談鏈路建鏈后再回頭檢查CFG寄存器配置值確保Strapping Pin鎖存的值確實寫入了對應(yīng)的地址映射寄存器。這一條看似多余但能幫你區(qū)分“硬件上CFG采錯了”和“軟件初始化又把地址改掉了”這兩種不同的問題。我寫過一個小函數(shù)初始化完成后把所有關(guān)鍵寄存器的值回讀一遍打日志存檔問題出現(xiàn)時直接翻日志能省很多排查時間。6. 量產(chǎn)階段CFG0/CFG1的注意事項6.1 貼片和測試環(huán)節(jié)容易漏檢的事從樣品到量產(chǎn)CFG0/CFG1這類配置引腳的檢查很容易被遺漏。一方面是因為它們看起來只是兩顆電阻功能上不像主芯片那么顯眼另一方面是工廠測試通常只測功能如果功能恰好僥幸正常就不會去驗證配置是否正確。我建議在量產(chǎn)測試工位增加一個顯式檢查項掃描I2C總線比對實際設(shè)備地址和預(yù)期地址。這比單純測試“能不能讀到攝像頭ID”更可靠因為攝像頭ID可能通過別的通路暴露而地址錯了會導(dǎo)致整個鏈路通信失敗屬于基礎(chǔ)功能的根基。治具設(shè)計上最好在測試FPC或連接器處預(yù)留測試點讓測試程序可以測量CFG0/CFG1的對GND電壓。這個測量不需要高精度只要判斷高低電平即可成本極低但能覆蓋掉電阻錯料、漏貼、貼反等問題。6.2 生產(chǎn)批次變更后的回歸驗證芯片批次變更是個容易忽視的風(fēng)險點。同一型號的GMSL芯片不同批次或不同絲印版本Strapping Pin的映射關(guān)系可能微調(diào)。雖然ADI一般不會做這種不兼容的改動但硬件升級、器件替代時還是建議主動做一次回歸驗證。做法很簡單拿新批次的芯片貼在老板子上上電掃描I2C地址和設(shè)計表比對。如果地址變了先查數(shù)據(jù)手冊的版本更新說明再確認(rèn)是否需要調(diào)整原理圖或軟件初始化序列。這個驗證一次只需要幾分鐘但能避免整批板子進(jìn)入產(chǎn)線后才發(fā)現(xiàn)地址錯誤的大事故。6.3 整車量產(chǎn)的地址分配規(guī)范如果做的是車規(guī)項目GMSL設(shè)備的I2C地址分配會納入整車電子電氣架構(gòu)的規(guī)范管理不是硬件工程師自己拍腦袋定的。我見過OEM的規(guī)范文檔里會直接指定每個攝像頭節(jié)點的地址范圍甚至精確到每個功能域。在這種項目里CFG0/CFG1的配置不能只看單板設(shè)計還要和整個系統(tǒng)的地址分配表保持一致。比如前視攝像頭和環(huán)視攝像頭雖然硬件相同但可能被分配到不同的I2C地址段這時候就是靠CFG0/CFG1的電阻接法來區(qū)分。所以在原理圖階段就要和系統(tǒng)工程師確認(rèn)地址分配方案別等板子做了再改。整車環(huán)境下還要考慮到線束長度和拓?fù)浣Y(jié)構(gòu)。地址分配除了要避免沖突還要為未來擴(kuò)展預(yù)留地址空間。我經(jīng)歷過一個項目初期只有四路攝像頭地址規(guī)劃剛好占滿后來要加一路DMS攝像頭只能重新規(guī)劃整棵I2C樹的地址工程量巨大教訓(xùn)深刻。6.4 順帶提一下POC和CFG引腳的關(guān)系最近很多人在做GMSL的POC功能也就是Power over Coax同軸電纜供電。這個功能和CFG0/CFG1沒有直接關(guān)系但我在調(diào)試POC供電時發(fā)現(xiàn)一個現(xiàn)象同軸供電的DC-DC電源紋波如果太大會通過地回路耦合到CFG引腳附近導(dǎo)致復(fù)位釋放時采樣錯誤。我遇到過一次很奇怪的問題模塊在實驗室用外部穩(wěn)壓電源供電時完全正常一上車載電池供電就偶發(fā)I2C通信超時。排查到最后發(fā)現(xiàn)是POC電源的開關(guān)頻率紋波干擾了CFG引腳電平。解決方法是給CFG引腳增加RC濾波或者在POC電源輸出端增加LC濾波。這也解釋了為什么汽車電子設(shè)計里哪怕是一顆看似簡單的上下拉電阻也要認(rèn)真處理電源完整性和地平面問題。POC功能本身的實現(xiàn)方法是在解串器端把電源通過電感饋入同軸線中心導(dǎo)體在串行器端再用電感把電源和高速數(shù)據(jù)分開。這個“電感饋電”的設(shè)計對電源紋波抑制有直接影響如果電感選得不好POC輸出紋波會很大從而影響整個鏈路的穩(wěn)定性。這塊內(nèi)容展開講又是一大篇以后單獨(dú)寫。寫在最后的幾點個人體會做GMSL項目這幾年我最大的體會是真正讓人翻車的往往不是復(fù)雜的高深技術(shù)而是像CFG0/CFG1這種看起來人人都該知道、實際上很多人都沒真正弄透的基礎(chǔ)配置。一個引腳的電平錯誤可以讓你懷疑到攝像頭傳感器、懷疑到SoC驅(qū)動、懷疑到線束接觸不良最后才發(fā)現(xiàn)只是板子上兩顆電阻焊反了。所以我特別建議在原理圖評審階段就把CFG0/CFG1的配置表做出來和軟件團(tuán)隊拉通。這個動作不復(fù)雜但能省掉后面至少兩天的聯(lián)調(diào)時間。還有一點想重復(fù)強(qiáng)調(diào)的是拿到一塊新板子時第一件事永遠(yuǎn)是量電壓、掃I2C地址用最小成本的檢查排出最大概率的問題比一上來就翻寄存器手冊高效得多。如果你正在做GMSL方案希望這篇文章能幫你少踩幾個坑。CFG0/CFG1看起來很基礎(chǔ)但基礎(chǔ)的東西往往最值得較真。