I2C死鎖緣由及解決方法

緣由

當單片機正在和I2C從機通訊,若是主正好發生打算髮第9個時鐘,此時SCL爲高,而從開始拉低SDA爲低作準備(做爲ACK信號),等待主SCL變低後,從再釋放SDA爲高。若是此時正好單片機復位,主SCL還沒來得及變低,直接變成高電平,此時從還在等待SCL變低,因此一直拉低SDA;而主因爲復位,發現SDA一直爲低,也在等待從釋放SDA爲高。所以主從都進入一個相互等待的死鎖狀態。編程

解決辦法

  1. 最好的方法是採用模擬i2c. 但因爲已經配置成硬件i2c,程序改成上電或復位改爲發9個SCL時鐘信號,使從好釋放SDA。
  2. 儘可能選用帶復位輸人的I2C從器件。
  3. 將全部的從I2C設備的電源鏈接在一塊兒,經過MOS管鏈接到主電源,而MOS管的導通關斷由I2C主設備來實現。
  4. 在I2C從設備設計看門狗的功能。
  5. 在I2C主設備中增長I2C總線恢復程序。每次I2C主設備復位後,若是檢測到SDA數據線被拉低,則控制I2C中的 SCL時鐘線產生9個時鐘脈衝(針對8位數據的狀況),這樣I2C從設備就能夠完成被掛起的讀操做,從死鎖狀態中恢復過來。 這種方法有很大的侷限性,由於大部分主設備的I2C模塊由內置的硬件電路來實現,軟件並不可以直接控制SCL信號模擬 產生須要時鐘脈衝。
  6. 在I2C總線上增長一個額外的總線恢復設備。這個設備監視I2C總線。當設備檢測到SDA信號被拉低超過指定時間 時,就在SCL總線上產生9個時鐘脈衝,使I2C從設備完成讀操做,從死鎖狀態上恢復出來。總線恢復設備須要有具備編程 功能,通常能夠用單片機或CPLD實現這一功能。
  7. 在I2C上串人一個具備死鎖恢復的I2C緩衝器,如Linear公司的LTC4307:LTC4307是一個雙向的I2C 總線緩衝器,而且具備I2C總線死鎖恢復的功能。LTC4307總線輸人側鏈接主設備,總線輸出側鏈接全部從設備。當LTC4307 檢測到輸出側SDA或SCL信號被拉低30ms時,就自動斷開I2C總線輸人側與輸出側的鏈接.而且在輸出側SCL信號上產生16個時鐘脈衝來釋放總線。當總線成功恢復後,LTC4307會再次鏈接輸人輸出側,使總線可以正常工做。
相關文章
相關標籤/搜索