1 引言
1553B總線是美國軍用標準MIL-STD-1553B定義的一種串行總線的傳輸形式。由美國于20世紀70年代提出,總線的組成包括一個總線控制器(BC),若干個(最多31個)遠程終端(RT),如果需要的話還可以加上負責監(jiān)視總線信息的總線監(jiān)視器(BM),1553B總線通訊之所以得到如此廣泛的應用,就是其具有以下特點:
(1)強調實時性,1553B的傳送速率為1Mb/s,傳輸速率快。
(2)1553B總線按指令/響應的方式異步操作,即總線上所有的消息傳輸都由總線控制器發(fā)出的指令來控制,相關終端對指令應給予回答并執(zhí)行操作。這種方式非常適合集中控制的分布式處理系統(tǒng)。
(3)1553B總線是雙冗余的傳輸線,總線都是雙備份的,如果總線通訊不通,系統(tǒng)將會根據BC初始化時候的設定自動選擇通訊重試,增強了系統(tǒng)的可靠性。
總線控制器是總線信息通訊的發(fā)起者和組織者,因此對BC控制的好壞將直接影響到總線通訊的質量。
2 總線的控制方法設計
總線控制器是總線信息通訊的發(fā)起者,同時總線上所有信息的傳輸又均由BC來控制和激勵,其簡單的通訊過程為:BC向RT(或多個RT)發(fā)送一個發(fā)送或者接收指令,如果為接收指令,指令后會攜帶需要RT接收的數據字,RT接收到命令字后,在給定的相應時間范圍內返回一個狀態(tài)字,并執(zhí)行相應動作。如果為發(fā)送指令,RT只需接收BC發(fā)送的數據字,然后返回狀態(tài)即可。
在1553B總線上通訊的信息多種多樣,所以針對不同的背景要有不同的總線設計方法,對于結構單一、數據量較少系統(tǒng),總線上數據的活動不是很頻繁,可以采取比較簡單的方法:對周期性傳輸的消息采用固定周期來定時傳輸,對一次性消息采用命令插入的方式,要求RT返回數據的采用查詢方式向RT的子地址下達命令字來獲取數據。
如果通訊比較復雜,甚至有多個RT時,這時再采用上面的方式就使得BC需要同時發(fā)送大量命令字來查詢多個RT的子地址,這樣勢必給通訊帶來沉重負擔,因此可以采用另外一種矢量字方式,將發(fā)送消息的主動權交還給發(fā)送方(RT),具體的實現(xiàn)方法就是:RT在接收到BC的命令之后,完成相應動作(例如自檢),動作完成后將數據字寫到相應的子地址BUF中,然后按照協(xié)議構造矢量字,再把矢量字發(fā)送到RT的0/31號子地址(只能是0或31號子地址),BC在發(fā)送完一次性消息后就可以向0/31號字地址發(fā)命令字,然后讀得該子地址內存放的矢量字,然后根據協(xié)議解析矢量字,從而向從矢量字中得到的子地址發(fā)送命令,從而得到BC想要得到的RT數據。這樣處理既可保證通訊數據量明顯較小,又可以保證消息傳輸實時性,同時又使軟件的設計具有更多的靈活性。
為了保證1553B通訊能夠適應更多更復雜的情況,BC還提供了很多特殊的功能給用戶,使用戶可以根據自己的需求來使用這些特殊功能,以滿足特殊的系統(tǒng)要求:
(1)自動重試:BC進行初始化的時候可以進行設定,根據需求來設定BC的重試條件。
(2)動態(tài)總線控制:總線控制器向一個有執(zhí)行總線控制能力的遠程終端發(fā)送一個轉讓控制的指令字,如果遠程終端接受總線控制,總線控制權就交給了這個遠程終端。
(3)啟動自檢測:總線控制器可以用指令使遠程終端激活其內部的自檢電路。
3 總線控制器的軟件設計
由于BC在總線上面的特殊性,其軟件設計的好壞將直接影響整個系統(tǒng)通訊的流暢、可靠,軟件設計歸結起來有以下幾個注意的地方:
(1)中斷方式的選擇:對于總線消息而言,都是總線控制器將這些消息組織成一個一個的總線幀來傳輸的,一幀也就是平時說的一個總線周期。在設計軟件中斷時可以采用單個消息觸發(fā)一次中斷,也可以選擇一個總線周期進一次中斷,當然最快的就是單個消息就進入中斷,這樣可以保證每個消息結束后就能夠馬上得到處理,實時性好。但是每條消息都執(zhí)行中斷程序無疑對軟件運行效率也是有影響的,所以減少中斷次數對軟件系統(tǒng)還是有利的,但是減少進中斷次數又是以犧牲系統(tǒng)實時性為代價的,兩者相比較筆者建議如果通訊數據量不是很大的情況下盡量采用單條消息中斷的方式,同時盡量簡化中斷程序執(zhí)行的代碼,提高程序的效率。如果有多個RT且數據量很大,可以考慮一個周期進行一次中斷。
(2)總線的重試與消息重復:當消息中出現(xiàn)狀態(tài)地址錯,字計數錯,同步類型錯,校驗錯時總線會進行標記,所以設計程序時應當打開錯誤檢測位。同時由于1553B總線是多余度總線,當某一個總線出現(xiàn)差錯時,系統(tǒng)會根據設定在另外一個BUS上重試,也可以在本條總線重試,所以在程序設計時要靈活運用。然而對總線上的廣播消息,由于這類消息沒有狀態(tài)返回,因此總線重試的意義在這里就沒有了。
(3)避免沖突:總線設計必須考慮到各個終端的響應及處理,在安排通訊時應該避免對同一終端地址連續(xù)發(fā)送總線消息(針對同一子地址的連續(xù)消息發(fā)送除外),由于大多數終端的通訊處理是在中斷情況下進行的,如果連續(xù)發(fā)送則有可能使終端丟失消息或者處理沖突,所以總線要給同一終端留下足夠的處理時間。
下面是筆者編寫的總線控制器程序中的部分代碼:
////////////中斷函數////////////////////
ViInt32 _stdcall demo_rt_watch_function(ViUInt32 cardnum,ViUInt16 chnum,struct api_int_fifo *sIntFIFO)
{ ViUInt32 tail; // FIFO Tail index
ViUInt32 messno,wordcount,i=0,j=0; // Message number to be updated
ViStatus hr;
API_BC_MBUF api_message;
ViUInt16 rtaddr,subaddr,transrec;
API_RT_MBUF_READ mbuf;
/***********************************************
* Loop on all entries in the FIFO. Get the tail pointer and extract
* the FIFO entry it points to. When head == tail FIFO is empty
******************************************/
tail = sIntFIFO->tail_index;
while (tail != sIntFIFO->head_index )
{
// Extract the buffer ID from the FIFO and read the message from the board
messno = sIntFIFO->fifo[tail].bufferID;
if (sIntFIFO->fifo[tail].event_type==EVENT_BC_MESSAGE)
{
hr=Eph6273_BC_MessageRead(
cardnum,
// (i)card number (0 - based)
chnum,
// (i)channel number (0 - based)
messno,
// (i)index of BC message to read
&api_message);
// (o)user's buffer to write message into
tail++;
// Next entry
tail &= sIntFIFO->mask_index;
// Wrap the index
sIntFIFO->tail_index = tail;
// Save the index
}
return API_SUCCESS;
}
4 1553B總線系統(tǒng)連接與調試
1553B總線采用雙鉸屏蔽線傳輸,當終端離總線很近時(<0.3米)可以直接通過隔離變壓器與總線連接,當終端離總線較遠(最遠不應超過6.1米)時要在變壓器與總線之間插入耦合器。這兩種方式比較變壓器耦合具有更好的抗干擾能力,能用在長距離的通訊上,而直接耦合不利于RT故障的隔離,會因為某一個RT故障造成系統(tǒng)網絡的通訊不正常。圖1就是一個簡單的系統(tǒng)連接圖,當然設計者可以根據系統(tǒng)需求在總線上連接更多的終端,也可以掛總線監(jiān)視器用以監(jiān)視總線信息。
圖1 簡單的1553B系統(tǒng)連接圖
系統(tǒng)連接完成之后就要對系統(tǒng)進行通訊調試,系統(tǒng)調試是一項至關重要的工作,程序設計和系統(tǒng)連接中的問題都會在這個時候一一的暴露出來,這時對設計人員的實際處理問題能力和經驗提出了要求,結合自己的經驗對系統(tǒng)調試提出以下幾點建議:
(1)系統(tǒng)連接完成之后不要急于加電,斷開連接,用導線引出BC端的正負兩個管腳,接在示波器上,讓BC發(fā)送一些簡單的數據,然后用示波器監(jiān)視讀取這些數據看是否正確,1553B總線上面的信息是以消息的形式調制成曼徹斯特碼進行傳輸的,邏輯1是編碼的1/0,邏輯0是編碼的0/1。命令字和狀態(tài)字的開頭是前1.5位時為正后1.5位時為負的同步頭,數據字是前1.5位時為負后1.5位時為正的同步頭,同步頭后面就是數據。據此可以分析波形確定數據。圖2為實驗中抓下的一條全0的命令字,前面先高后低的3個字位為同步頭,代表了命令字(狀態(tài)字的同步頭也是這樣),后面16位為指令字的數據,最后一位奇偶校驗位為0表示為奇校驗。
這樣做的目的是保證BC發(fā)出的數據是基本正確的(包括時序和電平高低),設計人員構建系統(tǒng)的1553B芯片或板卡可能來自不同的廠家,甚至有自己單位研制的,這樣可以避免出現(xiàn)一些例如正負管腳接反等低級錯誤。
(2)系統(tǒng)調試要先易后難,1553B通訊的消息類型多種多樣,有非周期發(fā)送數據,也有非周期性發(fā)送命令字讀取數據,有周期性發(fā)送的數據,也有周期性發(fā)送命令讀取數據,也有這幾種方式的組合。我們在調試時候應當先調試簡單的單獨通訊模式,BC發(fā)送一個數據字測試RT是否能收到,RT返回的數據BC是否能收到,收到的數據是否正確等。簡單的調通后進而調試組合的等比較麻煩的通訊。另外調試時應多用芯片自帶的例子程序來幫助調試,這樣能起到意想不到的效果。
(3)調試時還應當注意一些關鍵性的細節(jié)。例如系統(tǒng)單獨運行正常,但是連接起來通訊就不正常了,考慮是否是沒有進行地址校驗導致的,或者是中斷服務程序中內容過多導致中斷處理時間過長而耽誤了通訊。
圖2 命令字波形圖
5 結束語
1553B通訊比較復雜,設計和調試都存在不小的困難,本文結合自己調試1553B系統(tǒng)的一些經驗和教訓和大家進行了分享,希望能夠為相關的設計人員提供一點幫助。