IIC爲什麼需要用開漏輸出和上拉電阻

最近在調ICM20602模塊(一個六軸陀螺儀和加速度計), 使用IIC通信協議, 這個過程中遇到一個困擾我很長時間的問題.
IIC協議正確, 但是一直讀取失敗.最後發現因爲沒配置GPIO爲開漏輸出.

推輓輸出和開漏輸出

  • 推輓輸出: 輸出邏輯0,則N-MOS激活;輸出邏輯1,P-MOS激活。
  • 開漏輸出:
    • 在不接上拉電阻時, 輸出邏輯0,則N-MOS激活;輸出邏輯1,P-MOS不會激活, 不會輸出高電平。
    • 在接上拉電阻時, 輸出邏輯0,則N-MOS激活;輸出邏輯1,P-MOS激活, 可以輸出高電平。

也就是說開漏輸出如果不接上拉電阻, 沒有輸出高電平的能力.
如果需要開漏輸出有輸出高電平的能力需要接一個上拉電阻. 目前很多單片機GPIO可以通過軟件配置上拉電阻.

左圖爲開漏輸出(接上拉電阻), 右圖爲推輓輸出

開漏輸出的作用

  1. 防止短路: 在一些情況下(比如總線), 多個GPIO口可能會連接在同一根線上, 存在某個GPIO輸出高電平, 另一個GPIO輸出低電平的情況. 如果使用推輓輸出, 你會發現這個GPIO的VCC和另一個GPIO的GND接在了一起, 也就是短路了(涼涼了). 如果換成開漏輸出呢? VCC和GND多了個電阻, 這樣電路就是安全的.所以總線一般會使用開漏輸出.

VCC與GND連到了一起

  1. 線與: 開漏輸出還能實現 線與 (自行百度), 減少一個與門, 簡化電路.

IIC爲什麼用開漏輸出和上拉電阻

其實知道了開漏輸出的作用, 這個問題不難回答

  1. IIC協議支持多個主設備與多個從設備在一條總線上, 如果不用開漏輸出, 而用推輓輸出, 會出現主設備之間短路的情況. 至於爲什麼需要上拉電阻, 那是因爲IIC通信需要輸出高電平的能力.

  2. 爲了實現多個主設備搶佔總線時的仲裁.

    IIC只有兩根線(SCL和SDA), 怎麼判斷哪個主設備佔用總線(當然是先來後到了). 假設主設備A需要啓動IIC, 他需要在SCL高電平時, 將SDA由高電平轉換爲低電平作爲啓動信號. 主設備A在把SDA拉高後, 它需要再檢查一下SDA的電平.

    • SDA是高電平, 說明主設備A可以佔用總線, 然後主設備A將SDA拉低, 開始通信.
    • SDA是低電平, 說明有人已經捷足先登了, 主設備A不能佔用總線, 結束通信.

    爲什麼? 因爲線與. 如果主設備A拉高SDA時, 已經有其他主設備將SDA拉低了. 由於 1 & 0 = 0 那麼主設備A在檢查SDA電平時, 會發現不是高電平, 而是低電平. 說明其他主設備搶佔總線的時間比它早, 主設備A只能放棄佔用總線. 如果是高電平, 則可以佔用.

    這就是開漏輸出在IIC通信中的另一個作用.

因此, 模擬IIC一定要將GPIO端口設置爲開漏輸出並加上上拉電阻.(硬件IIC會自動配置爲開漏輸出)

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章