試全攻略:從萬(wàn)用表到示波器,徹底解決ACK丟失問題)
1. 從一根“不聽話”的I2C總線說起調(diào)試嵌入式系統(tǒng)時(shí)最讓人頭疼的場(chǎng)景之一莫過于代碼邏輯看起來天衣無縫但傳感器就是沒反應(yīng)。你翻遍數(shù)據(jù)手冊(cè)時(shí)序參數(shù)算了又算上拉電阻也按推薦值焊了可SDA和SCL兩條線就像商量好了一樣紋絲不動(dòng)。這時(shí)候光靠盯著代碼是看不出任何名堂的必須把目光從屏幕移到物理層用工具去“看”信號(hào)到底長(zhǎng)什么樣。I2C總線的排查本質(zhì)上是一場(chǎng)從宏觀到微觀、從靜態(tài)到動(dòng)態(tài)的偵查過程。萬(wàn)用表能告訴你電壓對(duì)不對(duì)、線通不通但它看不到波形示波器能讓你看清每一個(gè)電平跳變和時(shí)序細(xì)節(jié)但前提是你得知道該抓什么、怎么看而ACK響應(yīng)則是整個(gè)通信是否成功的“臨門一腳”很多問題最終都卡在這個(gè)第9個(gè)時(shí)鐘周期上。這篇文章我就結(jié)合自己這些年調(diào)試各類I2C器件從EEPROM到觸摸屏GT911再到OLED驅(qū)動(dòng)SSD1306的經(jīng)歷把從萬(wàn)用表粗查到示波器精測(cè)再到ACK定位的完整排查鏈路拆解一遍。無論你是剛接觸I2C的新手還是被某個(gè)詭異問題卡住的老手這套流程都能直接拿去用。2. 萬(wàn)用表能告訴你什么不能告訴你什么2.1 靜態(tài)電壓測(cè)量排查硬件連接的第一步在拿起示波器之前萬(wàn)用表是最快、最直接的排障工具。很多人一遇到I2C不通就急著上示波器結(jié)果折騰半天才發(fā)現(xiàn)是供電沒上去或者上拉電阻虛焊了。用萬(wàn)用表做靜態(tài)檢查核心就三件事供電電壓、上拉電壓、線路通斷。先測(cè)從機(jī)器件的VCC引腳。比如一個(gè)標(biāo)稱3.3V的傳感器實(shí)際測(cè)出來只有2.1V那后面所有通信失敗都是理所當(dāng)然的。這時(shí)候要順著電源路徑往回查是LDO輸出不對(duì)還是走線壓降太大又或者是器件本身進(jìn)入了某種低功耗模式把電壓拉低了。我遇到過一塊板子3.3V軌上掛了個(gè)大電容上電瞬間浪涌導(dǎo)致LDO限流電壓緩慢爬升MCU早就初始化完I2C開始發(fā)START了從機(jī)還沒上電自然沒ACK。這種問題用示波器看電源紋波能發(fā)現(xiàn)但用萬(wàn)用表測(cè)穩(wěn)態(tài)電壓是看不出來的所以靜態(tài)測(cè)量只是第一道關(guān)。接著測(cè)SDA和SCL對(duì)地的電壓。在總線空閑時(shí)如果上拉電阻正常兩條線都應(yīng)該是高電平接近VCC。如果測(cè)出來是0V那可能是線被拉死了——某個(gè)器件把總線鉗在低電平或者上拉電阻根本沒焊。如果測(cè)出來是1.5V這種不上不下的值那可能是兩個(gè)器件同時(shí)驅(qū)動(dòng)總線一個(gè)拉高一個(gè)拉低形成了“總線爭(zhēng)用”。這時(shí)候要斷開從機(jī)只留MCU看電壓是否恢復(fù)。如果恢復(fù)了說明是從機(jī)的問題如果還是老樣子那MCU的GPIO配置可能有問題比如開漏輸出沒配好或者內(nèi)部上拉和外部上拉沖突了。注意用萬(wàn)用表測(cè)I2C線電壓時(shí)一定要在總線空閑狀態(tài)下測(cè)。如果MCU正在瘋狂發(fā)數(shù)據(jù)萬(wàn)用表的采樣率根本跟不上讀出來的數(shù)值沒有參考意義。2.2 通斷與電阻測(cè)量找出那些“看不見”的斷點(diǎn)I2C走線通常不長(zhǎng)但在多層板或者軟排線連接的場(chǎng)景下虛焊、斷線、過孔不良都是常見問題。用萬(wàn)用表的蜂鳴檔測(cè)SDA和SCL從MCU引腳到從機(jī)引腳的連通性是最笨但最有效的方法。我習(xí)慣把萬(wàn)用表調(diào)到電阻檔測(cè)MCU端到從機(jī)端的電阻正常應(yīng)該是接近0歐姆。如果測(cè)出來幾百歐姆甚至開路那中間肯定有斷點(diǎn)。還有一個(gè)容易被忽略的地方上拉電阻的阻值。很多人直接照搬4.7kΩ但在3.3V系統(tǒng)下4.7kΩ的上拉電流只有0.7mA左右對(duì)于長(zhǎng)走線或者多從機(jī)的場(chǎng)景上升沿會(huì)變得很緩。用萬(wàn)用表測(cè)上拉電阻的實(shí)際阻值確認(rèn)沒有焊錯(cuò)比如把4.7kΩ焊成了47kΩ。如果阻值正常但上升沿還是慢那就要考慮減小阻值比如換成2.2kΩ甚至1kΩ但要注意總線電容和功耗的平衡。另外有些板子在SDA或SCL上串聯(lián)了小電阻比如22Ω或33Ω用于阻抗匹配或限流。這些電阻如果虛焊或者阻值變大也會(huì)導(dǎo)致通信失敗。用萬(wàn)用表測(cè)這些串聯(lián)電阻兩端的通斷確保沒有異常。2.3 萬(wàn)用表的局限為什么最終還得靠示波器萬(wàn)用表能測(cè)電壓、電阻、通斷但它測(cè)不了波形。I2C通信是動(dòng)態(tài)的START條件、地址幀、數(shù)據(jù)幀、ACK/NACK每一個(gè)環(huán)節(jié)都對(duì)應(yīng)著特定的電平跳變和時(shí)序關(guān)系。萬(wàn)用表只能告訴你“現(xiàn)在這條線是高還是低”但無法告訴你“這個(gè)高電平持續(xù)了多久”“上升沿有多陡”“第9個(gè)時(shí)鐘周期時(shí)SDA是什么狀態(tài)”。舉個(gè)例子假設(shè)從機(jī)因?yàn)槟撤N原因把SDA線拉低了一段時(shí)間又釋放了萬(wàn)用表測(cè)的時(shí)候剛好是釋放后的高電平你就會(huì)誤以為總線正常。但實(shí)際上那個(gè)短暫的拉低可能已經(jīng)干擾了通信。再比如時(shí)鐘頻率是100kHz還是400kHz萬(wàn)用表根本測(cè)不出來。所以萬(wàn)用表是“粗篩”示波器才是“精查”。3. 示波器抓I2C波形的正確姿勢(shì)3.1 探頭選擇與接地別讓測(cè)量本身成為干擾源用示波器測(cè)I2C第一個(gè)坑往往出在探頭上。很多人隨手拿一個(gè)10:1的無源探頭地線夾子隨便夾在板子某個(gè)GND上結(jié)果抓出來的波形全是振鈴和毛刺。I2C的信號(hào)頻率雖然不高標(biāo)準(zhǔn)模式100kHz快速模式400kHz高速模式3.4MHz但邊沿速率可能很快尤其是上升沿如果探頭接地回路太長(zhǎng)引入的寄生電感會(huì)讓波形嚴(yán)重失真。正確的做法是使用短接地彈簧而不是長(zhǎng)地線夾子。如果板子上有專門的GND測(cè)試點(diǎn)盡量把接地彈簧直接頂上去。如果沒有可以在被測(cè)器件附近找一個(gè)最近的GND過孔或電容焊盤。探頭本身建議用10:1的無源探頭帶寬至少100MHz這樣對(duì)于400kHz的I2C信號(hào)邊沿細(xì)節(jié)能看得比較清楚。如果手頭有有源差分探頭那更好但一般調(diào)試用不上。通道分配上我習(xí)慣用CH1測(cè)SCLCH2測(cè)SDACH3測(cè)從機(jī)的VCC或者一個(gè)GPIO中斷腳這樣能同時(shí)看到電源和信號(hào)的關(guān)系。觸發(fā)方式設(shè)為SCL的上升沿觸發(fā)觸發(fā)電平設(shè)在VCC的一半左右。如果信號(hào)是3.3V觸發(fā)電平就設(shè)1.65V。時(shí)基先設(shè)成100μs/div左右這樣一屏能看幾個(gè)完整的字節(jié)傳輸。提示如果示波器有“峰值檢測(cè)”或“高分辨率”模式建議打開。I2C的毛刺和窄脈沖用普通采樣模式可能會(huì)漏掉。3.2 識(shí)別START、地址和ACK從波形讀出通信內(nèi)容抓到波形后第一件事是找START條件。I2C協(xié)議規(guī)定START條件是SCL為高電平時(shí)SDA從高變低。在示波器上你會(huì)看到SCL保持高電平SDA突然往下掉。這個(gè)跳變就是通信的起點(diǎn)。緊接著SCL開始周期性跳動(dòng)SDA在每個(gè)SCL低電平期間變化在高電平期間保持穩(wěn)定——這就是數(shù)據(jù)位的傳輸。第一個(gè)字節(jié)是地址幀7位地址加1位讀寫位。比如一個(gè)AT24C02 EEPROM的寫地址是0xA0二進(jìn)制10100000讀地址是0xA1。在示波器上你可以數(shù)SCL的脈沖個(gè)數(shù)第1個(gè)脈沖對(duì)應(yīng)地址的最高位MSB第8個(gè)脈沖對(duì)應(yīng)讀寫位第9個(gè)脈沖就是ACK位。如果從機(jī)正確接收了地址它會(huì)在第9個(gè)SCL高電平期間把SDA拉低這就是ACK。如果SDA保持高電平那就是NACK。用示波器看ACK關(guān)鍵是要把時(shí)基放大到能看清第9個(gè)脈沖。我通常會(huì)把觸發(fā)點(diǎn)設(shè)在地址幀的第8個(gè)SCL下降沿然后單次觸發(fā)這樣能穩(wěn)定抓到ACK位。如果示波器有I2C解碼功能直接打開協(xié)議解碼屏幕上會(huì)直接顯示“Address: 0xA0, R/W: W, ACK”這樣的信息省去手動(dòng)數(shù)脈沖的麻煩。但即使有解碼也建議對(duì)照原始波形看一遍因?yàn)榻獯a器有時(shí)會(huì)把毛刺誤判成數(shù)據(jù)。3.3 上升沿與下降沿判斷上拉電阻和總線電容是否合適I2C總線的上升沿是由上拉電阻和總線電容決定的RC充電過程。如果上升沿太緩在SCL高電平期間SDA還沒達(dá)到有效的邏輯高電平閾值從機(jī)就可能誤判數(shù)據(jù)。用示波器測(cè)量上升時(shí)間從0.3VCC到0.7VCC標(biāo)準(zhǔn)模式要求小于1000ns快速模式要求小于300ns。如果實(shí)測(cè)上升時(shí)間遠(yuǎn)大于這個(gè)值說明上拉電阻太大或者總線電容太大??偩€電容包括PCB走線電容、器件引腳電容和探頭電容。探頭本身就有10pF左右的電容如果用了長(zhǎng)地線還會(huì)增加。這時(shí)候可以嘗試減小上拉電阻比如從4.7kΩ換成2.2kΩ再測(cè)上升時(shí)間。但要注意上拉電阻太小會(huì)導(dǎo)致低電平時(shí)的灌電流增大有些器件的驅(qū)動(dòng)能力有限可能拉不到足夠低的電平VOL。所以這是一個(gè)權(quán)衡過程。下降沿通常由器件的開漏輸出驅(qū)動(dòng)速度很快一般不用擔(dān)心。但如果下降沿出現(xiàn)明顯的振鈴那可能是走線阻抗不匹配需要在靠近器件端串聯(lián)小電阻比如22Ω來阻尼。4. ACK丟失的排查鏈路從波形到根因4.1 ACK的電氣本質(zhì)第9個(gè)時(shí)鐘周期發(fā)生了什么ACK是I2C通信中最關(guān)鍵的握手信號(hào)。當(dāng)主機(jī)發(fā)送完8位數(shù)據(jù)地址或數(shù)據(jù)后會(huì)在第9個(gè)SCL周期釋放SDA線讓它被上拉電阻拉高然后從機(jī)如果正確接收就會(huì)在這個(gè)周期把SDA拉低。主機(jī)在SCL高電平期間讀取SDA如果為低就是ACK如果為高就是NACK。從電氣角度看ACK丟失意味著在第9個(gè)SCL高電平期間SDA沒有被從機(jī)拉低。可能的原因有很多從機(jī)沒收到正確的地址、從機(jī)忙沒準(zhǔn)備好、從機(jī)損壞、上拉電阻太強(qiáng)導(dǎo)致從機(jī)拉不低、或者SDA線被其他器件干擾。用示波器抓ACK時(shí)要把時(shí)基調(diào)到能看清第9個(gè)脈沖的寬度同時(shí)觀察SDA在SCL高電平期間的電平。如果SDA有輕微下拉但沒到VOL閾值那可能是從機(jī)的驅(qū)動(dòng)能力不足或者上拉電阻太小。我遇到過一種情況從機(jī)是1.8V供電而MCU是3.3V上拉電阻接到3.3V。從機(jī)在ACK時(shí)試圖把SDA拉低但它的IO耐壓只有1.8V內(nèi)部ESD二極管導(dǎo)通導(dǎo)致SDA被鉗在2.0V左右MCU讀到的還是高電平于是判定NACK。這種問題用萬(wàn)用表測(cè)不出來只有示波器能看到SDA在ACK期間有個(gè)“半高”的電平。解決辦法是用電平轉(zhuǎn)換芯片或者把上拉電阻接到1.8V。4.2 地址不匹配為什么從機(jī)“裝聾作啞”如果示波器顯示主機(jī)發(fā)了地址幀但第9個(gè)周期SDA始終為高那第一個(gè)要懷疑的就是地址不對(duì)。I2C從機(jī)的地址通常由固定部分和可編程部分組成比如AT24C02的地址是1010xxx其中xxx由A2/A1/A0引腳決定。如果這些引腳懸空或者接錯(cuò)地址就會(huì)偏移。排查方法很簡(jiǎn)單用示波器解碼出主機(jī)發(fā)送的地址然后對(duì)照從機(jī)數(shù)據(jù)手冊(cè)的地址表。如果地址不對(duì)檢查從機(jī)的地址引腳配置。有些器件的地址引腳內(nèi)部有弱上拉或弱下拉懸空時(shí)電平不確定必須外部明確拉高或拉低。另外有些器件在復(fù)位后會(huì)進(jìn)入一個(gè)默認(rèn)地址需要先發(fā)送特定命令才能切換到用戶地址這種“隱藏”行為在數(shù)據(jù)手冊(cè)里往往寫得很小容易忽略。還有一種情況是地址沖突總線上掛了兩個(gè)相同地址的器件它們會(huì)同時(shí)響應(yīng)ACK導(dǎo)致SDA上的電平被兩個(gè)器件同時(shí)驅(qū)動(dòng)可能出現(xiàn)爭(zhēng)用。這時(shí)候用示波器看ACK期間的電平可能會(huì)看到異常的低電平或者振蕩。解決辦法是給其中一個(gè)器件改地址或者用I2C多路復(fù)用器如TCA9548A來隔離。4.3 從機(jī)忙與時(shí)鐘拉伸被忽略的等待狀態(tài)I2C協(xié)議允許從機(jī)通過拉低SCL來強(qiáng)制主機(jī)等待這叫“時(shí)鐘拉伸”Clock Stretching。很多MCU的硬件I2C控制器支持時(shí)鐘拉伸但有些軟件模擬的I2C可能不支持或者配置不對(duì)。如果從機(jī)在ACK階段拉低SCL主機(jī)如果沒等SCL釋放就繼續(xù)發(fā)時(shí)鐘通信就會(huì)錯(cuò)亂。用示波器看SCL波形如果發(fā)現(xiàn)某個(gè)SCL高電平周期被異常拉長(zhǎng)那就是從機(jī)在做時(shí)鐘拉伸。這時(shí)候要檢查主機(jī)的I2C控制器是否使能了時(shí)鐘拉伸支持。有些MCU的I2C外設(shè)默認(rèn)關(guān)閉時(shí)鐘拉伸需要手動(dòng)配置寄存器。如果主機(jī)不支持那就只能降低通信速率或者換用支持時(shí)鐘拉伸的硬件I2C。另外有些從機(jī)在上電后需要一段初始化時(shí)間比如EEPROM的寫周期是5ms在這段時(shí)間內(nèi)它不會(huì)響應(yīng)任何通信。如果主機(jī)在從機(jī)忙的時(shí)候發(fā)地址從機(jī)會(huì)返回NACK。解決辦法是在發(fā)地址前加延時(shí)或者用“ACK輪詢”機(jī)制反復(fù)發(fā)地址直到收到ACK再發(fā)數(shù)據(jù)。5. 那些年我踩過的I2C排查坑5.1 上拉電阻焊錯(cuò)位置一個(gè)讓波形“完美”卻不通的案例有一次調(diào)試一個(gè)OLED屏SSD1306波形看起來非常漂亮START、地址、數(shù)據(jù)、ACK全都有但屏幕就是不亮。用示波器反復(fù)看發(fā)現(xiàn)ACK確實(shí)存在說明從機(jī)收到了數(shù)據(jù)。但為什么沒顯示后來查原理圖才發(fā)現(xiàn)上拉電阻焊在了MCU端而OLED是通過一根20cm的排線連接的。排線的寄生電容加上OLED的引腳電容導(dǎo)致SDA和SCL的上升沿在OLED端已經(jīng)嚴(yán)重變形雖然MCU端看著還行但OLED端已經(jīng)無法正確識(shí)別了。解決辦法是把上拉電阻移到OLED端或者兩端都加上拉。這個(gè)案例告訴我上拉電阻的位置和走線長(zhǎng)度對(duì)I2C通信的影響遠(yuǎn)比數(shù)據(jù)手冊(cè)上的典型電路要復(fù)雜。尤其是當(dāng)總線長(zhǎng)度超過10cm時(shí)一定要考慮傳輸線效應(yīng)和分布電容。5.2 邏輯分析儀的“隱形”干擾邏輯分析儀是抓I2C協(xié)議的好工具但它的輸入電容和閾值電壓可能會(huì)影響總線。有一次我用某款邏輯分析儀抓I2C發(fā)現(xiàn)ACK時(shí)有時(shí)無但拔掉分析儀就正常了。后來查資料才知道那款分析儀的輸入電容高達(dá)20pF加上排線直接把總線的上升時(shí)間拉長(zhǎng)了一倍導(dǎo)致從機(jī)在SCL高電平期間還沒把SDA拉低主機(jī)就采樣了。所以用邏輯分析儀時(shí)盡量用短的排線或者選擇輸入電容小的型號(hào)。如果條件允許優(yōu)先用示波器看模擬波形邏輯分析儀只作為協(xié)議解碼的輔助。5.3 電源噪聲導(dǎo)致的“隨機(jī)”NACK有一個(gè)項(xiàng)目I2C通信在實(shí)驗(yàn)室里一切正常到了現(xiàn)場(chǎng)就偶爾出現(xiàn)NACK。用示波器抓了很久終于抓到一次異常在ACK期間SDA上疊加了一個(gè)幾十毫伏的尖峰噪聲導(dǎo)致主機(jī)誤判為高電平。順著噪聲往回查發(fā)現(xiàn)是附近的一個(gè)DC-DC轉(zhuǎn)換器在開關(guān)時(shí)通過地線耦合過來的。解決辦法是在I2C線附近加RC濾波比如100Ω串聯(lián)加100pF對(duì)地或者改善地平面設(shè)計(jì)。但要注意RC濾波會(huì)進(jìn)一步減緩上升沿所以電阻和電容的值要仔細(xì)選。我最后用了33Ω加47pF既濾掉了高頻噪聲又沒有明顯影響上升時(shí)間。6. 從波形到代碼軟硬件聯(lián)合排查的閉環(huán)6.1 用GPIO模擬I2C時(shí)的時(shí)序陷阱很多項(xiàng)目為了靈活會(huì)用GPIO模擬I2C。這時(shí)候時(shí)序完全由軟件控制很容易出現(xiàn)“差不多就行”的心態(tài)。比如SCL高電平持續(xù)時(shí)間不夠或者SDA在SCL高電平期間變化了。用示波器抓這種軟件I2C的波形經(jīng)常能看到SCL的占空比不是50%或者START條件的建立時(shí)間不夠。我的經(jīng)驗(yàn)是軟件I2C的延時(shí)函數(shù)一定要用示波器校準(zhǔn)。比如你寫了一個(gè)delay_us(5)實(shí)際可能因?yàn)榫幾g優(yōu)化或中斷干擾變成了3μs或8μs。用示波器測(cè)SCL的實(shí)際頻率然后調(diào)整延時(shí)參數(shù)直到波形符合數(shù)據(jù)手冊(cè)的要求。另外在發(fā)START和STOP條件時(shí)要確保SDA的變化發(fā)生在SCL高電平期間并且有足夠的建立時(shí)間和保持時(shí)間。6.2 硬件I2C的寄存器配置檢查清單硬件I2C雖然省心但寄存器配置不對(duì)也會(huì)導(dǎo)致各種奇怪問題。以下是我總結(jié)的檢查清單檢查項(xiàng)常見問題排查方法時(shí)鐘頻率分頻系數(shù)算錯(cuò)實(shí)際頻率遠(yuǎn)高于預(yù)期用示波器測(cè)SCL頻率時(shí)鐘拉伸未使能從機(jī)拉低SCL時(shí)主機(jī)不等待查寄存器手冊(cè)使能時(shí)鐘拉伸地址模式7位地址和10位地址混淆確認(rèn)從機(jī)地址位數(shù)配置對(duì)應(yīng)模式ACK使能主機(jī)接收數(shù)據(jù)時(shí)未使能ACK檢查控制寄存器的ACK位引腳復(fù)用GPIO未正確配置為I2C功能查引腳復(fù)用表確認(rèn)AF配置上拉配置內(nèi)部上拉和外部上拉沖突關(guān)閉內(nèi)部上拉只用外部上拉這張表里的每一項(xiàng)我都至少踩過一次坑。尤其是時(shí)鐘拉伸和地址模式數(shù)據(jù)手冊(cè)里往往一筆帶過但實(shí)際調(diào)試時(shí)能卡你半天。6.3 用示波器觸發(fā)功能捕捉偶發(fā)故障偶發(fā)故障是最難查的因?yàn)榭赡軒讉€(gè)小時(shí)才出現(xiàn)一次。這時(shí)候示波器的觸發(fā)功能就派上用場(chǎng)了??梢栽O(shè)置“脈寬觸發(fā)”或“欠幅脈沖觸發(fā)”當(dāng)SDA或SCL上出現(xiàn)異常窄脈沖或電平不達(dá)標(biāo)時(shí)示波器自動(dòng)凍結(jié)波形。比如設(shè)置觸發(fā)條件為“SDA在SCL高電平期間出現(xiàn)下降沿”這能抓到非法的數(shù)據(jù)變化。如果示波器支持串行觸發(fā)可以直接設(shè)置I2C觸發(fā)條件為“NACK”或“地址不匹配”。這樣一旦出現(xiàn)NACK示波器就停下來你就能看到NACK前后的完整波形。我靠這個(gè)功能抓到過一個(gè)從機(jī)在特定溫度下才出現(xiàn)的ACK丟失問題后來發(fā)現(xiàn)是那個(gè)批次的芯片在低溫下驅(qū)動(dòng)能力下降換批次后解決。7. 寫在最后一些零散但實(shí)用的經(jīng)驗(yàn)調(diào)試I2C這么多年我最大的體會(huì)是不要假設(shè)任何東西是“顯然正確”的。上拉電阻焊了不代表焊對(duì)了地址配了不代表配準(zhǔn)了波形看著有ACK不代表從機(jī)真的處理了數(shù)據(jù)。每一步都要用工具去驗(yàn)證從萬(wàn)用表的靜態(tài)電壓到示波器的動(dòng)態(tài)波形再到邏輯分析儀的協(xié)議解碼層層遞進(jìn)。另外I2C的排查流程不是線性的很多時(shí)候需要來回跳轉(zhuǎn)。比如示波器看到ACK丟失你可能要回到萬(wàn)用表去測(cè)電壓或者回到代碼去查地址。保持耐心把每一次異常都當(dāng)成線索而不是障礙。最后分享一個(gè)小技巧如果手頭沒有示波器可以用一個(gè)簡(jiǎn)單的LED加電阻來判斷SDA和SCL是否有活動(dòng)。把LED接在SCL和GND之間串一個(gè)1kΩ電阻如果通信正常LED會(huì)微微閃爍。雖然看不到波形但至少能確認(rèn)總線不是死的。當(dāng)然這只是應(yīng)急手段真要定位問題還是得靠示波器。