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