無線射頻與MAC層_第1頁
無線射頻與MAC層_第2頁
無線射頻與MAC層_第3頁
無線射頻與MAC層_第4頁
無線射頻與MAC層_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第5章無線射頻與MAC層1本章目標掌握RF內(nèi)核結構掌握FIFO訪問掌握CC2530無線發(fā)送模式掌握CC2530無線接收模式掌握程序設計方法2本章目標掌握RF內(nèi)核結構掌握FIFO訪問掌握CC2530無線發(fā)送模式掌握CC2530無線接收模式掌握程序設計方法3CC2530是兼容標準射頻模塊的片上系統(tǒng)

5.1概述4RF內(nèi)核控制無線射頻模塊,并且在MCU和無線電之間提供一個接口,可以發(fā)出命令,讀取狀態(tài)和自動對無線電事件排序。RF內(nèi)核包括以下幾局部:無線電控制狀態(tài)模塊〔FSM〕、調(diào)制器,解調(diào)器、幀過濾和源匹配、頻率合成器〔FS〕、命令選通處理器,定時器2〔MAC定時器〕5.2RF內(nèi)核FSM模塊的主要功能包括控制RF收發(fā)器的狀態(tài)、發(fā)送和接收FIFO,以及大局部動態(tài)受控的模擬信號,比方模擬模塊的上電/掉電調(diào)制器:將原始數(shù)據(jù)轉(zhuǎn)換為I/Q〔同相/正交〕信號發(fā)送到發(fā)送器DAC,并且遵守標準解調(diào)器:負責從收到的信號中檢索無線數(shù)據(jù)。解調(diào)器的振幅信息由自動增益控制使用,自動增益控制調(diào)整模擬LAN的增益,使接收器內(nèi)的信號水平大約是個常量。5RF內(nèi)核控制無線射頻模塊,并且在MCU和無線電之間提供一個接口,可以發(fā)出命令,讀取狀態(tài)和自動對無線電事件排序。RF內(nèi)核包括以下幾局部:無線電控制狀態(tài)模塊〔FSM〕、調(diào)制器,解調(diào)器、幀過濾和源匹配、頻率合成器〔FS〕、命令選通處理器,定時器2〔MAC定時器〕5.2RF內(nèi)核幀過濾和源匹配:其功能是支持RF內(nèi)核中的FSM模塊來執(zhí)行幀過濾和源地址匹配。頻率合成器:其功能是為RF信號產(chǎn)生載波。命令選通處理器:處理CPU所發(fā)出的命令。它包含一個24字節(jié)的程序存儲器,可以自動執(zhí)行CSMA/CA機制。6RF內(nèi)核控制無線射頻模塊,并且在MCU和無線電之間提供一個接口,可以發(fā)出命令,讀取狀態(tài)和自動對無線電事件排序。RF內(nèi)核包括以下幾局部:無線電控制狀態(tài)模塊〔FSM〕、調(diào)制器,解調(diào)器、幀過濾和源匹配、頻率合成器〔FS〕、命令選通處理器,定時器2〔MAC定時器〕5.2RF內(nèi)核無線電RAM:為發(fā)送TXFIFO和接收RXFIFO分別分配128字節(jié)的FIFO,為幀過濾和源匹配存儲參數(shù)保存128字節(jié)。定時器2〔MAC定時器〕:用于為無線電事件計時,以捕獲輸入數(shù)據(jù)包的時間戳,這一定時器在睡眠模式下也保持計數(shù)。7RFERR中斷RF中斷5.2.1中斷CC2530無線射頻的工作涉及到CPU兩個中斷向量8RFERR中斷其功能是表示無線射頻的錯誤情況,無線射頻內(nèi)核錯誤表現(xiàn)為RFTXRFIO下溢或RXFIFO溢出,通過控制SFR存放器的IEN0.RFERRIE位使能。并且在TCON.RFERRIF保存了RFERR中斷標志位〔即是否發(fā)生中斷〕,5.2.1中斷RFERR中斷95.2.1中斷IEN0.RFERRIE//使能RF內(nèi)核錯誤中斷IEN0|=0x01;RFERR中斷105.2.1中斷TCON.RFERRIF中斷標志//判斷RFERRIF中斷是否發(fā)生if〔RFERRIF=1〕{}RFERR中斷115.2.1中斷RF中斷RF中斷其功能是數(shù)據(jù)發(fā)送和接收中斷。RF中斷是上升沿觸發(fā)的,通過控制SFR存放器的IEN2.RFIE位使能,并且在S1CON.RFIF保存了RFIF中斷標志位125.2.1中斷RF中斷IEN2.RFIE//使能RF中斷IEN2|=0x01;135.2.1中斷RF中斷S1CON.RFIF中斷標志//判斷RF一般中斷是否發(fā)生if((RFIF_1=1)&(RFIF_2=1)){…}145.2.2中斷存放器RF內(nèi)核的兩個中斷源〔RFERR和RF〕,是RF內(nèi)核中假設干中斷源的組合,其中每個單獨的中斷源在RF內(nèi)核中有自己的中斷屏蔽存放器和中斷標志存放器。中斷屏蔽存放器中斷標志存放器155.2.2中斷存放器中斷屏蔽存放器RF中斷屏蔽存放器RFIRQM0RF中斷屏蔽存放器RFIRQM1RF錯誤中斷屏蔽存放器RFERRM165.2.2中斷存放器中斷屏蔽存放器RF中斷屏蔽存放器RFIRQM0//RXPKTDONE中斷位使能RFIRQM0|=(1<<6);175.2.2中斷存放器中斷屏蔽存放器RF中斷屏蔽存放器RFIRQM1//TXPKTDONE中斷位使能RFIRQM1|=(1<<1);185.2.2中斷存放器中斷屏蔽存放器RF錯誤中斷屏蔽存放器RFERRM195.2.2中斷存放器中斷標志存放器RFIRQF0RFIRQF1錯誤中斷標志存放器RFIERRF205.2.2中斷存放器中斷標志存放器RFIRQF0//判斷RF一般中斷是否發(fā)生if((RFIRQF0&0x40){…}215.2.2中斷存放器中斷標志存放器RFIRQF1225.2.2中斷存放器中斷標志存放器RFIERRF

