2016年8月9日 星期二

push-pull, open-drain

Push-pull:
Push-pull輸出,實際上內部是用了兩個電晶體(transistor),此處分別稱為top transistorbottom transistor。通過開關對應的電晶體,輸出對應的電平。top transistor打開(bottom transistor關閉),輸出為高電平;bottom transistor打開(top transistor關閉),輸出低電平。Push-pull即能夠漏電流(sink current),又可以集電流(source current)。其也許有,也許沒有另外一個狀態:高阻抗(high impedance)狀態。除非Push-pull需要支援額外的高阻抗狀態,否則不需要額外的上拉電阻。


Open-Drain:

Open-drain輸出,則是比push-pull少了個top transistor,只有那個bottom transistor。(就像push-pull中的那樣)當bottom transistor關閉,則輸出為高電平。此處沒法輸出高電平,想要輸出高電平,必須外部再接一個上拉電阻(pull-up resistor)。Open-drain只能夠漏電流(sink current),如果想要集電流(source current),則需要加一個上拉電阻。


常見的GPIO的模式可以配置為open-drainpush-pull,具體實現上,常為通過配置對應的寄存器的某些位元來配置為open-drain或是push-pull。當我們通過CPU去設置那些GPIO的配置寄存器的某位元(bit)的時候,其GPIO硬體IC內部的實現是,會去打開或關閉對應的top transistor。相應地,如果設置為了open-d模式的話,是需要上拉電阻才能實現,也能夠輸出高電平的。因此,如果硬體內部(internal)本身包含了對應的上拉電阻的話,此時會去關閉或打開對應的上拉電阻。如果GPIO硬體IC內部沒有對應的上拉電阻的話,那麼你的硬體電路中,必須自己提供對應的外部(external)的上拉電阻。而push-pull輸出的優勢是速度快,因為線路(line)是以兩種方式驅動的。而帶了上拉電阻的線路,即使以最快的速度去提升電壓,最快也要一個常量的R×C的時間。其中R是電阻,C是寄生電容(parasitic capacitance),包括了pin腳的電容和板子的電容。但是,push-pull相對的缺點是往往需要消耗更多的電流,即功耗相對大。而open-drain所消耗的電流相對較小,由電阻R所限制,而R不能太小,因為當輸出為低電平的時候,需要sink更低的transistor,這意味著更高的功耗。(此段原文:because the lower transistor has to sink that current when the output is low; that means higher power consumption.)而open-drain的好處之一是,允許你cshort(?)多個open-drain的電路,公用一個上拉電阻,此種做法稱為wired-OR連接,此時可以通過拉低任何一個IOpin腳使得輸出為低電平。為了輸出高電平,則所有的都輸出高電平。此種邏輯,就是線與的功能,可以不需要額外的gate電路來實現此部分邏輯。



對於GPIO的模式的設置,在不考慮是否需要額外的上拉電阻的情況下,是設置為open-drain還是push-pull,說到底,還是個權衡的問題:
如果你想要電平轉換速度快的話,那麼就選push-pull,但是缺點是功耗相對會大些。

如果你想要功耗低,且同時具有線與的功能,那麼就用open-drain的模式。(同時注意GPIO硬體模組內部是否有上拉電阻,如果沒有,需要硬體電路上添加額外的上拉電阻)

open drain, 外部需有pull up電阻, 內部floating

push pull外部則不須pull up, 由內部control

1 則留言: