最近在調(diào)ICM20602模塊(一個六軸陀螺儀和加速度計), 使用IIC通信協(xié)議, 這個過程中遇到一個困擾我很長時間的問題。
IIC協(xié)議正確, 但是一直讀取失敗.最后發(fā)現(xiàn)因?yàn)闆]配置GPIO為開漏輸出。
推挽輸出和開漏輸出
推挽輸出: 輸出邏輯0,則N-MOS激活; 輸出邏輯1,則P-MOS激活。 開漏輸出: 在不接上拉電阻時, 輸出邏輯0,則N-MOS激活; 輸出邏輯1,P-MOS不會激活, 不會輸出高電平。 在接上拉電阻時, 輸出邏輯0,則N-MOS激活; 輸出邏輯1,P-MOS激活, 可以輸出高電平。
也就是說開漏輸出如果不接上拉電阻, 沒有輸出高電平的能力。 如果需要開漏輸出有輸出高電平的能力需要接一個上拉電阻. 目前很多單片機(jī)GPIO可以通過軟件配置上拉電阻.
左圖為開漏輸出(接上拉電阻), 右圖為推挽輸出
開漏輸出的作用
防止短路: 在一些情況下(比如總線), 多個GPIO口可能會連接在同一根線上, 存在某個GPIO輸出高電平, 另一個GPIO輸出低電平的情況. 如果使用推挽輸出, 你會發(fā)現(xiàn)這個GPIO的VCC和另一個GPIO的GND接在了一起, 也就是短路了(涼涼了). 如果換成開漏輸出呢? VCC和GND多了個電阻, 這樣電路就是安全的.所以總線一般會使用開漏輸出.
線與: 開漏輸出還能實(shí)現(xiàn)線與(自行百度), 減少一個與門, 簡化電路.
IIC為什么用開漏輸出和上拉電阻
IIC協(xié)議支持多個主設(shè)備與多個從設(shè)備在一條總線上,如果不用開漏輸出, 而用推挽輸出, 會出現(xiàn)主設(shè)備之間短路的情況. 至于為什么需要上拉電阻, 那是因?yàn)镮IC通信需要輸出高電平的能力. 為了實(shí)現(xiàn)多個主設(shè)備搶占總線時的仲裁.IIC只有兩根線(SCL和SDA), 怎么判斷哪個主設(shè)備占用總線(當(dāng)然是先來后到了). 假設(shè)主設(shè)備A需要啟動IIC, 他需要在SCL高電平時, 將SDA由高電平轉(zhuǎn)換為低電平作為啟動信號. 主設(shè)備A在把SDA拉高后, 它需要再檢查一下SDA的電平。 為什么? 因?yàn)榫€與. 如果主設(shè)備A拉高SDA時, 已經(jīng)有其他主設(shè)備將SDA拉低了. 由于 1 & 0 = 0 那么主設(shè)備A在檢查SDA電平時, 會發(fā)現(xiàn)不是高電平, 而是低電平. 說明其他主設(shè)備搶占總線的時間比它早, 主設(shè)備A只能放棄占用總線. 如果是高電平, 則可以占用。
這就是開漏輸出在IIC通信中的另一個作用。 SDA是高電平, 說明主設(shè)備A可以占用總線, 然后主設(shè)備A將SDA拉低, 開始通信. SDA是低電平, 說明有人已經(jīng)捷足先登了, 主設(shè)備A不能占用總線, 結(jié)束通信. 因此, 模擬IIC一定要將GPIO端口設(shè)置為開漏輸出并加上上拉電阻.(硬件IIC會自動配置為開漏輸出)。
原文標(biāo)題:IIC為什么需要用開漏輸出和上拉電阻?
文章出處:【微信公眾號:嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
電阻
+關(guān)注
關(guān)注
87文章
5592瀏覽量
173921 -
通信
+關(guān)注
關(guān)注
18文章
6145瀏覽量
137161 -
IIC
+關(guān)注
關(guān)注
11文章
304瀏覽量
39022
原文標(biāo)題:IIC為什么需要用開漏輸出和上拉電阻?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
嵌入式硬件雜談:推挽、開漏、高阻態(tài)、上拉電阻

上拉電阻阻值怎么選擇
ADS1118在5V供電時是不是還需要開漏輸出,上拉CS SCK DIN至5V?
求助,求推薦能支持開漏輸出,且速度可以到50M以上的電平轉(zhuǎn)換芯片?
請問TPA3130D2 FAULTZ是開漏輸出嗎?
IIC信號線需要增加上拉電阻,是因?yàn)?b class='flag-5'>IIC的IO是什么
如何計算上拉電阻的值
電路設(shè)計基礎(chǔ):上拉電阻、下拉電阻分析
開漏輸出默認(rèn)是高還是低
求助,Proteus是否無法正確仿真STM32的開漏輸出?
I2C通訊為什么要用開漏輸出和上拉電阻?

評論