基于硬件仲裁和串行總線的多機(jī)通信
關(guān)鍵詞 多主機(jī)系統(tǒng) 串行總線 I2C SPI硬件仲裁優(yōu)先編碼器
引 言
隨著單片機(jī)技術(shù)的發(fā)展和單片機(jī)芯片價(jià)格的下降,利用多個(gè)相同類型或不同類型的單片機(jī)構(gòu)成一個(gè)多單片機(jī)系統(tǒng),可以獲得良好的系統(tǒng)靈活性和性能價(jià)格比,如可以用一個(gè)AT89C52單片機(jī)作多功能外圍器件芯片。系統(tǒng)內(nèi)多個(gè)單片機(jī)之間的通信可以有多種方式,如硬件UART、片內(nèi)SPI/I2C總線、軟件模擬SPI/I2C總線、I/O口、雙口RAM和基于I2C總線及FRAM的通信方式。其中,基于串行總線(SPI或I2C)及串行接口存儲(chǔ)芯片(FRAM或SRAM,如DSl302芯片內(nèi)的SRAM)的通信方式是一種簡(jiǎn)單、高效、實(shí)用的解決方法。此時(shí),系統(tǒng)可以有多個(gè)主機(jī),需要解決串行總線的仲裁問題,即在某一個(gè)時(shí)刻只允許一個(gè)主機(jī)占用串行總線。在參考文獻(xiàn)[1]和[4]中,分別采用測(cè)試序列和時(shí)間片的軟件仲裁方法實(shí)現(xiàn),需要占用CPU的處理時(shí)間,且在仲裁過程中有可能受到外部干擾,因此對(duì)軟件編程的可靠性有較高的要求。本設(shè)
計(jì)利用優(yōu)先編碼器74HCl48和譯碼器74HCl38,通過硬件方式進(jìn)行總線仲裁.使仲裁所需時(shí)間大為縮短,可靠性得到提高。
下面著重以n=8個(gè)主機(jī)系統(tǒng)為例說明串行總線硬件仲裁的實(shí)現(xiàn)方法,并將其推廣到n>8的多機(jī)系統(tǒng)中。
1 譯碼器74HCl38功能簡(jiǎn)介
74HCl38是十分常見的三線一八線譯碼器。該譯碼器有3個(gè)輸入A2、Al、A0,它們總共有8種狀態(tài)的組合,可以譯出8個(gè)輸出信號(hào)Y0~Y7。從表1所列的74HCl38真值表中可以看出:當(dāng)STA、STB、STC不滿足使能條件時(shí),Y0~Y7輸出為1,均為無效信號(hào);而當(dāng)74HCl38滿足使能條件時(shí),Y0~Y7其中一個(gè)為0,即有一路有效信號(hào)(由A2、Al、AO決定),其余為1。(74HCl38引腳排列參見圖1)
2 優(yōu)先編碼器74HCl48功能簡(jiǎn)介
74HCl48是八線一三線的優(yōu)先編碼器。該編碼器有8個(gè)信號(hào)輸入端,3個(gè)二進(jìn)制碼輸出端。此外,電路還設(shè)置了輸入使能端EI,輸出使能端EO和優(yōu)先編碼器工作狀態(tài)標(biāo)志GS。從表2所列的74HCl48真值表中可以看出:當(dāng)EI=1時(shí),不論8個(gè)輸入端為何種狀態(tài),3個(gè)輸出端均為高電平,且輸出使能端和狀態(tài)標(biāo)志端均為高電平,編碼器處于非工作狀態(tài);當(dāng)EI=O,且至少有一個(gè)輸入端有編碼請(qǐng)求信號(hào)(邏輯O)時(shí),GS為0,表明編碼器處于工作狀態(tài),否則為1。由真值表可知,在8個(gè)輸入端均無低電平輸入信號(hào)和只有輸入O端(優(yōu)先級(jí)別最低位)時(shí),A2AlAO均為111,此時(shí)可由GS的狀態(tài)加以區(qū)別。當(dāng)GS=1時(shí),表示無輸入信號(hào),A2A1A0=111為非編碼輸出;當(dāng)GS=O時(shí),A2AlA0=111表示響應(yīng)輸入O端為低電平時(shí)的編碼輸出。E0只有在EI為0,且所有輸入端為l時(shí),輸出為0,用于級(jí)聯(lián)。
由表2可知,輸入優(yōu)先級(jí)別的次序依次為17,16,15,14,13,12,11,10。輸入有效信號(hào)為低電平,當(dāng)某一輸入端有低電平輸入,且比它優(yōu)先級(jí)別高的輸入端無低電平時(shí),輸出端才輸出相對(duì)應(yīng)的輸入端的代碼;同時(shí),74HC148的編碼輸出為反碼。例如,當(dāng)17為O時(shí),編碼輸出為000。(74HC148引腳排列參見圖1)
3 硬件仲裁的實(shí)現(xiàn)
利用74HC148和74HCl38可實(shí)現(xiàn)8個(gè)主機(jī)的硬件仲裁,電路原理如圖1所示。該電路以I2C總線芯片(如FM24C64)作為數(shù)據(jù)交換芯片。電路提供3種類型的信號(hào):Ask、Reply、Status。Ask為總線請(qǐng)求信號(hào),Reply為總線請(qǐng)求的返回信號(hào),Status為總線狀態(tài)。從圖1可知,Ask的有效請(qǐng)求信號(hào)為低電平。當(dāng)Ask0~Ask7都為高電平時(shí),GS(Status)輸出為高電平,此時(shí)74HCl38處于無效的工作狀態(tài),Reply0~Reply7均為高電平信號(hào)。只有當(dāng)AskO~Ask7中至少有一個(gè)低電平時(shí),GS(Status)輸出為低電平,使74HCl38處于譯碼狀態(tài),Reply0~Reply7至少有一個(gè)低電平輸出,故Starus為低電平表示總線被占用。
每個(gè)主機(jī)需要提供3個(gè)I/O口作為控制線和狀態(tài)線用于總線仲裁,2個(gè)I/0口用于讀寫I2C總線。
以CPUA為例,當(dāng)CPUA需要占用總線時(shí),首先檢查Status的狀態(tài),若為高電平,說明總線沒有被占用,若為低電平,說明總線已被占用;當(dāng)CPU沒有占用總線時(shí),CPUA可以發(fā)出總線申請(qǐng)信號(hào)(將Ask0置為低電平)。此時(shí),也有可能有多個(gè)CPU同時(shí)發(fā)出總線申請(qǐng)信號(hào),但只有優(yōu)先級(jí)別最高的CPU申請(qǐng)有效。因此,CPUA隨即檢查Reply0的電平,若為低電平,則說明成功申請(qǐng)到總線,可以對(duì)I2C總線進(jìn)行數(shù)據(jù)操作;否則,總線被其他CPU所占用,需要在Status為高電平時(shí)繼續(xù)申請(qǐng)。
以圖1為例,其中CPUH的優(yōu)先級(jí)最高。必須說明的是,由于74HCl48輸出的編碼為反碼,當(dāng)74HCl48的17輸入為低電平時(shí),編碼輸出應(yīng)為000,經(jīng)74HC138譯碼輸出Y0為低電平。同樣,16對(duì)應(yīng)Yl,依此類推。
CPU在發(fā)出申請(qǐng)之后,如果沒有成功獲得總線,就必須立即撤消總線申請(qǐng)信號(hào)(Ask置為高電平),否則將影響其他CPU的總線申請(qǐng);如果成功獲得總線,則在完成數(shù)據(jù)處理后,也必須立即撤消總線申請(qǐng)信號(hào)。
有關(guān)的軟件編程也是相當(dāng)簡(jiǎn)單的,以MCS51單片機(jī)為例;
在軟件方面,還需要對(duì)I2C芯片(如FM24C64,8 KB)的地址空間進(jìn)行分配。可以根據(jù)需要給每一個(gè)主機(jī)分配一個(gè)連續(xù)的地址空間,空間大小可以不等,例如CPUA獲得AddrA的地址空間。在AddrA中,再進(jìn)行細(xì)分,例如CPUC與CPUA通信的地址為AddrAC。當(dāng)CPUC需要傳送數(shù)據(jù)給CPUA時(shí),只需將數(shù)據(jù)寫入AddrAC的地址中,而由CPUA在獲得總線后讀取AddrAC的數(shù)據(jù),從而完成數(shù)據(jù)傳送的過程。使用I2C芯片作為數(shù)據(jù)芯片,必須保證在每一個(gè)CPU沒有獲得總線的情況下,對(duì)應(yīng)的SDA和SCL口線保持為高電平。
圖l可用于主機(jī)數(shù)量小于或等于8個(gè)的情況。
當(dāng)主機(jī)數(shù)量大于8個(gè)(如16個(gè))時(shí),可以利用2片74HCl48通過級(jí)聯(lián)實(shí)現(xiàn)十六線一四線的優(yōu)先編碼,同時(shí)利用2片74HCl38通過級(jí)聯(lián)實(shí)現(xiàn)四線一十六線譯碼。級(jí)聯(lián)的方法請(qǐng)見參考文獻(xiàn)[5]。必須注意的是,級(jí)聯(lián)后,某個(gè)CPU的Ask和Reply必須是一一對(duì)應(yīng)的。
4 總線預(yù)約
由于8個(gè)主機(jī)的請(qǐng)求線Ask0~Ask7存在不同的優(yōu)先級(jí),當(dāng)系統(tǒng)對(duì)實(shí)時(shí)性能要求較高時(shí),可以通過3個(gè)控制線實(shí)現(xiàn)總線預(yù)約功能。本文以MCS5l系列單片機(jī)CPUA為例說明。
方法一:將Status狀態(tài)線經(jīng)“非”門后接入CPUA外部中斷INTO或INTl(外部中斷設(shè)置為下降沿觸發(fā)),當(dāng)其他高優(yōu)先級(jí)釋放總線后,Status端出現(xiàn)下降沿,使CPUA進(jìn)入中斷,使得CPUA可及時(shí)獲得總線。
方法二:將Reply0接至CPUA的外部中斷INT0或INTl(外部中斷設(shè)置為下降沿觸發(fā)),當(dāng)CPUA需要盡快獲得總線時(shí),將AskO置為低電平;當(dāng)其他高優(yōu)先級(jí)釋放總線后,Reply0即由高電平變?yōu)榈碗娖?,CPUA進(jìn)入中斷,從而獲得總線。
結(jié)語
利用74HCl48和74HCl38組成多主機(jī)系統(tǒng)的硬件仲裁邏輯,電路簡(jiǎn)單、可靠,CPU的處理時(shí)間極短,性能穩(wěn)定。筆者已將該技術(shù)應(yīng)用于實(shí)際的數(shù)據(jù)采集系統(tǒng)中,系統(tǒng)運(yùn)行可靠。在串行芯片的選擇上,鐵電存儲(chǔ)器(FM系列)存儲(chǔ)速度快(I2C總線頻率可達(dá)lMHz,SPI總線頻率可達(dá)25MHz),寫入數(shù)據(jù)沒有延時(shí),讀寫次數(shù)為100億次,低功耗操作,容量大,可以由軟件模擬實(shí)現(xiàn)I2C和SPI總線,適合各種類型的單片機(jī),是十分理想的存儲(chǔ)芯片。