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