開漏輸出和推挽輸出
以上是 GPIO 配置為輸出時的內部示意圖,我們要關注的其實就是這兩個 MOS 管的開關狀態,可以組合出四種狀態:
兩個 MOS 管都關閉時,輸出處于一個浮空狀態,此時他對其他點的電阻是無窮大的,所以這個狀態也被稱為高阻態;當兩個 MOS 管都打開時,電源直接對地短路,MOS 管就燒毀了,所以這種狀態不存在。對于一個 GPIO 來說,配置為輸出時,就只能有這三種狀態。
推挽輸出
把 GPIO 輸出的高電平和低電平拿出來,組成一個組合。
當我們外接一個 MOS 管時,輸出高電平,電流流出去給外面的 MOS 管的柵極充電,所以這個過程稱為推。把電流推出去。
當 IO 口輸出低電平時,電路流進來給外面的 MOS 管的柵極放電,這個過程就是挽,把電流挽回來。
所以所謂的推挽就是描述了 MOS 管輸出高低電平時,電流的一個動作而已。
開漏輸出
把 GPIO 輸出的低電平和浮空/高阻態拿出來,組成一個組合。
這種組合下,上面的 MOS 管永遠是關閉的,所以這個時候可以把上面當作不存在的。
下面的 MOS 管的漏極就等于什么都沒接,屬于一個開路狀態,所以這個模式被稱為開漏模式。
開漏模式的作用:
-
改變高電平的電壓;
舉個例子,現在想用這個 GPIO 去控制一個芯片的 enable 引腳,但是這個 GPIO 輸出的高電平是 5V。而芯片只支持 3.3V 輸入,如果使用推挽模式輸出高電平的話,是 5V,可能會把后面的芯片燒毀。
所以需要使用開漏模式,同時需要在外面接一個上拉電阻,這樣當 MOS 關閉,也就是 GPIO 處于高阻態時,enable 就會被上拉電阻拉到 3.3V,也就是高電平;當 MOS 管打開時,enable就被 MOS 管拉到了低電平。以上實現了 5V 單片機對 3.3V 芯片的控制。
-
支持多個 GPIO 來控制一個輸入;
上面是使用兩個 GPIO 來控制右邊芯片的 enable。如果使用的是推挽模式,如果上面的 GPIO 輸出的是高電平,下面輸出的是低電平,那么左邊的通路就會短路,兩個 MOS 管會燒毀一個。所以需要把這兩個 GPIO 都配置為開漏模式,然后再外接一個上拉電阻。這樣只要有任意一個 GPIO 輸出低電平時,enable 就是低電平。如果都處于高阻態,enable 就是高電平。上面的現象就是“線與”,只要有任意一個或多個 GPIO 輸出了低電平,輸出的就都是低電平;只有所有 GPIO 都輸出高電平,總線才處于高電平。
總結
一個 GPIO 根據內部 MOS 管的開關情況,存在三種輸出狀態,分別是高電平、低電平和高阻態。
推挽輸出,是通過開關管直接接到正極和負極的,所以是強上拉和強下拉的模式。
開漏輸出是去掉強上拉的開關管,輸出低電平時,下管導通,是強下拉。輸出高電平時,下管斷開,但是沒有上管了,此時引腳處于浮空狀態,也就是高阻態。
開漏輸出一般都會配置一顆外部的上拉電阻。通過一個電阻拉到高電平的,屬于弱上拉。弱上拉的好處:
- 完全杜絕了電源短路現象,保證電路的安全;
- 避免了引腳模式的頻繁切換;開漏加弱上拉的模式,同時兼具了輸入和輸出的功能;想要輸出,就操作 MOS 管的打開和關閉;想要輸入的話,就讓 MOS 管處于關閉狀態,然后觀察電路中的電流就可以。