前兩天,開始我們樂創(chuàng)客第一塊開發(fā)板的設(shè)計,當(dāng)我在進(jìn)行電路設(shè)計時,我發(fā)現(xiàn)一些電路設(shè)計軟件的使用,一些電路設(shè)計的方案,一些創(chuàng)新的想法,一些元器件的選型這些都是可以記錄成文,并且分享出來一起討論的。因此從本節(jié)文字開始,正式開啟電路【電路設(shè)計筆記】的更新。當(dāng)然,這里的部分電路是我用了非常多年的成熟電路,一些電路是我臨時創(chuàng)新想出的未經(jīng)過驗證的電路,這些沒有被驗證的電路我會指出來,大家閱讀時如果發(fā)現(xiàn)有問題也希望不吝指出。
世界上最尷尬的事情是什么?這個我真不知道。但是做電子系統(tǒng)時最尷尬的事莫過于想要增加一個新的功能卻發(fā)現(xiàn)單片機的引腳不夠。
在我們?nèi)粘5碾娐吩O(shè)計時,除了最基本的產(chǎn)品需求要滿足之外,還需要考慮的就是整個電路設(shè)計的成本,在很多公司中,成熟產(chǎn)品的 cost down(成本降低)也基本上是個日常日程。產(chǎn)品成本的 cost down 比起供應(yīng)鏈端哥們的努力,設(shè)計源頭的 cost down 顯然更加直接簡單。一個好的電子工程師并不是能設(shè)計出多么復(fù)雜穩(wěn)定的電路,而是可以利用最簡單最便宜的方案來滿足復(fù)雜的產(chǎn)品設(shè)計要求。
在我們做單片機選型的時候,往往會發(fā)現(xiàn)這樣一個規(guī)律,同一個 core 的單片機選型時,單片機的引腳越多,其單價就越貴。以 STM32 為例,LQFP32 封裝的價格是最便宜的,往上依次是 LQFP48 封裝,LQFP64 封裝,LQFP100 封裝,LQFP144 封裝。在我們選型時,往往單片機的內(nèi)部資源 LQFP48 封裝的引腳就能滿足我們的需求,正當(dāng)我們決定選用這個芯片時,發(fā)現(xiàn)正好少了幾個用作 IO 口的引腳,因此不得不選用更高一級別的 LQFP64 封裝,正由于這個原因,電路的成本增加了好幾塊 RMB。其實解決單片機 IO 口不夠用的情況,除了選用引腳更多的芯片之外,還有一個簡單而便宜的方法,那就是 IO 口擴展。
單片機的 IO 口擴展一般有以下三種方案。
串轉(zhuǎn)并芯片
串轉(zhuǎn)并芯片來擴展單片機的 IO 可能是成本最低的 IO 擴展解決方案,而且對于單片機來說可以犧牲最少的端口來獲得最多的端口擴展收益。串轉(zhuǎn)并方案所利用的芯片就是我們?nèi)粘K^的“移位寄存器”芯片。由于移位寄存器是一種單向器件,因此需要利用只能做串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)的移位輸出寄存器芯片和只能做并行數(shù)據(jù)轉(zhuǎn)串行數(shù)據(jù)的移位輸入寄存器芯片來完成這個單片機 IO 口的雙向傳輸方案。
首先來討論單片機輸出口的擴展方案。單片機輸出口擴展需要利用串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)的移位寄存器芯片,最常用的芯片是 74HC595。
74HC595 是一個 8 位串行輸入、平行輸出的位移緩存器:平行輸出為三態(tài)輸出。我們從它的邏輯框圖中可以看到,這個 74HC595 芯片內(nèi)部分成三個部分:
圖中紅色框選出的是移位寄存器單元,這個單元的功能為 SER 引腳上的數(shù)據(jù)會在每個 SCK 上升沿到來時被移位進(jìn)入移位寄存器。
圖中藍(lán)色部分框選出的是數(shù)據(jù)暫存器單元,其實這里就是 8 個并聯(lián)的 D 觸發(fā)器,這 8 個 D 觸發(fā)器的輸出分別和其對應(yīng)的前級移位寄存器輸出端相連,在每個 RCK 上升沿到來時就將數(shù)據(jù)鎖存住。
圖中黃色框選出的是輸出門控電路,這是 8 個三態(tài)門組成的電路,當(dāng) G 非為低電平時,三態(tài)門被開啟,輸出有效,反之芯片輸出為高阻狀態(tài)。
最后一個 Q’H 引腳,是將串行數(shù)據(jù)輸出的,比如當(dāng) SCK 第 8 個脈沖到來時,8 個移位寄存器正好可以存儲一個字節(jié)的數(shù)據(jù),但是當(dāng)?shù)?9 個脈沖到來時,最先來的那個 SER 上的數(shù)據(jù)會被最晚到來的第 9 個脈沖頂出來,頂出來的那一位數(shù)據(jù)就會出現(xiàn)在 Q’H 引腳上面,這個引腳的主要目的是用來做 74HC595 芯片擴展的。
接著來討論單片機輸入口的擴展方案。單片機輸入口擴展需要利用并行數(shù)據(jù)轉(zhuǎn)串行數(shù)據(jù)的移位寄存器芯片,最常用的芯片是 74HC165。
74HC165 是 8 位并行讀取或串行輸入移位寄存器,可在末級得到互補的串行輸出(Q7 和!Q7),當(dāng)異步并行讀取引腳(!PL)輸入為低時,從 D0 到 D7 口輸入的并行數(shù)據(jù)將被讀取進(jìn)寄存器內(nèi)。而當(dāng)異步并行讀取引腳為高時,數(shù)據(jù)將在每個時鐘脈沖的上升沿從 引腳串行進(jìn)入寄存器并將現(xiàn)有數(shù)據(jù)右移一位( 以此類推)。利用這種特性,只要把 Q7 輸出綁定到下一級的輸入,即可實現(xiàn)移位寄存器位數(shù)的擴展。
74HC165 的時鐘輸入是一個“門控與”結(jié)構(gòu),CP(時鐘脈沖)和 CE(時鐘允許)共同產(chǎn)生有效時鐘輸入。只有在 CE(時鐘允許)為低時,CP(時鐘脈沖)才有效。
應(yīng)當(dāng)注意的是,在 PL 上升沿到來前,CP 或者 CE 必須置高,以防止數(shù)據(jù)在 PL 的狀態(tài)尚未穩(wěn)定時發(fā)生移位。
以上就是關(guān)于移位寄存器用來擴展單片機 IO 口的,但是移位寄存器擴展出來的單片機 IO 口只能用作一些低速設(shè)備的驅(qū)動擴展,如按鍵,LED 等,無法去驅(qū)動一些高速的設(shè)備,因為串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)都是通過循環(huán)一位一位地移出來的,因此速度都是有限的。
專用 IO 擴展芯片
專用的 IO 擴展芯片很多,這里以 NXP 的 PCF8574 為例。
PCF8574 是一種硅 CMOS 電路。它通過雙線雙向總線(I2C)為大多數(shù)微控制器系列提供通用遠(yuǎn)程 I/O 擴展。
該器件由 8 位準(zhǔn)雙向端口和 I2C 總線接口組成。PCF8574 具有低電流消耗,包括鎖存輸出,具有高電流驅(qū)動能力,可直接驅(qū)動 LED。它還具有中斷線(INT),可以連接到微控制器的中斷邏輯。通過在這條線上發(fā)送一個中斷信號,遠(yuǎn)程 I/O 可以通知微控制器其端口上是否有傳入數(shù)據(jù),而無需通過 I2C 總線進(jìn)行通信。這意味著 PCF8574 仍然是一個簡單的從設(shè)備。PCF8674 具有以下特性:
•工作電源電壓 2.5 至 6 V
•待機電流消耗低,最大 10µA
•I2C 到并行端口擴展器
•漏極開路中斷輸出
•I2C 總線的 8 位并行 I/O 端口
•兼容大多數(shù)微控制器
•鎖定輸出,具有高電流驅(qū)動能力,可直接驅(qū)動 LED
•通過 3 個硬件地址引腳尋址,最多可使用 8 個設(shè)備(PCF8574A 最多可使用 16 個)
•DIP16 或節(jié)省空間的 SO16 或 SSOP20 封裝。
說到專用的 IO 擴展芯片,其大致功能和移位寄存器相似,細(xì)節(jié)上還是有很多不同,當(dāng)然專用的 IO 擴展芯片功能更加強大,比如 PCF8574 的 IO 口能同時支持輸入輸出功能。這些細(xì)致的功能用起來雖然更加順手,方便,但是跟其昂貴的售價比起來,這些功能顯然性價比太低。
以上就是兩種單片機 IO 口擴展的方案,孰優(yōu)孰劣,一目了然。