無線傳輸系統(tǒng)中nRF2401芯片數(shù)據(jù)丟失問題的研究
當前,近距離無線通信技術在越來越多的領域中得到應用,凡是布線繁雜或不允許布線的場合,如小型無線網(wǎng)絡、門禁系統(tǒng)、工業(yè)數(shù)據(jù)采集系統(tǒng)、非接觸RF智能卡等,都可以通過無線通信來滿足需求。在大量出現(xiàn)的射頻集成芯片中,由Nordic公司推出的無線收發(fā)一體芯片nRF2401,因其外圍電路簡單、通信速率高、通信質(zhì)量穩(wěn)定可靠、成本低、開發(fā)周期短等優(yōu)點,在無線系統(tǒng)開發(fā)中得到廣泛應用。但該芯片內(nèi)部通信協(xié)議僅包含差錯重傳機制,而沒有考慮實際應用中存在的數(shù)據(jù)丟失問題。本文用丟失重傳機制對其通信協(xié)議進行了擴展,并在用C8051F236微控制器與nRF2401設計的簡單通信電路上,對所提解決方案的正確性加以實驗證明。
1 芯片工作原理
nRF2401工作原理可概括為:一個配置字、兩種通信模式、兩個通道和四種狀態(tài)[1]。
一個配置字:nRF2401的各種參數(shù),都由控制器通過一個3線接口(CLK、DR和DATA)寫入一個單獨的配置寄存器。該配置寄存器共144位,稱為狀態(tài)字。
兩種通信模式:Direct Mode(直接模式)和ShockBurstTM Mode(突發(fā)模式" title="突發(fā)模式">突發(fā)模式)。直接模式的使用與其他傳統(tǒng)射頻收發(fā)器的原理一樣,需要通過軟件在發(fā)送端添加校驗碼和地址碼,在接收端判斷是否為本機地址,并檢查數(shù)據(jù)是否傳輸正確。突發(fā)模式使用芯片內(nèi)部的先入先出堆棧區(qū),數(shù)據(jù)可從低速微控制器送入,高速發(fā)射出去,地址和校驗碼由硬件自動添加和刪除。
兩個通道:控制器與nRF2401通過由CLK、DR和DATA組成的兩個通道交換傳輸數(shù)據(jù),通道1(CLK1、DR1、DATA)可接收和發(fā)送數(shù)據(jù),通道2(CLK2、DR2和DOUT2)只能接收數(shù)據(jù),并且接收頻道2的頻率只有在比頻道1高8MHz的情況下才能保證正確接收。
四種狀態(tài):分別為Active(RX/TX)(激活狀態(tài))、Configuration(配置狀態(tài))、Stand_by(等待狀態(tài))、Power down(掉電狀態(tài)),通過3個引腳PWR_UP、CE、CS控制。
nRF2401工作時,首先置2401為配置狀態(tài),由控制器中寫入狀態(tài)字;而后,在激活狀態(tài)下,使用狀態(tài)字中指定的通道,進行數(shù)據(jù)收發(fā),收發(fā)過程中進行交互時一方進入等待狀態(tài);如全部數(shù)據(jù)都傳送完畢,則進入掉電狀態(tài)。
2 RF協(xié)議擴展
nRF2401在其設計時,把多數(shù)單元如:頻率合成器、晶體振蕩器、調(diào)制器和數(shù)模轉(zhuǎn)換器等都進行了集成,因而外圍電路簡單。其內(nèi)部通信協(xié)議中的差錯重傳機制對發(fā)送的每個數(shù)據(jù)幀" title="數(shù)據(jù)幀">數(shù)據(jù)幀在接收方進行片內(nèi)CRC校驗,以保證接收數(shù)據(jù)的正確性。但在實際應用中[2],往往因為各種因素,如來自應用電路和外界的噪聲干擾,或者元器件老化導致的信號衰減等,導致傳輸過程中的數(shù)據(jù)丟失。
為有效解決上述問題,可用丟失重傳機制對其通信協(xié)議加以擴展,即由發(fā)送方對數(shù)據(jù)進行預封裝處理。具體做法是:發(fā)方將待發(fā)送數(shù)據(jù)分組,計算出每組的CRC校驗值,封裝于預先定義好的包內(nèi),分若干幀發(fā)送出去。收方要對每次接收到的數(shù)據(jù)幀及發(fā)方定義的數(shù)據(jù)包進行兩次CRC校驗,通過幀CRC校驗確認接收數(shù)據(jù)的正確性,通過包CRC校驗判斷是否發(fā)生數(shù)據(jù)包丟失。在丟失發(fā)生的情況下,收方有3次請求重傳的機會,收發(fā)雙方用ACK信號進行交互。
2.1 數(shù)據(jù)分組
將待發(fā)送數(shù)據(jù)進行分組時,要考慮兩個因素:數(shù)據(jù)幀的格式及狀態(tài)字設置。在突發(fā)傳遞模式下,nRF2401的數(shù)據(jù)幀格式如表1。
其中,幀頭Pre-amble、收方地址address、crc分別占8、32、16位,由于突發(fā)模式下數(shù)據(jù)幀長度不能超過256位,所以數(shù)據(jù)部分Payload的最大長度是:256-(Pre-amble:8位+Address:32位+CRC:16位)=200位(25B),即每幀的payload部分可以為1~25B。下面的實驗中,由狀態(tài)字設置數(shù)據(jù)部分長度為20B。所以,對待傳送數(shù)據(jù)分組時,每組長度取20B的整數(shù)倍。本系統(tǒng)按每組60B進行分組。其中,高58位為數(shù)據(jù),兩個低字節(jié)用于存放由58B數(shù)據(jù)計算出的CRC校驗值。這樣,每個數(shù)據(jù)包(組)分3個數(shù)據(jù)幀發(fā)送。
需要指出的是,在每次發(fā)送完一個數(shù)據(jù)封裝包后,收發(fā)雙方的交互要進行兩次收發(fā)狀態(tài)的轉(zhuǎn)換,會占用數(shù)據(jù)傳輸?shù)臅r間,但nRF2401有一個優(yōu)勢在于:它只需要改變配置字的最低位RXEN就可進行收發(fā)方式(RXEN=0 TX;RXEN=1 RX)轉(zhuǎn)換,而不必重置整個配置字。每進行一次轉(zhuǎn)換,需要控制器通過CE、CS引腳改變nRF2401的工作狀態(tài),由nRF2401的時序可知,會有兩個最長5μs的延時,兩次狀態(tài)轉(zhuǎn)換共有20μs的延時。由于實際應用中一次傳輸?shù)臄?shù)據(jù)量比較少,而且數(shù)據(jù)丟失發(fā)生的幾率很小,所以不會對傳輸速度有太大的影響。
2.2 適用范圍
不同的應用,需要一次性傳輸?shù)臄?shù)據(jù)量也不同,上述方法適用于傳輸數(shù)據(jù)量為KB以上的情況。為了減少發(fā)生數(shù)據(jù)丟失時重傳的代價,當傳輸數(shù)據(jù)量少于KB時,可以按實際情況,調(diào)整狀態(tài)字中設置的Payload段的長度,對數(shù)據(jù)進行靈活分組。例如:如果待傳輸數(shù)據(jù)為560B,可以設置Payload段的長度為10B,按每組30B封裝,這樣,所有數(shù)據(jù)分20個組,分60幀傳送完畢。
另外,如果待傳輸數(shù)據(jù)量為100B左右,顯然沒有分組的必要,但為了保證不發(fā)生數(shù)據(jù)丟失,可以在封裝時去掉CRC段,加一個1B的head字段,作為傳輸數(shù)據(jù)的序號,每個封裝包用1個數(shù)據(jù)幀發(fā)送。接收端通過檢查head字段,確定是否發(fā)生數(shù)據(jù)丟失。
3 實驗設計
3.1 硬件設計
硬件實現(xiàn)電路如圖1。由單片機C8051F236控制nRF2401進行數(shù)據(jù)傳輸。由于單片機與nRF2401的供電電壓分別為1.9~3.6V和5V,設計中采用MAX232芯片進行電平轉(zhuǎn)換。另外,在發(fā)送端和接收端采用幾乎完全對稱的設計。
將C8051F236的P2.5、P2.6、P2.7配置為通用I/O引腳[3],與nRF2401的CE、CS、PWR_UP連接,控制nRF2401的工作狀態(tài)。系統(tǒng)上電時,首先置nRF2401為配置狀態(tài),寫入狀態(tài)字。隨后置nRF2401為激活方式。P0.2-0.7也配置成通用I/O引腳,與nRF2401的CLK1、DR1、DATA(通道1)、CLK2、DR2、DOUT2(通道2)連接,進行數(shù)據(jù)收發(fā)。當需要發(fā)送數(shù)據(jù)時,單片機置CE為1,通過通道1將數(shù)據(jù)寫入nRF2401,而后置CE為0,由nRF2401將數(shù)據(jù)發(fā)送出去。如果封裝包的所有數(shù)據(jù)都發(fā)送完畢,切換到接收狀態(tài)。接收方用兩個通道同時接收數(shù)據(jù)。
3.2 軟件設計
程序開始時對C8051F236及nRF2401狀態(tài)字進行配置,隨后進入激活方式。本系統(tǒng)狀態(tài)字配置接收端值為:0x8E08.1CA0.A000.0000.00CC.0000.0000.CC23.CF41。配置后nRF2401每次發(fā)送的數(shù)據(jù)長度為160bit(20B),地址段長度32bit,通道1、2硬件地址0xCC,16位CRC校驗段,以突發(fā)模式進行雙通道接收,通信速率250Kbps,晶振頻率16MHz,輸出功率0dBm,工作頻段2440~2448MHz,接收狀態(tài)。發(fā)送端值為:0x8E08.1CA0.A000.0000.00CC.0000.0000.CC23.CF40,發(fā)送狀態(tài)。
進入激活狀態(tài)后,收發(fā)雙方行為描述如下:
第一步:定義一個數(shù)據(jù)包結構,發(fā)方將待發(fā)送數(shù)據(jù)分組,計算出數(shù)據(jù)包CRC校驗值,然后將數(shù)據(jù)封裝、發(fā)送。發(fā)送完一個封裝包(共60B)后,停止發(fā)送,切換到接收狀態(tài),等待ACK信號到來。收方接收完一個封裝包后,切換到發(fā)送狀態(tài),同時計算接收到的數(shù)據(jù)包的CRC校驗值,如果與包內(nèi)的CRC值相符,則說明數(shù)據(jù)接收正確,收方置ACK值為0;如不一致,則說明發(fā)生數(shù)據(jù)包丟失,收方置ACK值為1。
第二步:收方發(fā)送ACK信號給發(fā)方,發(fā)方根據(jù)ACK值決定繼續(xù)發(fā)送數(shù)據(jù)包(ACK=0)還是重新發(fā)送數(shù)據(jù)包(ACK=1)。
第三步:收發(fā)雙方再次重新配置,繼續(xù)數(shù)據(jù)傳輸。
第四步:在發(fā)生數(shù)據(jù)包丟失的情況下,收方對要求重發(fā)次數(shù)用count進行計數(shù),如果三次重發(fā)請求所收到的數(shù)據(jù)仍不正確,則不再要求重發(fā),切換到Stand_by狀態(tài)。
軟件流程圖如圖2。
數(shù)據(jù)包可定義為結構體:
Struct PACKAGE {
Char head;//1B數(shù)據(jù)序號(可選)
Char DATA[57];//58B數(shù)據(jù)
Char CRC[1];//2BCRC校驗值
……
} package;
除收發(fā)程序外,收發(fā)雙方對包封裝、包檢測及包的CRC值計算定義相應的函數(shù)。發(fā)方對數(shù)據(jù)分組時,如未發(fā)送數(shù)據(jù)不足60B,則在高位補0。
3.3 實驗與結果分析
向單片機中載入程序后,nRF2401工作模式配置為雙通道突發(fā)模式,控制程序采用C語言編寫。用評估參數(shù)BLER(塊錯誤),對實驗中數(shù)據(jù)傳輸過程中的數(shù)據(jù)丟失情況進行評估:
BLER=丟失塊數(shù)/傳輸?shù)目倝K數(shù)
實驗方案:在允許的距離范圍(10~30米)內(nèi),分不同傳輸距離,分別發(fā)送1000個數(shù)據(jù)包,每個距離發(fā)送3次,BLER值取3次的平均值。為了進一步說明問題,首先以未擴展的協(xié)議進行收發(fā),然后再以擴展協(xié)議進行收發(fā),并分別記下相應BLER值。實驗數(shù)據(jù)如表2。
由表2可知,進行協(xié)議擴展后,BLER值僅為0.0%~0.14%,這充分說明本文提出的協(xié)議擴展方法能夠?qū)崿F(xiàn)更加可靠的數(shù)據(jù)傳輸。實驗時數(shù)據(jù)傳輸速度為120kbps,主要原因是受單片機讀寫速度的限制,更換高速單片機可提高傳輸速率。
本文用擴展協(xié)議的方法,解決了無線收發(fā)芯片nRF2401在實際應用中存在的數(shù)據(jù)丟失問題。實驗結果表明,本文給出的方法可以有效提高nRF2401無線傳輸?shù)目煽啃?,傳輸速率符合不同應用領域的要求,而且該方法具有通用性和靈活性的特點,可在nRF2401芯片的所有應用及其他無線通信系統(tǒng)中推廣。