235.3FIFO訪問CC2530發(fā)送或接收數(shù)據(jù)是通過FIFO操作來進行的。FIFO訪問可以分為TXFIFO訪問和RXFIFO訪問,其操作都是通過SFR存放器的RFD操作進行。當寫入RFD存放器時,數(shù)據(jù)被寫入到TXFIFO,當讀取數(shù)據(jù)RFD存放器時,數(shù)據(jù)從RXFIFO中讀出。unsignedchari;signedchartx[]={"dh"};//將mac的內(nèi)容寫到RFD中for(i=0;i<3;i++){RFD=tx[i];}245.3.1RXFIFO訪問RXFIFO存儲器區(qū)域位于地址0x6000到0x607F,一共128字節(jié),在XREG存儲區(qū)域中是可以訪問的。RXFIFO可以保存一個或多個收到的幀,只要總字節(jié)數(shù)不大于128字節(jié)。有兩種方式確定RXFIFO中的字節(jié)數(shù):

讀RFD存放器讀RXFIFOCNT存放器255.3.1RXFIFO訪問讀RFD存放器//通過RFD讀接收的數(shù)據(jù)長度unsignedcharlen;len=RFD;265.3.1RXFIFO訪問讀RXFIFOCNT存放器//通過RXFIFOCNT讀接收的數(shù)據(jù)長度unsignedcharlen;len=RXFIFOCNT;通過RFD存放器讀取的幀長度為數(shù)據(jù)幀的“實際發(fā)送數(shù)據(jù)域+幀尾域〞局部;通過RXFIFOCNT存放器讀取的幀長度為數(shù)據(jù)幀“幀長度域+實際發(fā)送數(shù)據(jù)域+幀尾域〞,由于幀長度域占一個字節(jié),因此通過RXFIFOCNT存放器讀出來的數(shù)據(jù)長度比通過RFD存放器讀出來的長度多一個字節(jié)275.3.2TXFIFO訪問TXFIFO存儲器區(qū)域位于地址0x6080到0x60FF,一共128字節(jié)。它在XREG存儲區(qū)域中是可以訪問的。在不產(chǎn)生TX下溢的情況下,幀數(shù)據(jù)可以在執(zhí)行TX命令選通之前或之后緩沖陰影局部的字節(jié)必須寫到TXFIFO的字節(jié),其他字節(jié)可以被忽略。寫入TXFIFO的幀數(shù)據(jù)根據(jù)AUTOCRC〔CRC自動校驗〕是否啟用可以分為兩種情況:當AUTOCRC為0時,沒有啟動硬件自動檢測;當AUTOCRC為1時,啟動了硬件自動檢測。285.3.2TXFIFO訪問TXFIFO中的字節(jié)數(shù)存儲在TXFIFOCNT存放器中,可以通過兩種方式來進行TXFIFO的寫操作寫入RFD存放器。由于幀緩沖總是開始于TXFIFO存儲器的起始地址,因此可以通過使能FRMCTRL1.IGNORE_TX_UNDERF位,直接將幀數(shù)據(jù)寫到無線電存儲器的RAM區(qū)域。本書中建議使用RFD寫數(shù)據(jù)到TXFIFO。不建議用此種操作295.4發(fā)送模式CC2530射頻的發(fā)送過程:發(fā)送器的控制幀的處理305.4.1TX控制在幀處理和報告狀態(tài)下,無線電有許多內(nèi)置的功能,這些功能可精確控制輸出幀的時序。在設置TX和RX的過程中可以通過存放器來設置,且必須在TX和RX中同時設置//設置TX抗混疊過濾器以獲得適宜的帶寬TXFILTCFG=0x09;//調(diào)整AGC目標值AGCCTRL1=0x15;//獲得最正確的EVMFSCAL1=0x00;315.4.2幀處理CC2530數(shù)據(jù)幀的根本結構如下:同步頭需要傳輸?shù)臄?shù)據(jù)幀尾325.4.2幀處理同步頭幀引導序列幀開始界定符當已經(jīng)發(fā)送了所需的幀引導序列字節(jié)數(shù),射頻局部會自動發(fā)送1字節(jié)長的SFD〔幀開始界定符〕。SFD是固定的,軟件不能改變其值。335.4.2幀處理需要傳輸?shù)臄?shù)據(jù)LEN〔幀長度域〕:幀長度域用于確定要發(fā)送多少個字節(jié)。MAC幀:MAC幀包括MHR〔MAC幀頭〕和MAC負載兩局部,是來自與MAC層的數(shù)據(jù)。當發(fā)送了SFD,調(diào)制器開始從TXFIFO讀數(shù)據(jù),首先讀幀長度域,然后是MHR〔MAC幀頭〕和MAC負載。345.4.2幀處理幀尾存放器FRMCTRL0.AUTOCRC控制位控制幀尾域的幀校驗序列自動產(chǎn)生,其中幀尾不寫入TXFIFO中,存儲在一個單獨的16位存放器中。除了可能用于調(diào)試的目的,建議使能AUTOCRC。如果FRMCTRL.AUTOCRC=0,那么調(diào)制器期望在TXFIFO中找到FCS,所以軟件必須產(chǎn)生FCS,連同MAC負載一起寫到TXFIFOFRMCTRL0幀處理存放器355.4.2幀處理幀尾FRMCTRL0幀處理存放器365.4.2幀處理數(shù)據(jù)幀的產(chǎn)生CC2530射頻局部產(chǎn)生并自動傳輸物理層的同步頭,包括幀引導序列和幀開始界定符〔SFD〕。通過射頻局部傳輸幀長度域和指定的字節(jié)數(shù),包括MAC幀頭和MAC負載。通過操作存放器計算并自動傳輸幀尾〔FSC〕。375.5接收模式接收器的控制RX幀的處理

