這篇文章給大家分享的是有關I2C死鎖怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
當單片機正在和I2C從機通信,如果主正好發生打算發第9個時鐘,此時SCL為高,而從開始拉低SDA為低做準備(作為ACK信號),等待主SCL變低后,從再釋放SDA為高。如果此時正好單片機復位,主SCL還沒來得及變低,直接變成高電平,此時從還在等待SCL變低,所以一直拉低SDA;而主由于復位,發現SDA一直為低,也在等待從釋放SDA為高。因此主從都進入一個相互等待的死鎖狀態。
最好的方法是采用模擬i2c. 但由于已經配置成硬件i2c,程序改為上電或復位改成發9個SCL時鐘信號,使從好釋放SDA。
盡量選用帶復位輸人的I2C從器件。
將所有的從I2C設備的電源連接在一起,通過MOS管連接到主電源,而MOS管的導通關斷由I2C主設備來實現。
在I2C從設備設計看門狗的功能。
在I2C主設備中增加I2C總線恢復程序。每次I2C主設備復位后,如果檢測到SDA數據線被拉低,則控制I2C中的 SCL時鐘線產生9個時鐘脈沖(針對8位數據的情況),這樣I2C從設備就可以完成被掛起的讀操作,從死鎖狀態中恢復過來。 這種方法有很大的局限性,因為大部分主設備的I2C模塊由內置的硬件電路來實現,軟件并不能夠直接控制SCL信號模擬 產生需要時鐘脈沖。
在I2C總線上增加一個額外的總線恢復設備。這個設備監視I2C總線。當設備檢測到SDA信號被拉低超過指定時間 時,就在SCL總線上產生9個時鐘脈沖,使I2C從設備完成讀操作,從死鎖狀態上恢復出來??偩€恢復設備需要有具有編程 功能,一般可以用單片機或CPLD實現這一功能。
在I2C上串人一個具有死鎖恢復的I2C緩沖器,如Linear公司的LTC4307:LTC4307是一個雙向的I2C 總線緩沖器,并且具有I2C總線死鎖恢復的功能。LTC4307總線輸人側連接主設備,總線輸出側連接所有從設備。當LTC4307 檢測到輸出側SDA或SCL信號被拉低30ms時,就自動斷開I2C總線輸人側與輸出側的連接.并且在輸出側SCL信號上產生16個時鐘脈沖來釋放總線。當總線成功恢復后,LTC4307會再次連接輸人輸出側,使總線能夠正常工作。
感謝各位的閱讀!關于“I2C死鎖怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。