詳談:I2C設(shè)備導(dǎo)致死鎖怎么辦?
發(fā)布時(shí)間:2019-11-13 責(zé)任編輯:wenwei
【導(dǎo)讀】一般情況下, i2c 設(shè)備焊接沒(méi)什么問(wèn)題,按照設(shè)備手冊(cè)一步步來(lái),基本上就順風(fēng)順?biāo)軌蛴闷饋?lái)。如果這么一個(gè)簡(jiǎn)單的東西,有時(shí)候想要的結(jié)果死活不出來(lái),反復(fù)的檢查問(wèn)題的原因,查詢解決辦法,核查設(shè)備的數(shù)據(jù)手冊(cè),甚至發(fā)送和接收的每一條命令與數(shù)據(jù)都知道是什么意思,仍然無(wú)法解決問(wèn)題,那該怎么辦呢?
本文主要針對(duì) i2c 設(shè)備,講解如何解決 i2c 設(shè)備主機(jī)與從機(jī)直接無(wú)法正常數(shù)據(jù)交互的問(wèn)題,側(cè)重點(diǎn)是針對(duì)硬件設(shè)計(jì)不太合理、i2c 設(shè)備設(shè)計(jì)不標(biāo)準(zhǔn)導(dǎo)致總線故障的情況,并且通過(guò)分析現(xiàn)象,提出解決方案。對(duì)于在設(shè)備初始化中,沒(méi)有設(shè)置相應(yīng)的寄存器或者發(fā)送命令,而導(dǎo)致的無(wú)法獲取想要的數(shù)據(jù)情況,不作詳細(xì)介紹。
一、i2c 基本用法
i2c 總線是一種簡(jiǎn)單、雙向二線制同步串行總線。所有主機(jī)在 SCL 線上產(chǎn)生它們自己的時(shí)鐘來(lái)傳輸總線上的報(bào)文,SDA 線傳輸每個(gè)字節(jié)必須為 8 位,每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制,每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位。在空閑狀態(tài)時(shí),SCL 與 SDA 均為高電平。
通常一些低功耗 i2c 設(shè)備,芯片引腳使用上拉輸出即可滿足與其正常數(shù)據(jù)交互,還有一些 i2c 設(shè)備,則需要在總線上外加一個(gè)上拉電阻,此時(shí)相應(yīng)的 I/O 配置成開(kāi)漏輸出,其他的按照芯片手冊(cè)進(jìn)行標(biāo)準(zhǔn)配置。
二、硬件問(wèn)題匯總
2.1 無(wú)法正常拉高拉低引腳
首先確定 SDA 與SCL 引腳能夠被拉高、拉低,檢測(cè)方式直接軟件控制 I/O 口輸出引腳低電平/高電平,測(cè)量引腳電壓是否能夠隨著芯片引腳的設(shè)置輸出相應(yīng)的狀態(tài)。
如果不能被拉低,檢測(cè)虛焊、上拉電阻斷開(kāi)、i2c 設(shè)備是否正常、芯片引腳是否損壞等問(wèn)題,確保能夠正常被拉高或者拉低。
2.2 電氣特性無(wú)法滿足
如果正常拉高、拉低的情況下,依然無(wú)法正常讀取數(shù)據(jù)。通常建議,根據(jù)負(fù)載電流更換小阻值的電阻。
如果需要詳細(xì)知道原因,就具體查詢 i2c 設(shè)備電氣特性。大多數(shù) i2c 設(shè)備電氣特性,大致下圖所示
通常這塊內(nèi)容在 i2c 設(shè)備電氣特性這一塊,主要講解電平拉高拉低的最長(zhǎng)時(shí)間、最短時(shí)間,以及處于高電平與電平的閾值與持續(xù)時(shí)間等等內(nèi)容。
硬件設(shè)計(jì),為了降低單片機(jī)的功耗與保護(hù)芯片引腳,在滿足負(fù)載電流和負(fù)載電容相關(guān)要求的前提下,阻值設(shè)置通常比較大。如果同一個(gè)總線上掛載多個(gè) i2c 設(shè)備, 即使在 I/O 口配置正確的前提下,也會(huì)導(dǎo)致驅(qū)動(dòng)能力不足。
現(xiàn)象是拉高電壓不足,在拉高、拉低過(guò)程中消耗時(shí)間過(guò)長(zhǎng)。這兩個(gè)問(wèn)題通常還引起數(shù)據(jù)線與時(shí)鐘線:拉高時(shí),高電壓持續(xù)時(shí)間過(guò)短;拉低時(shí),低電壓持續(xù)時(shí)間過(guò)短。用示波器抓取圖形:從波形上看,顯示是尖波、斜波、雜波等不符合 i2c 設(shè)備電氣特性的波形;從數(shù)據(jù)上看,數(shù)據(jù)線高電平持續(xù)時(shí)間過(guò)小 ,上升沿時(shí)間過(guò)長(zhǎng) ,下降沿時(shí)間過(guò)長(zhǎng)等等數(shù)據(jù)超出設(shè)備電氣特性的有效值。典型雜波圖,如下所示
如果出現(xiàn)此類異常,建議更換小一點(diǎn)的電阻,用來(lái)增強(qiáng)總線驅(qū)動(dòng)能力,提高電平轉(zhuǎn)換速度。應(yīng)當(dāng)注意的是每個(gè) MCU 的耐受電流不一樣,減小電阻應(yīng)避免超過(guò)相應(yīng)引腳承受電流的最大值。
3 SDA 死鎖
如果i2c 設(shè)備的數(shù)據(jù)偶爾能夠正確獲取,但是仍然會(huì)在總線發(fā)送數(shù)據(jù)或者命令的時(shí)候,爆出總線讀寫(xiě)錯(cuò)誤,那么有可能遇到下面的死鎖問(wèn)題,死鎖時(shí)候,就是數(shù)據(jù)線被拉低,主機(jī)無(wú)法拉高。死鎖一般發(fā)生在從機(jī)上,且為數(shù)據(jù)線死鎖。因?yàn)閕2c總線是共享的,如果需要確定,是否是從機(jī)死鎖,可以參照下面兩幅圖,串聯(lián)電阻進(jìn)行測(cè)試
如上圖所示,如果從機(jī)死鎖,即從機(jī)拉低電平,此時(shí)檢測(cè)到的電壓為1/3 Vcc。
如上圖所示,如果主機(jī)死鎖,即主機(jī)拉低電平,此時(shí)檢測(cè)到的電壓為 1/11 Vcc。依據(jù)這個(gè)原理,可以準(zhǔn)確判定死鎖的具體位置,多個(gè)傳感器依據(jù)類似方式進(jìn)行定位。
3.1 反復(fù)重啟導(dǎo)致死鎖
3.1.1 現(xiàn)象
如果設(shè)備需要反復(fù)重啟,很有可能在從機(jī)設(shè)備返回?cái)?shù)據(jù)的時(shí)候,SDA被鎖住。具體原因是從機(jī)設(shè)備在回?cái)?shù)據(jù),還沒(méi)有發(fā)送完成,主機(jī)時(shí)鐘消失,從機(jī)等待時(shí)鐘信號(hào), MCU重啟,如果從機(jī)設(shè)備的電源沒(méi)有復(fù)位,從機(jī)繼續(xù)等待 MCU 時(shí)鐘信號(hào),數(shù)據(jù)一直被鉗住,總線無(wú)法完成數(shù)據(jù)交互。
3.1.2 解決方式
解決重啟導(dǎo)致總線死鎖,一種方式可以如同 rt-thread 驅(qū)動(dòng)解決方式一樣,在系統(tǒng)復(fù)位的時(shí)候,提供9個(gè)時(shí)鐘信號(hào),解初總線死鎖;另一種是在按下復(fù)位鍵初始化的時(shí)候,給從機(jī)設(shè)備電源斷電重啟,這個(gè)需要引腳控制。
3.1.3 9 個(gè)時(shí)鐘信號(hào)
i2c 設(shè)備進(jìn)行讀寫(xiě)操作的過(guò)程中,在從機(jī)鉗住總線的期間,MCU 異常復(fù)位,會(huì)導(dǎo)致 SDA 死鎖,異常產(chǎn)生出現(xiàn)在倆個(gè)階段:從機(jī)響應(yīng)階段、從機(jī)發(fā)送數(shù)據(jù)階段。下面將針對(duì)這兩種異常,對(duì)時(shí)鐘信號(hào)進(jìn)行解釋,并且總結(jié)其他原因,得出結(jié)論。
(a) 從機(jī)響應(yīng)階段
MCU 在開(kāi)始信號(hào)后發(fā)送地址,得到從機(jī)設(shè)備響應(yīng),準(zhǔn)備開(kāi)始返回?cái)?shù)據(jù),在這個(gè)時(shí)候,從機(jī)將 SDA 信號(hào)拉為低電平,如果 MCU 異常復(fù)位,會(huì)導(dǎo)致總線上 SCL 停止發(fā)送時(shí)鐘信號(hào),從機(jī)等待 MCU 的時(shí)鐘信號(hào),產(chǎn)生鉗住并且拉低 SDA 的現(xiàn)象。如果想要解鎖 SDA,從機(jī)需要 9 個(gè)時(shí)鐘信號(hào),使得從機(jī)完成響應(yīng),釋放 SDA 。
(b) 從機(jī)發(fā)送數(shù)據(jù)階段
如果從機(jī)響應(yīng)完成了,開(kāi)始給 MCU 返回?cái)?shù)據(jù)。這個(gè)數(shù)據(jù)有八位,每一位都有可能為低,如果在數(shù)據(jù)低位,MCU 異常復(fù)位,停止發(fā)送時(shí)鐘信號(hào),從機(jī)就會(huì)等待 MCU 的時(shí)鐘信號(hào),產(chǎn)生鉗住并且拉低 SDA 的現(xiàn)象。如果想要解鎖 SDA,從機(jī)需要 1-8 個(gè)時(shí)鐘信號(hào),使得從機(jī)完成數(shù)據(jù)響應(yīng),釋放 SDA 。
(c)其他情況
在從機(jī)一個(gè) 8 位數(shù)據(jù)發(fā)送完成后,等待 MCU 響應(yīng), 即使屬于 MCU 的,從機(jī)不再鉗住 SDA,沒(méi)有時(shí)鐘,數(shù)據(jù)交互停止。
在主機(jī)發(fā)送數(shù)據(jù)階段,總線所有權(quán)在主機(jī),主機(jī)異常,數(shù)據(jù)交互停止,總線釋放。所以,這些情況下,不存在 SDA 死鎖的情況。
(d)結(jié)論
綜上所述,解鎖 SDA 從機(jī)最多需要 9 個(gè)時(shí)鐘信號(hào),也就是異常復(fù)位后,MCU 至少發(fā)送需要 9 個(gè)時(shí)鐘信號(hào),完成 i2c 總線的 SDA 解鎖。所以,RT_Thread 為了避免此類問(wèn)題的產(chǎn)生,在 i2c 驅(qū)動(dòng)初始化,對(duì)總線進(jìn)行判斷,判斷是否需要解鎖,如果需要,就進(jìn)行解鎖,確保 i2c 設(shè)備不會(huì)因?yàn)檫@個(gè)問(wèn)題導(dǎo)致數(shù)據(jù)交互失敗。
3.2 多個(gè) i2c 設(shè)備導(dǎo)致死鎖
多 i2c 設(shè)備除了異常復(fù)位導(dǎo)致死鎖,還會(huì)形成相互干擾的問(wèn)題,一般情況下,不會(huì)把同種從機(jī)地址掛在同一條總線上,但除此之外,有些 i2c 設(shè)備設(shè)計(jì)不是按照標(biāo)準(zhǔn)的 i2c 總線協(xié)議設(shè)計(jì),在 i2c 總線共享的前提條件下,有的設(shè)備只要總線上從機(jī)地址就會(huì)有響應(yīng)。這樣由于從機(jī)的錯(cuò)誤響應(yīng),使得各個(gè) i2c 總線異常,甚至鉗住總線,導(dǎo)致 I2C 總線進(jìn)人一種死鎖狀態(tài)。
解決方式,這樣的不標(biāo)準(zhǔn)i2c設(shè)備,單獨(dú)使用一個(gè)總線,避免干擾,或者單獨(dú)一個(gè)獨(dú)立引腳,控制電源。
來(lái)源:RT-Thread
推薦閱讀:
特別推薦
- 協(xié)同創(chuàng)新,助汽車(chē)行業(yè)邁向電氣化、自動(dòng)化和互聯(lián)化的未來(lái)
- 功率器件熱設(shè)計(jì)基礎(chǔ)(八)——利用瞬態(tài)熱阻計(jì)算二極管浪涌電流
- 用于模擬傳感器的回路供電(兩線)發(fā)射器
- 應(yīng)用于體外除顫器中的電容器
- 將“微型FPGA”集成到8位MCU,是種什么樣的體驗(yàn)?
- 能源、清潔科技和可持續(xù)發(fā)展的未來(lái)
- 博瑞集信推出高增益、內(nèi)匹配、單電源供電 | S、C波段驅(qū)動(dòng)放大器系列
技術(shù)文章更多>>
- 探索工業(yè)應(yīng)用中邊緣連接的未來(lái)
- 解構(gòu)數(shù)字化轉(zhuǎn)型:從策略到執(zhí)行的全面思考
- 意法半導(dǎo)體基金會(huì):通過(guò)數(shù)字統(tǒng)一計(jì)劃彌合數(shù)字鴻溝
- 使用手持頻譜儀搭配高級(jí)軟件:精準(zhǔn)捕獲隱匿射頻信號(hào)
- 為什么超大規(guī)模數(shù)據(jù)中心要選用SiC MOSFET?
技術(shù)白皮書(shū)下載更多>>
- 車(chē)規(guī)與基于V2X的車(chē)輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車(chē)安全隔離的新挑戰(zhàn)
- 汽車(chē)模塊拋負(fù)載的解決方案
- 車(chē)用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門(mén)搜索
分頻器
風(fēng)力渦輪機(jī)
風(fēng)能
風(fēng)扇
風(fēng)速風(fēng)向儀
風(fēng)揚(yáng)高科
輔助駕駛系統(tǒng)
輔助設(shè)備
負(fù)荷開(kāi)關(guān)
復(fù)用器
伽利略定位
干電池
干簧繼電器
感應(yīng)開(kāi)關(guān)
高頻電感
高通
高通濾波器
隔離變壓器
隔離開(kāi)關(guān)
個(gè)人保健
工業(yè)電子
工業(yè)控制
工業(yè)連接器
工字型電感
功率表
功率電感
功率電阻
功率放大器
功率管
功率繼電器