385.5.1RX控制一般接收數(shù)據(jù)是通過接收中斷來處理的,在發(fā)送數(shù)據(jù)完成之后,首先要翻開接收中斷,接收中斷是通過存放器RFIRQM0的第6位RXPKTDONE和IEN2存放器的第0位來控制的/*翻開接收中斷*///翻開RX中斷RFIRQM0|=(1<<6);//翻開RF中斷IEN2|=(1<<0);/*接收數(shù)據(jù)*///接收幀長度len=RFD;len&=0x7f;//將接收的數(shù)據(jù)寫入buf中for(i=0;i<len;i++){buf[i]=RFD;Delay(200);}395.5.2幀處理CC2530的接收器收到的幀結構如下當CC2530的射頻模塊接收到一個數(shù)據(jù)幀時執(zhí)行以下操作

移除同步頭:由CC2530射頻硬件局部檢測和移除收到的PHY同步頭〔幀引導序列和SFD〕。接收數(shù)據(jù)幀:通過操作存放器接收幀長度域規(guī)定的字節(jié)數(shù),〔包括MHR和MAC負載〕。幀過濾:通過操作存放器可以實現(xiàn)幀過濾功能,拒絕接收目標不明確的數(shù)據(jù)幀。405.5.2幀處理CC2530的接收器收到的幀結構如下當CC2530的射頻模塊接收到一個數(shù)據(jù)幀時執(zhí)行以下操作

