1553B總線控制器設計與調試
(2)總線的重試與消息重復:當消息中出現(xiàn)狀態(tài)地址錯,字計數(shù)錯,同步類型錯,校驗錯時總線會進行標記,所以設計程序時應當打開錯誤檢測位。同時由于1553B總線是多余度總線,當某一個總線出現(xiàn)差錯時,系統(tǒng)會根據(jù)設定在另外一個BUS上重試,也可以在本條總線重試,所以在程序設計時要靈活運用。然而對總線上的廣播消息,由于這類消息沒有狀態(tài)返回,因此總線重試的意義在這里就沒有了。
(3)避免沖突:總線設計必須考慮到各個終端的響應及處理,在安排通訊時應該避免對同一終端地址連續(xù)發(fā)送總線消息(針對同一子地址的連續(xù)消息發(fā)送除外),由于大多數(shù)終端的通訊處理是在中斷情況下進行的,如果連續(xù)發(fā)送則有可能使終端丟失消息或者處理沖突,所以總線要給同一終端留下足夠的處理時間。
下面是筆者編寫的總線控制器程序中的部分代碼:
////////////中斷函數(shù)////////////////////
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)網(wǎng)絡的通訊不正常。圖1就是一個簡單的系統(tǒng)連接圖,當然設計者可以根據(jù)系統(tǒng)需求在總線上連接更多的終端,也可以掛總線監(jiān)視器用以監(jiān)視總線信息。
評論