單片機結(jié)構(gòu)簡單、開發(fā)方便,能夠滿足各種應(yīng)用領(lǐng)域的需求,在工業(yè)控制及自動化裝置中得到了廣泛的應(yīng)用。它既可以單獨使用,也可以多片協(xié)同工作或作為計算機的信號預(yù)處理器,在這種情況下,通信問題就成了限制系統(tǒng)性能的瓶頸。通常使用的通信方式有串行和并行兩種,串行方式硬件結(jié)構(gòu)簡單但數(shù)據(jù)傳輸速率低,不適合大批量數(shù)據(jù)的傳送;并行方式下使用最多的中斷方式,以期提高CPU效率。但中斷方式也存在不少問題,除了具體的中斷服務(wù)外,保護、恢復(fù)斷點和寄存器的內(nèi)容、查取中斷向量等也占用不少CPU時間,如果數(shù)據(jù)較長,傳送一組數(shù)據(jù)CPU會被多次中斷,大量的斷點和寄存器的保護、恢復(fù)等工作特別影響CPU 效率。為了解決這一問題,本文提出了一種新的通信方式,稱之為中斷查詢方式,并利用在系統(tǒng)可編程邏輯器件 ispLIS1016實現(xiàn)了通信接口。
1 通信原理
中斷查詢方式的實質(zhì)是中斷方式和查詢方式的結(jié)合:通信雙方由中斷方式進入數(shù)據(jù)傳送狀態(tài),之后雙方在中斷內(nèi)利用查詢方式完成數(shù)據(jù)傳送,直至一組數(shù)據(jù)傳送完畢,各自退出中斷服務(wù)。
基于這種方式,通信接口應(yīng)具有數(shù)據(jù)鎖存、狀態(tài)控制和中斷產(chǎn)生等功能。如圖1—1所示為接口框圖,數(shù)據(jù)鎖存由鎖存器m和鎖存器s完成,分別鎖存送往主計算機和單片機的數(shù)據(jù);中斷和狀態(tài)信號由狀態(tài)控制器形成,包括中斷信號(INTm和INTs),數(shù)據(jù)鎖存器m滿(FULLm)、鎖存器s滿(FULLs),以及數(shù)據(jù)傳送完畢(ENDm和ENDs)等狀態(tài),供通信雙方查詢;通信數(shù)據(jù)和各狀態(tài)信號均通過數(shù)據(jù)總線傳送,通信雙方讀數(shù)據(jù)還是讀狀態(tài)由各自的地址譯碼器控制,通過數(shù)據(jù)選擇器選擇;數(shù)據(jù)的三態(tài)輸出由數(shù)據(jù)緩沖器實現(xiàn)。我們以計算機向單片機發(fā)送數(shù)據(jù)為例說明數(shù)據(jù)傳送過程:當(dāng)計算機將數(shù)據(jù)寫入鎖存器s時,狀態(tài)控制器產(chǎn)生一中斷請求信號INTs,并置狀態(tài)FULLs=1、ENDs=0;單片機響應(yīng)中斷后便利用查詢方式接收數(shù)據(jù),查詢狀態(tài)信息FULLs和ENDs,每次FULLs=1時讀取一個數(shù)據(jù),同時該讀信號通過狀態(tài)控制器使FULLs清0,并產(chǎn)生中斷信號INTm;由于處于發(fā)送狀態(tài),計算機進入中斷后,先檢查 FULLs,等待FULLs=0后向數(shù)據(jù)鎖存器s寫數(shù)據(jù)(僅為利用該寫信號)將ENDs置位并退出中斷,單片機查到FULLs=0但ENDs=1后停止接收數(shù)據(jù)也退出中斷,一次通信完成。
可見,利用這種方式進行數(shù)據(jù)傳送,無論數(shù)據(jù)量多大,每次數(shù)據(jù)傳送過程中CPU只響應(yīng)一次中斷,與單一的中斷方式比較,節(jié)約了CPU的中斷響應(yīng)時間,對于大批量數(shù)據(jù)的傳送,不僅效率高,而且數(shù)據(jù)量可任意改變,使用非常靈活。
2 接口功能的實現(xiàn)
由圖1—1所示的框圖可以看出,上述中斷查詢接口不僅需要具有鎖存器和緩沖器的數(shù)據(jù)通道,還要有中斷、狀態(tài)控制及地址譯碼和數(shù)據(jù)選擇邏輯,電路是比較復(fù)雜的。但是,可編程邏輯器件和電子設(shè)計自動化工具的出現(xiàn),使得復(fù)雜電路可在單片可編程邏輯器件上實現(xiàn),不僅使設(shè)計簡化,而且使硬件設(shè)計象軟件一樣易于修改。針對前述中斷查詢接口,我們采用LATTICE的在系統(tǒng)可編程邏輯器件is-pLSI1016實現(xiàn)其功能。這樣,該接口的設(shè)計就轉(zhuǎn)化為對其電路描述文件的設(shè)計,可以采用原理圖或 HDL硬件描述語言。與原理圖比較,硬件描述語言不僅設(shè)計、閱讀和保存方便,而且易于仿真和進行邏輯綜合,更適合對復(fù)雜電路的描述。因此我們采用 ABEL-HDL硬件描述語言進行設(shè)計。
在Synario環(huán)境中,對選定的器件加入ABEL-HDL資源文件,輸入相應(yīng)的模塊名和文件名后,便可打開ABEL-HDL語言編輯窗口[2]。
利用ABEL語言進行電路設(shè)計的關(guān)鍵在于各信號的定義和相應(yīng)的邏輯描述。就前述接口而言,地址總線、數(shù)據(jù)總線、讀、寫及中斷信號均直接與通信雙方的 CPU相連,顯然應(yīng)定義為引腳(pin);而數(shù)據(jù)鎖存器及各狀態(tài)信號通過數(shù)據(jù)選擇器與數(shù)據(jù)總線相聯(lián),故為節(jié)點(node),如表2—1所示。其中,A、 D、RD、WR、Q分別表示地址線、數(shù)據(jù)線、讀、寫及數(shù)據(jù)鎖存器輸出信號,下標(biāo)m和s分別表示主計算機和單片機;表中將數(shù)據(jù)輸出定義為緩沖器(buffer)是為了直接利用ispLSI1016各I/O腳的三態(tài)輸出功能,以省去圖1—1中的數(shù)據(jù)緩沖器。另外,狀態(tài)信號FULL和END應(yīng)為具有異步清零和置位功能的寄存器,以存貯數(shù)據(jù)交換過程中相應(yīng)的狀態(tài)信息,但是在可編程邏輯器件中設(shè)計異步控制是復(fù)雜和浪費資源的,本文將它們設(shè)計為基本的RS 觸發(fā)器,故定義了相應(yīng)的反向輸出節(jié)點FUL1和EN1。
ABEL語言設(shè)計文件中各信號的邏輯關(guān)系可以多種方式給出,本設(shè)計主要采用寄存器和RS觸發(fā)器等,故以采用邏輯方程為宜。由前述接口原理可以看出,該接口的通信雙方均需3個端口:數(shù)據(jù)輸入/輸出口、狀態(tài)口及END信號置位口。設(shè)主計算機對應(yīng)的口地址為300H、308H和310H,單片機的3個口地址分別為8000H、8010H和8020H,對照圖1—1所示的框圖和接口的工作原理,電路的ABEL語言方程可以按功能塊給出。
數(shù)據(jù)鎖存器是數(shù)據(jù)可靠傳送的基礎(chǔ),對主計算機而言,向300H單元寫入數(shù)據(jù)就是將數(shù)據(jù)寫入鎖存器s中,也就是說鎖存器s的輸入信號為主計算機的數(shù)據(jù)總線,時鐘為主計算機對300H單元的寫信號,對應(yīng)的ABEL語言方程可表示為:
線和數(shù)據(jù)線的集合。為減少系統(tǒng)的片外接線,式(2—1)將鎖存器Qs的輸入定義為三態(tài)數(shù)據(jù)輸出的引腳(.pin),在保證接口功能的前提下,實現(xiàn)了在is-pLSI1016片內(nèi)Qs輸入端與數(shù)據(jù)總線的連接。
數(shù)據(jù)選擇器根據(jù)通信雙方對不同地址的讀取選擇不同信號,其ABEL語言方程為:
Ds.oe=!RDs&((ADRs==^h8000)#(ADRs==^h8010));(2—3)
when(ADRs==^h8000)then Ds=Qs;else when(ADRs==^h8010)then Ds=STs; (2—4)
式中,STs=[FULLs,F(xiàn)ULLm,ENDs,ENDm,x,x,x,x,x,x,x,x,x,x,x,x],12個任意值x的引入是為了使STs與數(shù)據(jù)總線寬度匹配。由于省去了圖1—1的數(shù)據(jù)緩沖器,數(shù)據(jù)選擇器的輸出即為數(shù)據(jù)總線,故其三態(tài)控制端為單片機讀數(shù)據(jù)(8000H)和讀狀態(tài)(8010H)信號的“或”信號。
狀態(tài)信號是數(shù)據(jù)正確傳送的保證,也是通信雙方讀寫數(shù)據(jù)的依據(jù)。從時序上講,F(xiàn)ULLs的置位和清零由Qs的寫信號和讀信號觸發(fā),即FULLs由方程(2—5)和(2—6)確定:
!FULLs=(?。ˋDRm==^h300)#WRm)& FUL1s;(2—5)
!FUL1s=(?。ˋDRs==^h8000)#RDs)& FULLs;(2—6)
其中FUL1s為FULLs的反相輸出端。ENDs的清零與FULLs的置位同時產(chǎn)生,但其置位必須由主計算機寫310H單元觸發(fā),故ENDs的ABEL語言方程為:
!ENDs=(?。ˋDRm==^h310)#WRm)&EN1s;
(2—7)
!EN1s=(!(ADRm==^h300)#WRm)&ENDs;
顯然,無論是主計算機將數(shù)據(jù)寫入Qs,還是主計算機將數(shù)據(jù)從Qm中讀走,INTs都應(yīng)置位,因此INTs=FULLs+FULLm,但這樣若FULLm為零則INTs將始終為1,無法產(chǎn)生中斷。為解決這一問題,我們將INTs的方程寫為:
INTs=FULLs#?。‵ULLm#ENDm);(2—9)
使其在ENDm為零時按INTs=FULLs+FULLm運算,只要由軟件上控制,保證每次通信前雙方的狀態(tài)為:ENDs=ENDm=1,F(xiàn)ULLs=FULLm=0,即可實現(xiàn)正確的中斷和通信。顯然,利用同樣的方法不難寫出主計算機一方各信號的邏輯關(guān)系,本文不再累述。
通過以上設(shè)計,我們實現(xiàn)了主計算機與多個80C196單片機系統(tǒng)之間的數(shù)據(jù)通信,將各80C196系統(tǒng)置于主計算機的總線擴展槽中,使整個系統(tǒng)不僅通信速度快,而且性能穩(wěn)定可靠,效果良好。
[參考文獻]
[1] 劉樂善等.微型計算機接口技術(shù)原理及使用.華中理工大學(xué)出版社,1996.3
[2] 黃正瑾.在系統(tǒng)編程技術(shù)及其應(yīng)用[M].東南大學(xué)出版社,1997.8