匹配源地址:包括多達24個短地址的表,或12個擴展IEEE地址。源地址存儲在無線電RAM中。自動FCS檢查:通過操作存放器可以選擇把自動檢查的結果和其它狀態(tài)值〔RSSI、LQI和源匹配結果〕填入接收到的幀中。具有正確時序的自動確認傳輸:可以通過操作存放器且正確設置幀未決位,基于源地址匹配和FCS校驗的結果“匹配源地址〞是符合標準的,在直接操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送和接收是可以不考慮此項操作的,即可以禁止幀過濾功能。415.6CSMA/CA選通處理器CSMA/CA選通處理器提供控制CPU和無線射頻模塊之間的通信。CSMA/CA選通處理器通過SFR存放器RFST以及XREG存放器和CPU通信。本書中采用RFST存放器和CPU進行通信。RFSTCSMA/CA選通處理存放器//為RX使能并校準頻率合成器RFST=0xe3;寫入RFST存放器的指令為CC2530的RF指令集,操作RFST實現(xiàn)使能RX并校準頻率合成器的操作指令碼為0xe3425.6CSMA/CA選通處理器以下內(nèi)容將實現(xiàn)任務描述,操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點接收完數(shù)據(jù)后LED1閃爍射頻初始化程序voidrf_init(){ //硬件CRC以及AUTO_ACK使能 FRMCTRL0|=(0x20|0x40); //設置TX抗混疊過濾器以獲得適宜的帶寬 TXFILTCFG=0x09; //調(diào)整AGC目標值 AGCCTRL1=0x15; //獲得最正確的EVM FSCAL1=0x00; //RXPKTDONE中斷位使能 RFIRQM0|=(1<<6); //RF中斷使能 IEN2|=(1<<0); //開中斷 EA=1; //信道選擇,選擇11信道 FREQCTRL=0x0b; //目標地址過濾期間使用的短地址 SHORT_ADDR0=0x05; SHORT_ADDR1=0x00; //目標地址過濾期間使用的PANID PAN_ID0=0x22; PAN_ID1=0x00; //去除RXFIFO緩沖區(qū)并復位解調(diào)器 RFST=0xed; //為RX使能并校準頻率合成器 RFST=0xe3; //禁止幀過濾 FRMFILT0&=~(1<<0);}435.6CSMA/CA選通處理器以下內(nèi)容將實現(xiàn)任務描述,操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點接收完數(shù)據(jù)后LED1閃爍發(fā)送程序voidtx(){unsignedchari;signedchartx[]={"hello"};//為RX使能并校準頻率合成器RFST=0xe3;//TX_ACTIVE|SFDwhile(FSMSTAT1&((1<<1)|(1<<5)));//禁止RXPKTDONE中斷RFIRQM0&=~(1<<6);//禁止RF中斷IEN2&=~(1<<0);//去除TXFIFO緩存RFST=0xee;//去除TXDONE中斷RFIRQF1=~(1<<1);//發(fā)送的第一個字節(jié)是傳輸?shù)膸L度RFD=5;

//將mac的內(nèi)容寫到RFD中for(i=0;i<5;i++){RFD=tx[i];}//翻開RX中斷RFIRQM0|=(1<<6);//翻開RF中斷IEN2|=(1<<0);//校準后使能TXRFST=0xe9;//等待傳輸結束while(!(RFIRQF1&(1<<1)));//去除TXDONE狀態(tài)RFIRQF1=~(1<<1);//LED1燈狀態(tài)改變LED1=~LED1;//延時Delay(200);Delay(200);}445.6CSMA/CA選通處理器以下內(nèi)容將實現(xiàn)任務描述,操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點接收完數(shù)據(jù)后LED1閃爍接收程序//接收中斷處理#pragmavector=RF_VECTOR__interruptvoidrf_isr(void){ unsignedchari; //關中斷

IEN2&=~0X01; //接收幀結束

if(RFIRQF0&(1<<6)) { //接收幀長度

len=RFD; len&=0x7f; //將接收的數(shù)據(jù)寫入buf中

for(i=0;i<len;i++) { buf[i]=RFD; Delay(200); } //清RF中斷

S1CON=0; //清RXPKTDONE中斷

RFIRQF0&=~(1<<6); //LED1等狀態(tài)改變

LED1=~LED1; } IEN2|=(1<<0);}455.6CSMA/CA選通處理器以下內(nèi)容將實現(xiàn)任務描述,操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點接收完數(shù)據(jù)后LED1閃爍主函數(shù)#include"ioCC2530.h"#defineLED1P1_0#defineLED2P1_1staticunsignedcharbuf[128];staticunsignedcharlen=0;unsignedchari;voidmain(void){//P1為普通I/O口P1SEL&=~(1<<0);//P1.0P1.1設置為輸出P1DIR|=0x03;//關閉LED1LED1=1;//關閉LED2LED2=1;//關閉總中斷EA=0;//設置時鐘頻率為32MSLEEPCMD&=~0x04;//等待時鐘穩(wěn)定while(!(SLEEPSTA&0x40));

CLKCONCMD&=~0x47;SLEEPCMD|=0x04;

//初始化RFrf_init();//中斷使能EA=1;//發(fā)送或等待接收中斷while(1){//宏定義RX#ifndefRX//如果沒有定義RX,開始發(fā)送tx();//延時Delay(200);Delay(200);//如果定義RX,等待接收中斷#else

