詳談:I2C設(shè)備導(dǎo)致死鎖怎么辦?
發(fā)布時(shí)間:2019-11-13 責(zé)任編輯:wenwei
【導(dǎo)讀】一般情況下, i2c 設(shè)備焊接沒什么問題,按照設(shè)備手冊(cè)一步步來(lái),基本上就順風(fēng)順?biāo)軌蛴闷饋?lái)。如果這么一個(gè)簡(jiǎn)單的東西,有時(shí)候想要的結(jié)果死活不出來(lái),反復(fù)的檢查問題的原因,查詢解決辦法,核查設(shè)備的數(shù)據(jù)手冊(cè),甚至發(fā)送和接收的每一條命令與數(shù)據(jù)都知道是什么意思,仍然無(wú)法解決問題,那該怎么辦呢?
本文主要針對(duì) i2c 設(shè)備,講解如何解決 i2c 設(shè)備主機(jī)與從機(jī)直接無(wú)法正常數(shù)據(jù)交互的問題,側(cè)重點(diǎn)是針對(duì)硬件設(shè)計(jì)不太合理、i2c 設(shè)備設(shè)計(jì)不標(biāo)準(zhǔn)導(dǎo)致總線故障的情況,并且通過(guò)分析現(xiàn)象,提出解決方案。對(duì)于在設(shè)備初始化中,沒有設(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 配置成開漏輸出,其他的按照芯片手冊(cè)進(jìn)行標(biāo)準(zhǔn)配置。
二、硬件問題匯總
2.1 無(wú)法正常拉高拉低引腳
首先確定 SDA 與SCL 引腳能夠被拉高、拉低,檢測(cè)方式直接軟件控制 I/O 口輸出引腳低電平/高電平,測(cè)量引腳電壓是否能夠隨著芯片引腳的設(shè)置輸出相應(yīng)的狀態(tài)。
如果不能被拉低,檢測(cè)虛焊、上拉電阻斷開、i2c 設(shè)備是否正常、芯片引腳是否損壞等問題,確保能夠正常被拉高或者拉低。
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è)問題通常還引起數(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í)候,爆出總線讀寫錯(cuò)誤,那么有可能遇到下面的死鎖問題,死鎖時(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ù),還沒有發(fā)送完成,主機(jī)時(shí)鐘消失,從機(jī)等待時(shí)鐘信號(hào), MCU重啟,如果從機(jī)設(shè)備的電源沒有復(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)行讀寫操作的過(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 在開始信號(hào)后發(fā)送地址,得到從機(jī)設(shè)備響應(yīng),準(zhǔn)備開始返回?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)完成了,開始給 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,沒有時(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 為了避免此類問題的產(chǎn)生,在 i2c 驅(qū)動(dòng)初始化,對(duì)總線進(jìn)行判斷,判斷是否需要解鎖,如果需要,就進(jìn)行解鎖,確保 i2c 設(shè)備不會(huì)因?yàn)檫@個(gè)問題導(dǎo)致數(shù)據(jù)交互失敗。
3.2 多個(gè) i2c 設(shè)備導(dǎo)致死鎖
多 i2c 設(shè)備除了異常復(fù)位導(dǎo)致死鎖,還會(huì)形成相互干擾的問題,一般情況下,不會(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
推薦閱讀:
特別推薦
- 兆易創(chuàng)新GD32F30x STL軟件測(cè)試庫(kù)獲得德國(guó)萊茵TüV IEC 61508功能安全認(rèn)證
- 芯科科技第三代無(wú)線開發(fā)平臺(tái)引領(lǐng)物聯(lián)網(wǎng)發(fā)展
- MSO 4B 示波器為工程師帶來(lái)更多臺(tái)式功率分析工具
- 艾為電子推出新一代高線性度GNSS低噪聲放大器——AW15745DNR
- 瑞薩發(fā)布四通道主站IC和傳感器信號(hào)調(diào)節(jié)器, 以推動(dòng)不斷增長(zhǎng)的IO-Link市場(chǎng)
- e絡(luò)盟現(xiàn)貨供應(yīng) Abracon 新推出的 AOTA 系列微型鑄型電感器
- 加賀富儀艾電子推出支持Wi-Fi 6和藍(lán)牙的無(wú)線局域網(wǎng)/藍(lán)牙組合模塊
技術(shù)文章更多>>
- 讓汽車LED照明無(wú)死角,LED驅(qū)動(dòng)的全面進(jìn)化
- 開關(guān)模式電源問題分析及其糾正措施:晶體管時(shí)序和自舉電容問題
- 熱電偶的測(cè)溫原理
- 【泰克先進(jìn)半導(dǎo)體實(shí)驗(yàn)室】 遠(yuǎn)山半導(dǎo)體發(fā)布新一代高壓氮化鎵功率器件
- ADALM2000實(shí)驗(yàn):變壓器
技術(shù)白皮書下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
電容器公式
電聲器件
電位器
電位器接法
電壓表
電壓傳感器
電壓互感器
電源變壓器
電源風(fēng)扇
電源管理
電源管理IC
電源連接器
電源濾波器
電源模塊
電源模塊
電源適配器
電子書
電阻測(cè)試儀
電阻觸控屏
電阻器
電阻作用
調(diào)速開關(guān)
調(diào)諧器
鼎智
動(dòng)力電池
動(dòng)力控制
獨(dú)石電容
端子機(jī)
斷路器
斷路器型號(hào)