最近畫的一塊板子中用到了六路同相門芯片74HC07作為電平轉換,將FPGA產生的3.3V信號轉換為5V,但是沒有注意到74HC07的輸出是開漏結構(以為給74HC07一個5V電源就可以將輸入的3.3V電平轉換為5V電平輸出……囧……,好吧我承認我是菜鳥),結果可想而知,板子拿回來完全不能用,只好用飛線給74HC07的幾個輸出口接了1K的上拉電阻,這樣板子才正常工作了,但是板子上接了一堆的飛線,怎么看都覺得不爽,哎,都是這個開漏結構給害的……
於是乎,在做下一版之前,我仔細研究了一下這個開漏輸出結構,發現芯片的IO口結構還是很有學問的,下面以51單片機的輸出口結構為例,介紹一下常見的幾種輸出口結構:
1. 准雙向口結構
准雙向口,也就是說不是真正的雙向口,真正意義上的雙向口是需要通過設置專門的“輸入輸出方向寄存器”將IO口設為輸入模式或者輸出模式,才能實現對應的輸入輸出功能。而准雙向口則不需要設置,作為輸出時直接向口線寄存器寫;作為輸入時則需要先向IO口寫1再去讀。准雙向口的內部電路結構如下如所示:
圖1 准雙向口內部電路結構
由圖可以看出當口線寄存器為1時,左邊的場效應管斷開,右邊的場效應管導通,於是輸出被電源上拉為1,輸出高電平;當口線寄存器為0時,左邊的管子導通,右邊的管子截止,輸出管腳相當於直接通過左邊的管子接地,輸出低電平。在讀取數據時,如果口線寄存器的值為1,當管腳接低電平時,采集到時輸入數據為1,反之為0,這種情況下是可以正確的讀取數據的,但是如果口線寄存器的值為0 ,則左邊的場效應管導通,輸出相當於直接與地線相連,此時無論外部輸入為高電平還是低電平,采集到的輸入數據都是0,這樣就不能正確的讀取數據了。所以對於准雙向口,作為輸入口使用時,必須先向該IO口寫1,再讀取,這就是准雙向口的特點。
2.開漏輸出結構
開漏(open drain),這里的“漏”指的是場效應管的漏極(drain),對應於三極管的集電極(collector),開漏就是指場效應管的漏極保持開路,直接接出作為輸出口,如下圖所示:
圖2 開漏輸出結構
從圖中可以看出,當口線寄存器為0時,管子導通,輸出直接通過管子接地,輸出低電平;當口線寄存器為1時,管子截止,輸出腳相當於懸空,為高阻態,因此開漏輸出接口不能夠正確的輸出高低電平。對於開漏輸出結構,輸出必須接上拉電阻,才能夠正常使用,如下圖所示:
圖3 開漏輸出結構加上拉電阻
外接了上拉電阻后,當口線寄存器為0時,輸出被電源上拉為高電平,口線寄存器為0時,輸出口通過管子直接接地,為低電平,這樣就可以正確的讀取外部數據了。
很多芯片都提供開漏輸出結構,這是因為開漏輸出結構有很多優點:
a. 充分利用外部電路的驅動能力,減小芯片內部的驅動,從而降低芯片的功耗,提高芯片工作穩定性
b. 可以通過改變上拉電源的電壓,改變信號的傳輸電平,比如某芯片的輸出為3.3V電平,其輸出口的上拉電源可以為5V,這樣就很方便的實現了電平轉換。
當然,開漏輸出也存在明顯的缺點:在輸出脈沖信號時,在脈沖的上升沿,電源通過上拉無源電阻對負載充電,其速度較慢,導致上升時間變長,因而會導致脈沖上升沿變壞,上拉電阻阻值越大,充電時間就越長,因此其速度越慢,而阻值較小時,其功耗又會變大,因此在設計時要兼顧速度和功耗。而對於下降沿,電源通過芯片內部的場效應管放電,其速度較快,所以上拉電阻對脈沖的下降沿影響不大,某些情況下可以考慮用下降沿輸出。
3.推挽輸出
推挽輸出也是一種很常見的輸出結構,其內部電路結構如圖所示:
圖4 推挽輸出結構
與准雙向口類似,只是右邊的場效應管為強上拉作用,因而輸出電流較大,適用於需要大電流驅動的場合。在使用推挽結構時,要注意不要將兩個IO口短接,因為如果一個IO口為高電平而另外一個為低電平時,會有很大的電流流入芯片,可能燒壞芯片。
總之呢,在使用一些不熟悉的芯片時,一定要注意其IO口的結構,根據IO口結構設計合適的電路,以免出現一些意想不到的錯誤。