新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > I2C總線死鎖原因及解決方法

        I2C總線死鎖原因及解決方法

        作者: 時間:2016-12-15 來源:網絡 收藏
        在正常情況下,I2C總線協議能夠保證總線正常的讀寫操作。但是,當I2C主設備異常復位時(看門狗動作,板上電源異常
        導致復位芯片動作,手動按鈕復位等等)有可能導致I2C總線死鎖產生。下面詳細說明一下總線死鎖產生的原因。

        在I2C主設備進行讀寫操作的過程中.主設備在開始信號后控制SCL產生8個時鐘脈沖,然后拉低SCL信號為低電平,在這個時候,從設備輸出應答信號,將SDA信號拉為低電平。如果這個時候主設備異常復位,SCL就會被釋放為高電平。此時,如果從設備沒有復位,就會繼續I2C的應答,將SDA一直拉為低電平,直到SCL變為低電平,才會結束應答信號。而對于I2C主設備來說.復位后檢測SCL和SDA信號,如果發現SDA信號為低電平,則會認為I2C總線被占用,會一直等待SCL和SDA信號變為高電平。這樣,I2C主設備等待從設備釋放SDA信號,而同時I2C從設備又在等待主設備將SCL信號拉低以釋放應答信號,兩者相互等待,I2C總線進人一種死鎖狀態。同樣,當I2C進行讀操作,I2C從設備應答后輸出數據,如果在這個時刻I2C主設備異常復位而此時I2C從設備輸出的數據位正好為0,也會導致I2C總線進入死鎖狀態。

        方法

        (1)盡量選用帶復位輸人的I2C從器件。

        (2)將所有的從I2C設備的電源連接在一起,通過MOS管連接到主電源,而MOS管的導通關斷由I2C主設備來實現。
        (3)在I2C從設備設計看門狗的功能。

        (4)在I2C主設備中增加I2C總線恢復程序。每次I2C主設備復位后,如果檢測到SDA數據線被拉低,則控制I2C中的
        SCL時鐘線產生9個時鐘脈沖(針對8位數據的情況),這樣I2C從設備就可以完成被掛起的讀操作,從死鎖狀態在正常情況下,I2C總線協議能夠保證總線正常的讀寫操作。但是,當I2C主設備異常復位時(看門狗動作,板上電源異常
        導致復位芯片動作,手動按鈕復位等等)有可能導致鎖產生。下面詳細說明一下總線死鎖產生的原因。

        在I2C主設備進行讀寫操作的過程中.主設備在開始信號后控制SCL產生8個時鐘脈沖,然后拉低SCL信號為低電平,在這個時候,從設備輸出應答信號,將SDA信號拉為低電平。如果這個時候主設備異常復位,SCL就會被釋放為高電平。此時,如果從設備沒有復位,就會繼續I2C的應答,將SDA一直拉為低電平,直到SCL變為低電平,才會結束應答信號。而對于I2C主設備來說.復位后檢測SCL和SDA信號,如果發現SDA信號為低電平,則會認為I2C總線被占用,會一直等待SCL和SDA信號變為高電平。這樣,I2C主設備等待從設備釋放SDA信號,而同時I2C從設備又在等待主設備將SCL信號拉低以釋放應答信號,兩者相互等待,I2C總線進人一種死鎖狀態。同樣,當I2C進行讀操作,I2C從設備應答后輸出數據,如果在這個時刻I2C主設備異常復位而此時I2C從設備輸出的數據位正好為0,也會導致I2C總線進入死鎖狀態。

        方法

        (1)盡量選用帶復位輸人的I2C從器件。

        (2)將所有的從I2C設備的電源連接在一起,通過MOS管連接到主電源,而MOS管的導通關斷由I2C主設備來實現。
        (3)在I2C從設備設計看門狗的功能。

        (4)在I2C主設備中增加I2C總線恢復程序。每次I2C主設備復位后,如果檢測到SDA數據線被拉低,則控制I2C中的
        SCL時鐘線產生9個時鐘脈沖(針對8位數據的情況),這樣I2C從設備就可以完成被掛起的讀操作,從死鎖狀態中恢復過來。
        這種方法有很大的局限性,因為大部分主設備的I2C模塊由內置的硬件電路來實現,軟件并不能夠直接控制SCL信號模擬
        產生需要時鐘脈沖。

        (5)在I2C總線上增加一個額外的總線恢復設備。這個設備監視I2C總線。當設備檢測到SDA信號被拉低超過指定時間
        時,就在SCL總線上產生9個時鐘脈沖,使I2C從設備完成讀操作,從死鎖狀態上恢復出來。總線恢復設備需要有具有編程
        功能,一般可以用單片機或CPLD實現這一功能。

        (6)在I2C上串人一個具有死鎖恢復的I2C緩沖器,如Linear公司的LTC4307o如圖2所示TC4307是一個雙向的I2C
        總線緩沖器,并且具有鎖恢復的功能。LTC4307總線輸人側連接主設備,總線輸出側連接所有從設備。當LTC4307
        檢測到輸出側SDA或SCL信號被拉低30ms時,就自動斷開I2C總線輸人側與輸出側的連接.并且在輸出側SCL信號上產生16個時鐘脈沖來釋放總線。當總線成功恢復后,LTC4307會再次連接輸人輸出側,使總線能夠正常工作。中恢復過來。
        這種方法有很大的局限性,因為大部分主設備的I2C模塊由內置的硬件電路來實現,軟件并不能夠直接控制SCL信號模擬
        產生需要時鐘脈沖。

        (5)在I2C總線上增加一個額外的總線恢復設備。這個設備監視I2C總線。當設備檢測到SDA信號被拉低超過指定時間
        時,就在SCL總線上產生9個時鐘脈沖,使I2C從設備完成讀操作,從死鎖狀態上恢復出來。總線恢復設備需要有具有編程
        功能,一般可以用單片機或CPLD實現這一功能。

        (6)在I2C上串人一個具有死鎖恢復的I2C緩沖器,如Linear公司的LTC4307o如圖2所示TC4307是一個雙向的I2C
        總線緩沖器,并且具有鎖恢復的功能。LTC4307總線輸人側連接主設備,總線輸出側連接所有從設備。當LTC4307
        檢測到輸出側SDA或SCL信號被拉低30ms時,就自動斷開I2C總線輸人側與輸出側的連接.并且在輸出側SCL信號上產生16個時鐘脈沖來釋放總線。當總線成功恢復后,LTC4307會再次連接輸人輸出側,使總線能夠正常工作。


        關鍵詞: I2C總線死

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乌鲁木齐县| 西青区| 嘉荫县| 公安县| 方山县| 阳西县| 根河市| 始兴县| 乌拉特后旗| 海口市| 虞城县| 哈巴河县| 青铜峡市| 湘潭市| 太康县| 平潭县| 苏州市| 岱山县| 丰台区| 新宾| 永登县| 南丰县| 海丰县| 惠州市| 中牟县| 宁安市| 凉城县| 宜城市| 临江市| 贡山| 洪江市| 深泽县| 仁化县| 称多县| 濮阳市| 孝感市| 怀集县| 息烽县| 江达县| 长阳| 资中县|