#endif

}}465.6CSMA/CA選通處理器以下內(nèi)容將實現(xiàn)任務描述,操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點接收完數(shù)據(jù)后LED1閃爍實驗結果分別將發(fā)送程序與接收程序下載至兩個不同的設備中,首先翻開發(fā)送設備,可以觀察到發(fā)送設備的LED1閃爍;然后翻開接收設備,可以觀察到接收設備的LED1閃爍頻率和發(fā)送設備的LED1是相同的。如果將發(fā)送設備關掉,接收設備的LED1將停止閃爍。47CC2530芯片的射頻發(fā)送和接收是通過操作存放器來實現(xiàn)的,雖然直接操作存放器可以實現(xiàn)數(shù)據(jù)的發(fā)送和接收,但是直接操作存放器實現(xiàn)數(shù)據(jù)的發(fā)送和接收存在以下弊端:不能指定接收者,即一個接收設備可以接收任何一個發(fā)送者發(fā)來的數(shù)據(jù)。當發(fā)送者比較多時會出現(xiàn)信道碰撞問題。不能建立個域網(wǎng)。?使用IEEE80215.4標準可以解決以上問題48調(diào)制標準的數(shù)字高頻調(diào)制使用2.4G直接序列擴頻技術。直接序列擴頻〔DirectSequenceSpreadSpectrum〕工作方式,簡稱直擴方式〔DSSS方式〕。DSSS是直接用偽噪聲序列對載波進行調(diào)制,要傳送的數(shù)據(jù)信息需要經(jīng)過信道編碼后,進行調(diào)制。在接收機收到發(fā)射信號后,首先通過解調(diào)以便能夠及時恢復出數(shù)據(jù)信息,完成整個直擴通信系統(tǒng)的信號接收。49調(diào)制標準采用直接序列擴頻系統(tǒng)的優(yōu)點如下抗干擾能力強,且具有強的抗多徑干擾能力。對其他電臺干擾小,抗截獲能力強??梢酝l工作。便于實現(xiàn)多址通信。50數(shù)據(jù)格式定義了MAC層以及物理層的通信數(shù)據(jù)格式。其中,物理層的數(shù)據(jù)格式是在MAC協(xié)議數(shù)據(jù)單元格式前加上同步頭以及物理頭兩局部同步頭包括幀引導序列和幀開始界定符。物理頭即幀長度域。物理層效勞數(shù)據(jù)單元〔PSDU〕即MAC協(xié)議數(shù)據(jù)單元〔MPDU〕,包括以下幾局部:MAC頭、MAC載荷以及幀尾。51射頻程序設計射頻程序主要分為發(fā)送和接收兩局部。其主函數(shù)局部程序設計流程如下:52射頻程序設計射頻程序主要分為發(fā)送和接收兩局部。其操作過程如下:下載軟件包定義發(fā)送和接收選項修改程序53射頻程序設計下載軟件包首先從TI的官方網(wǎng)站上下載srf05_cc2530軟件包,解壓后使用IAR翻開CC2530BasicRFidesrf05_cc2530iarlight_switch.eww文件從TI官方網(wǎng)站下載的srf05_cc2530軟件包,要求用IAR7.51A版本翻開54射頻程序設計定義發(fā)送和接收選項為了實現(xiàn)點對點的發(fā)送和接收需要對light_switch工程做如下改動:需要定義“發(fā)送〞和“接收〞兩個不同的工程選項,本例程將“發(fā)送〞定義為“SWITCH〞,“接收〞定義為“LIGHT〞。以定義發(fā)送選項“SWITCH為例講解〞55射頻程序設計定義發(fā)送和接收選項點擊工程的工具欄的Project選項,選擇下拉菜單中的“EditConfiguration…〞選項56射頻程序設計定義發(fā)送和接收選項點擊EditConfiguration選項后,彈出Configurationfor“l(fā)ight_switch〞對話框,點擊“New…〞選項57射頻程序設計定義發(fā)送和接收選項彈出“NewConfiguration〞的對話框后,在此對話框的“Name:〞一欄中寫入“SWITCH〞,點擊“OK〞選項58射頻程序設計定義發(fā)送和接收選項可以看到在“Configurationfor‘light_switch’〞對話框中已經(jīng)添加了“SWITCH〞選項59射頻程序設計定義發(fā)送和接收選項以相同的方式添加“LIGHT〞選項,添加完成之后,在“l(fā)ight_switch〞工程的“Workspace〞的下拉菜單中可以看到添加了“SWITCH〞和“LIGHT〞選項60射頻程序設計定義發(fā)送和接收選項選擇“LIGHT〞選項,右擊“l(fā)ight_switch-LIGHT〞選擇“option〞選項,編輯“Options〞選項61射頻程序設計定義發(fā)送和接收選項彈出“Optionfornode‘light_switch’〞的對話框,在此對話框右側(cè)的“Category〞一欄中選擇“C/C++Compiler〞選項,然后在左側(cè)選擇“Preprocessor〞選項,在“DefineSymbol:〞一欄中添加宏定義“LIGH〞,并點擊“OK〞選項完成添加625.7.4發(fā)送過程修改程序?qū)ⅰ發(fā)ight_switch.c〞文件下的main函數(shù)修改如下:voidmain(void){//模式定義為空uint8appMode=NONE;/***********RF配置********************///PANID設置basicRfConfig.panId=PAN_ID;//信道設置basicRfConfig.channel=RF_CHANNEL;//確認請求basicRfConfig.ackRequest=TRUE;#ifdefSECURITY_CCM//平安選型設置basicRfConfig.securityKey=key;#endif/***********RF配置********************///硬件初始化halBoardInit();//hal_rf初始化if(halRfInit()==FAILED){HAL_ASSERT(FALSE);}

635.7.4發(fā)送過程修改程序?qū)ⅰ發(fā)ight_switch.c〞文件下的main函數(shù)修改如下://點亮LED1halLedSet(1);//等待S1按下while(halButtonPushed()!=HAL_BUTTON_1);//延時halMcuWaitMs(350);//如果定義了SWIH#ifdefSWTH//模式為按鍵模式appMode=SWITCH;#endif//如果定義了LIHT#ifdefLIHT//模式為LIGHT模式appMode=LIGHT;#endif//如果模式為SWITCH模式,將調(diào)用appSwitch〔〕函數(shù)if(appMode==SWITCH){appSwitch();}//如果為LIGHT模式,將調(diào)用appLight〔〕函數(shù)elseif(appMode==LIGHT){appLight();}//如果返回錯誤將執(zhí)行閃燈命令HAL_ASSERT(FALSE);}645.7.4發(fā)送過程修改程序基于點對點的數(shù)據(jù)發(fā)送和接收,由于發(fā)送和接收需要符合標準,因此在程序的編寫過程中首先要定義一些結構體,比較重要的結構體有兩個:RF初始化結構體basicRfCfg_t。MAC數(shù)據(jù)幀幀頭結構體basicRfPktHdr_t。

