許亞星,門 茜,曹艷梅,王 琳
(中國航空計算技術(shù)研究所,陜西 西安 710065)
為了提高系統(tǒng)的接口負(fù)載能力,常采用FPGA+CPU架構(gòu)進(jìn)行系統(tǒng)控制。其中FPGA負(fù)責(zé)統(tǒng)一管理硬件接口,將硬件采集的數(shù)據(jù)處理后放在特定地址或空間,由CPU通過數(shù)據(jù)總線和地址總線讀取數(shù)據(jù),進(jìn)一步進(jìn)行控制處理。FPGA也可以管理多路422總線,為每一路422總線創(chuàng)建特定的硬件FIFO空間,進(jìn)行數(shù)據(jù)收發(fā)時,首先將要發(fā)送的數(shù)據(jù)放在對應(yīng)的硬件FIFO中,然后統(tǒng)一進(jìn)行發(fā)送處理。當(dāng)要發(fā)送的數(shù)據(jù)量超過硬件FIFO的大小時,可能會造成發(fā)送數(shù)據(jù)的丟失,進(jìn)一步造成通信故障。本文提出了一種422總線超額發(fā)送方法,即當(dāng)要發(fā)送的數(shù)據(jù)量超過FIFO大小時,不用更改FIFO大小,同時保證數(shù)據(jù)發(fā)送的完整性。
RS422是一種全雙工串行異步通信,因為沒有統(tǒng)一參照的時鐘,通信雙方需要約定好固定的通信格式,包括通信周期、通信長度、包頭、校驗和、波特率、校驗方式、停止位方式等。422通信的基本單位是數(shù)據(jù)幀,數(shù)據(jù)幀包含起始位、數(shù)據(jù)位、校驗位、停止位,如圖1所示。若干數(shù)據(jù)幀組成數(shù)據(jù)包,數(shù)據(jù)包長度和內(nèi)容按照通信協(xié)議規(guī)定,數(shù)據(jù)包構(gòu)成通信雙方單次通信的內(nèi)容[1]。
圖1 數(shù)據(jù)幀格式
FPGA可以管理多路422通信,將通信結(jié)果放在特定地址供CPU進(jìn)行讀寫。FPGA在內(nèi)部為每一路422搭建串口控制器軟核,通過軟核控制與外部422的通信。FPGA為CPU開放串口控制器軟核配置寄存器地址,CPU通過對寄存器進(jìn)行配置,可以實現(xiàn)與不同類型的422進(jìn)行通信[2]。串口控制器軟核控制寄存器的定義如表1所示。
表1 串口控制器軟核控制寄存器定義
其中,接收緩沖寄存器用于保存剛收到的數(shù)據(jù),發(fā)送保持寄存器用于保存將要發(fā)送的數(shù)據(jù)。波特率發(fā)生器是一個16位的計數(shù)器,用于生成發(fā)送器的傳輸數(shù)據(jù)速率,可通過分頻因子寄存器(DLM&DLL)對其進(jìn)行編程設(shè)置,DLL分頻因子寄存器用于設(shè)置分頻因子的低8位,DLM分頻因子寄存器用于設(shè)置分頻因子的高8位。中斷使能寄存器用于設(shè)置串行通道的中斷功能,通過置位中斷使能寄存器相應(yīng)的位可以分別使能串行通道的6個中斷源。中斷標(biāo)識寄存器用于指示當(dāng)前是否存在一個未決中斷以及這個中斷的類型。FIFO控制寄存器用來實現(xiàn)使能和清空FIFO的功能。線控制寄存器用于定義串口通訊中的數(shù)據(jù)傳輸格式,包括校驗使能、校驗方式、停止位個數(shù)、數(shù)據(jù)位個數(shù)等。調(diào)制解調(diào)器控制寄存器用于控制串行通道/調(diào)制解調(diào)器模式的接口信號,或者用于特殊功能的輸入輸出信號。線狀態(tài)寄存器用于標(biāo)識主處理器與本控制器之間的數(shù)據(jù)傳輸狀態(tài),主機(jī)可以通過讀取線狀態(tài)寄存器得到接收和發(fā)送的情況。FIFO觸發(fā)登記寄存器用于設(shè)置接收FIFO的觸發(fā)等級[3]。
使用軟核進(jìn)行串行通信的時候,首先需要對軟核進(jìn)行初始化,進(jìn)行初始化時,按照串口控制器軟核寄存器的位定義,依次對LCR、FCR、LSR、DLL/DLM、IER、MSR、MCR進(jìn)行初始化配置。初始化配置完成后,就可以進(jìn)行讀接收操作和寫發(fā)送操作[4]。
進(jìn)行讀接收數(shù)據(jù)操作時,首先讀LSR(1)線狀態(tài)寄存器,判斷自上次接收數(shù)據(jù)是否發(fā)生了硬件FIFO溢出;然后讀LSR(0)線狀態(tài)寄存器,判斷是否接收數(shù)據(jù)準(zhǔn)備好;最后讀RBR接收緩沖寄存器或接收FIFO中的數(shù)據(jù),完成讀接收數(shù)據(jù)操作。
進(jìn)行寫發(fā)送數(shù)據(jù)操作時,首先讀LSR(5)線狀態(tài)寄存器,判斷控制器中THR或發(fā)送FIFO是否為空;然后寫數(shù)據(jù)到THR發(fā)送保持寄存器或發(fā)送FIFO中,完成寫發(fā)送數(shù)據(jù)操作[5]。
按照上述步驟進(jìn)行寫發(fā)送操作通信時,判斷發(fā)送FIFO為空后,一次性將要發(fā)送的數(shù)據(jù)寫進(jìn)發(fā)送FIFO中,但當(dāng)要發(fā)送的數(shù)據(jù)量超過發(fā)送FIFO大小時,會造成發(fā)送數(shù)據(jù)丟失,進(jìn)一步導(dǎo)致通信失敗。在不改變硬件FIFO大小的情況下,對寫操作進(jìn)行適當(dāng)改進(jìn),可以實現(xiàn)固定硬件FIFO的超額發(fā)送。
假設(shè)硬件發(fā)送FIFO大小為128字節(jié),要發(fā)送的數(shù)據(jù)量為200字節(jié),超過硬件FIFO大小,直接寫入FIFO時,會丟失128字節(jié)以外的數(shù)據(jù)。進(jìn)行寫操作時,可以在第一步和第二步操作間增加一個操作,增加判斷要發(fā)送的數(shù)據(jù)是否大于128,當(dāng)發(fā)送數(shù)據(jù)小于128時,可以將發(fā)送數(shù)據(jù)直接寫入硬件發(fā)送FIFO,當(dāng)發(fā)送數(shù)據(jù)大于128時,可以在每次寫入發(fā)送FIFO前,都判斷一次硬件FIFO是否為空,如果為空,則寫入,如果不為空,則進(jìn)行循環(huán)等待,直至硬件FIFO有空余。
用如上方法對寫發(fā)送操作進(jìn)行改進(jìn)后,經(jīng)過試驗,可以在不改變硬件發(fā)送FIFO大小的情況下,實現(xiàn)數(shù)據(jù)量大于硬件FIFO的超額發(fā)送。
本文提出的基于FPGA串口軟核控制器的RS422超額發(fā)送方法,解決了發(fā)送數(shù)據(jù)量依賴硬件FIFO大小的問題,實現(xiàn)了不改變硬件FIFO的情況下,可以發(fā)送大于硬件FIFO大小的數(shù)據(jù)量,提高了RS422通信的靈活性。