I2C設(shè)備主機(jī)與從機(jī)直接數(shù)據(jù)交互
出處:面包板 發(fā)布于:2020-02-11 11:21:01
本文主要針對(duì) i2c 設(shè)備,講解如何解決 i2c 設(shè)備主機(jī)與從機(jī)直接無法正常數(shù)據(jù)交互的問題,側(cè)重點(diǎn)是針對(duì)硬件設(shè)計(jì)不太合理、i2c 設(shè)備設(shè)計(jì)不標(biāo)準(zhǔn)導(dǎo)致總線故障的情況,并且通過分析現(xiàn)象,提出解決方案。對(duì)于在設(shè)備初始化中,沒有設(shè)置相應(yīng)的寄存器或者發(fā)送命令,而導(dǎo)致的無法獲取想要的數(shù)據(jù)情況,不作詳細(xì)介紹。
1 i2c 基本用法
i2c 總線是一種簡單、雙向二線制同步串行總線。所有主機(jī)在 SCL 線上產(chǎn)生它們自己的時(shí)鐘來傳輸總線上的報(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 硬件問題匯總
2.1 無法正常拉高拉低引腳
首先確定 SDA 與SCL 引腳能夠被拉高、拉低,檢測(cè)方式直接軟件控制 I/O 口輸出引腳低電平/高電平,測(cè)量引腳電壓是否能夠隨著芯片引腳的設(shè)置輸出相應(yīng)的狀態(tài)。
如果不能被拉低,檢測(cè)虛焊、上拉電阻斷開、i2c 設(shè)備是否正常、芯片引腳是否損壞等問題,確保能夠正常被拉高或者拉低。
2.2 電氣特性無法滿足
如果正常拉高、拉低的情況下,依然無法正常讀取數(shù)據(jù)。通常建議,根據(jù)負(fù)載電流更換小阻值的電阻。
如果需要詳細(xì)知道原因,就具體查詢 i2c 設(shè)備電氣特性。大多數(shù) i2c 設(shè)備電氣特性,大致下圖所示
硬件設(shè)計(jì),為了降低單片機(jī)的功耗與保護(hù)芯片引腳,在滿足負(fù)載電流和負(fù)載電容相關(guān)要求的前提下,阻值設(shè)置通常比較大。如果同一個(gè)總線上掛載多個(gè) i2c 設(shè)備, 即使在 I/O 口配置正確的前提下,也會(huì)導(dǎo)致驅(qū)動(dòng)能力不足。
現(xiàn)象是拉高電壓不足,在拉高、拉低過程中消耗時(shí)間過長。這兩個(gè)問題通常還引起數(shù)據(jù)線與時(shí)鐘線:拉高時(shí),高電壓持續(xù)時(shí)間過短;拉低時(shí),低電壓持續(xù)時(shí)間過短。用示波器抓取圖形:從波形上看,顯示是尖波、斜波、雜波等不符合 i2c 設(shè)備電氣特性的波形;從數(shù)據(jù)上看,數(shù)據(jù)線高電平持續(xù)時(shí)間過小 ,上升沿時(shí)間過長 ,下降沿時(shí)間過長等等數(shù)據(jù)超出設(shè)備電氣特性的有效值。典型雜波圖,如下所示
3 SDA 死鎖
如果i2c 設(shè)備的數(shù)據(jù)偶爾能夠正確獲取,但是仍然會(huì)在總線發(fā)送數(shù)據(jù)或者命令的時(shí)候,爆出總線讀寫錯(cuò)誤,那么有可能遇到下面的死鎖問題,死鎖時(shí)候,就是數(shù)據(jù)線被拉低,主機(jī)無法拉高。死鎖一般發(fā)生在從機(jī)上,且為數(shù)據(jù)線死鎖。因?yàn)閕2c總線是共享的,如果需要確定,是否是從機(jī)死鎖,可以參照下面兩幅圖,串聯(lián)電阻進(jìn)行測(cè)試
如上圖所示,如果從機(jī)死鎖,即從機(jī)拉低電平,此時(shí)檢測(cè)到的電壓為1/3 Vcc。
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ù)一直被鉗住,總線無法完成數(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)行讀寫操作的過程中,在從機(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ú)立引腳,控制電源。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫電子市場(chǎng)網(wǎng),http://udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識(shí)介紹2025/8/29 16:58:56
- SQL核心知識(shí)點(diǎn)總結(jié)2025/8/11 16:51:36
- 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
- 基于PID控制和重復(fù)控制的復(fù)合控制策略2025/7/29 16:58:24
- 什么是樹莓派?一文快速了解樹莓派基礎(chǔ)知識(shí)2025/6/18 16:30:52
- 交交型變頻器和交直交型變頻器的區(qū)別
- 800G DR8 與其他 800G 光模塊的對(duì)比分析
- UPS電源中電流電壓傳感器的應(yīng)用
- 51單片機(jī)電平特性是什么
- AC/DC 與 DC/DC 轉(zhuǎn)換器的工作原理與應(yīng)用
- PCB板層設(shè)計(jì)與電磁兼容性的關(guān)系解析
- 接觸器式繼電器怎么區(qū)分 如何測(cè)量好壞
- 車規(guī)級(jí)MCU介紹及應(yīng)用場(chǎng)景
- 電容選型時(shí)如何選擇產(chǎn)品的電壓
- 線性穩(wěn)壓電源與開關(guān)穩(wěn)壓電源:原理、特性及應(yīng)用