655.7.4發(fā)送過程修改程序RF初始化結構體basicRfCfg_t。typedefstruct{uint16myAddr;uint16panId;uint8channel;uint8ackRequest;#ifdefSECURITY_CCMuint8*securityKey;

uint8*securityNonce;#endif}basicRfCfg_t;源地址信息:為16位短地址

網(wǎng)絡PANID:16位信息

信道:取值為11~26

確認請求:1接收確認幀;0不接收

665.7.4發(fā)送過程修改程序MAC數(shù)據(jù)幀幀頭結構體basicRfPktHdr_t

typedefstruct{uint8packetLength;uint8fcf0;uint8fcf1;uint8seqNumber;uint16panId;uint16destAddr;uint16srcAddr;#ifdefSECURITY_CCMuint8securityControl;uint8frameCounter[4];#endif}basicRfPktHdr_t;數(shù)據(jù)長度

幀控制域低字節(jié)

幀控制域高字節(jié)

幀序號

PANID

源地址和目的地址

675.7.3發(fā)送過程修改程序發(fā)送過程:在主函數(shù)中判定發(fā)送模式和接收模式,如果為發(fā)送模式,將調(diào)用appSwitch〔〕函數(shù)發(fā)送數(shù)據(jù),此函數(shù)的功能為實現(xiàn)每秒鐘發(fā)送一次數(shù)據(jù)。appSwitch〔〕函數(shù)在light_switch.c文件中。staticvoidappSwitch(){//需要發(fā)送的命令pTxData[0]=LIGHT_TOGGLE_CMD;//賦予源地址信息basicRfConfig.myAddr=SWITCH_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}//關閉接收器basicRfReceiveOff();//每隔一秒鐘發(fā)送一個數(shù)據(jù)while(TRUE){//延時1sDelay();//發(fā)送函數(shù)basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH);}}685.7.4發(fā)送過程修改程序發(fā)送過程:在發(fā)送函數(shù)appSwitch〔〕中調(diào)用了一個重要的函數(shù)basicRfSendPacket〔〕,此函數(shù)在basic_rf.c文件中。basicRfSendPacket〔〕實現(xiàn)將數(shù)據(jù)按照的數(shù)據(jù)格式將數(shù)據(jù)發(fā)送出去,如果發(fā)送成功幀序號將加1。uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length){uint8mpduLength;uint8status;//如果接收器沒有翻開將翻開接收器if(!txState.receiveOn){halRfReceiveOn();}//發(fā)送數(shù)據(jù)幀長度length=min(length,BASIC_RF_MAX_PAYLOAD_SIZE);//等待發(fā)送就緒halRfWaitTransceiverReady();//關閉接收中斷halRfDisableRxInterrupt();//獲得發(fā)送數(shù)據(jù)長度mpduLength=basicRfBuildMpdu(destAddr,pPayload,length);//將txbuffer寫入RFDhalRfWriteTxBuf(txMpdu,mpduLength);//翻開RX中斷接收ACK幀halRfEnableRxInterrupt();用來獲得發(fā)送數(shù)據(jù)的長度。

695.7.4發(fā)送過程修改程序發(fā)送過程:basicRfBuildMpdu()

函數(shù)如下staticuint8basicRfBuildMpdu(uint16destAddr,uint8*pPayload,uint8payloadLength){uint8hdrLength,n;//按照MAC數(shù)據(jù)幀結構添加幀頭

hdrLength=basicRfBuildHeader(txMpdu,destAddr,payloadLength);for(n=0;n<payloadLength;n++){//將要發(fā)送的信息傳遞給txMpdutxMpdu[hdrLength+n]=pPayload[n];}//返回幀長度

returnhdrLength+payloadLength;}705.7.4發(fā)送過程修改程序發(fā)送過程:basicRfBuildHeader〔〕函數(shù)按照標準的數(shù)據(jù)幀結構寫在用戶發(fā)送數(shù)據(jù)前添加數(shù)據(jù)MAC幀頭局部,MAC幀頭局部首先要判斷是否需要確認幀回復,需要確認幀回復的MAC幀頭局部和不需要確認幀回復的幀頭局部是不同的。basicRfBuildHeader〔〕函數(shù)在basic_rf.c文件中,其代碼如下所示:staticuint8basicRfBuildHeader(uint8*buffer,uint16destAddr,uint8payloadLength){basicRfPktHdr_t*pHdr;uint16fcf;pHdr=(basicRfPktHdr_t*)buffer;//計算幀長度pHdr->packetLength=payloadLength+BASIC_RF_PACKET_OVERHEAD_SIZE;/*判斷需不需要確認幀回復,如果需要fcf為BASIC_RF_FCF_ACK否那么為BASIC_RF_FCF_NOACK*/fcf=pConfig->ackRequest?BASIC_RF_FCF_ACK:BASIC_RF_FCF_NOACK;//幀控制域低字節(jié)pHdr->fcf0=LO_UINT16(fcf);//幀控制域高字節(jié)pHdr->fcf1=HI_UINT16(fcf);//幀序號pHdr->seqNumber=txState.txSeqNumber;//panId設置pHdr->panId=pConfig->panId;//目的地址信息pHdr->destAddr=destAddr;//源地址信息pHdr->srcAddr=pConfig->myAddr;/*****確保地址信息為所定義的類型*********/UINT16_HTON(pHdr->panId);UINT16_HTON(pHdr->destAddr);UINT16_HTON(pHdr->srcAddr);//返回值為MAC幀頭長度returnBASIC_RF_HDR_SIZE;}715.7.4發(fā)送過程修改程序發(fā)送過程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過hal_rf.c文件中的halRfWriteTxBuf〔〕和halRfTransmit〔〕函數(shù)實現(xiàn)數(shù)據(jù)的發(fā)送,halRfWriteTxBuf〔〕函數(shù)實現(xiàn)將發(fā)送的數(shù)據(jù)寫入到RX中,halRfTransmit〔〕函數(shù)實現(xiàn)在發(fā)送數(shù)據(jù)幀的同時檢測信道是否空閑。halRfWriteTxBuf〔〕函數(shù)如下:voidhalRfWriteTxBuf(uint8*pData,uint8length){uint8i;//清空TXFIFOISFLUSHTX();//清TX中斷

RFIRQF1=~IRQ_TXDONE;//將要發(fā)送的數(shù)據(jù)給RFDfor(i=0;i<length;i++){RFD=pData[i];}}725.7.4發(fā)送過程修改程序發(fā)送過程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過hal_rf.c文件中的halRfWriteTxBuf〔〕和halRfTransmit〔〕函數(shù)實現(xiàn)數(shù)據(jù)的發(fā)送,halRfWriteTxBuf〔〕函數(shù)實現(xiàn)將發(fā)送的數(shù)據(jù)寫入到RX中,halRfTransmit〔〕函數(shù)實現(xiàn)在發(fā)送數(shù)據(jù)幀的同時檢測信道是否空閑。halRfTransmit〔〕函數(shù)如下:uint8halRfTransmit(void){uint8status;//使能TX發(fā)送ISTXON();//等待發(fā)送完成〔檢測到接收一個完整的幀〕while(!(RFIRQF1&IRQ_TXDONE));//清標志位RFIRQF1=~IRQ_TXDONE;//發(fā)送成功返回SUCCESSstatus=SUCCESS;returnstatus;}735.7.4發(fā)送過程修改程序發(fā)送過程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過hal_rf.c文件中的halRfWriteTxBuf〔〕和halRfTransmit〔〕函數(shù)實現(xiàn)數(shù)據(jù)的發(fā)送,halRfWriteTxBuf〔〕函數(shù)實現(xiàn)將發(fā)送的數(shù)據(jù)寫入到RX中,halRfTransmit〔〕函數(shù)實現(xiàn)在發(fā)送數(shù)據(jù)幀的同時檢測信道是否空閑。halRfWriteTxBuf〔〕和halRfTransmit〔〕函數(shù)是通過basicRfSendPacket〔〕函數(shù)來觸發(fā)的745.7.5接收過程接收過程在主函數(shù)中判定為接收模式時,程序?qū)?zhí)行l(wèi)ight_switch.c文件中的接收函數(shù)appLight(),該函數(shù)對射頻進行初始化,然后按照接收信息執(zhí)行命令staticvoidappLight(){//BasicRF初始化basicRfConfig.myAddr=LIGHT_ADDR;//初始化射頻if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}//翻開射頻接收器basicRfReceiveOn();//等待接收中斷while(TRUE){while(!basicRfPacketIsReady());//如果接收到的數(shù)據(jù)if(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0){//判斷接收數(shù)據(jù)是否為閃燈命令if(pRxData[0]==LIGHT_TOGGLE_CMD){//LED1狀態(tài)改變halLedToggle(1);}}}}755.7.5接收過程接收過程在appLight()函數(shù)中調(diào)用basic_rf.c文件中的basicRfInit()對射頻進行初始化、配置信道、短地址信息和PANID,并且對中斷接收做了相應的配置。其代碼如下所示:

uint8basicRfInit(basicRfCfg_t*pRfConfig){if(halRfInit()==FAILED)returnFAILED;//關閉所有中斷

halIntOff();//按照協(xié)議配置結構體

pConfig=pRfConfig;rxi.pPayload=NULL;//接收狀態(tài)設置

txState.receiveOn=TRUE;//接收幀序號設置

txState.frameCounter=0;//設置信道

halRfSetChannel(pConfig->channel);/*向CC2520RAM中寫入源地址信息和PANID信息*/halRfSetShortAddr(pConfig->myAddr);halRfSetPanId(pConfig->panId);

//設置射頻中斷接收函數(shù)

halRfRxInterruptConfig(basicRfRxFrmDoneIsr);//開總中斷

halIntOn();returnSUCCESS;}765.7.5接收過程接收過程basic_rf.c文件中的basicRfRxFrmDoneIsr()函數(shù)為中斷接收函數(shù),在中斷接收函數(shù)中,除了接收數(shù)據(jù)外,還對接收到的數(shù)據(jù)進行CRC校驗,其具體代碼如下所示:staticvoidbasicRfRxFrmDoneIsr(void){basicRfPktHdr_t*pHdr;uint8*pStatusWord;//配置MAC幀頭pHdr=(basicRfPktHdr_t*)rxMpdu;//清接收中斷halRfDisableRxInterrupt();//翻開所有的中斷halIntOn();//讀數(shù)據(jù)長度halRfReadRxBuf(&pHdr->packetLength,1);pHdr->packetLength&=BASIC_RF_PLD_LEN_MASK;

//如果是確認幀(只有確認幀是5個字節(jié))if(pHdr->packetLength==BASIC_RF_ACK_PACKET_SIZE){//讀數(shù)據(jù)幀halRfReadRxBuf(&rxMpdu[1],pHdr->packetLength);/******確保地址信息為所定義的類型******/ UINT16_NTOH(pHdr->panId); UINT16_NTOH(pHdr->destAddr); UINT16_NTOH(pHdr->srcAddr);

//是否需要確認請求判斷,判斷幀控制域確實認請求域是否為1rxi.ackRequest=!!(pHdr->fcf0&BASIC_RF_FCF_ACK_BM_L);//取出確認幀的最后一個字節(jié)進行CRC校驗pStatusWord=rxMpdu+4;775.7.5接收過程接收過程basic_rf.c文件中的basicRfRxFrmDoneIsr()函數(shù)為中斷接收函數(shù),在中斷接

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論