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

下載本文檔

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

文檔簡介

第5章無線射頻與MAC層1本章目標掌握RF內核結構掌握FIFO訪問掌握CC2530無線發送模式掌握CC2530無線接收模式掌握IEEE802.15.4程序設計方法2本章目標掌握RF內核結構掌握FIFO訪問掌握CC2530無線發送模式掌握CC2530無線接收模式掌握IEEE802.15.4程序設計方法3CC2530是兼容IEEE802.15.4標準射頻模塊的片上系統

5.1概述4RF內核控制無線射頻模塊,并且在MCU和無線電之間提供一個接口,可以發出命令,讀取狀態和自動對無線電事件排序。RF內核包括以下幾部分:無線電控制狀態模塊(FSM)、調制器,解調器、幀過濾和源匹配、頻率合成器(FS)、命令選通處理器,定時器2(MAC定時器)

5.2RF內核FSM模塊的主要功能包括控制RF收發器的狀態、發送和接收FIFO,以及大部分動態受控的模擬信號,比如模擬模塊的上電/掉電調制器:將原始數據轉換為I/Q(同相/正交)信號發送到發送器DAC,并且遵守IEEE802.15.4標準解調器:負責從收到的信號中檢索無線數據。解調器的振幅信息由自動增益控制使用,自動增益控制調整模擬LAN的增益,使接收器內的信號水平大約是個常量。5RF內核控制無線射頻模塊,并且在MCU和無線電之間提供一個接口,可以發出命令,讀取狀態和自動對無線電事件排序。RF內核包括以下幾部分:無線電控制狀態模塊(FSM)、調制器,解調器、幀過濾和源匹配、頻率合成器(FS)、命令選通處理器,定時器2(MAC定時器)

5.2RF內核幀過濾和源匹配:其功能是支持RF內核中的FSM模塊來執行幀過濾和源地址匹配。頻率合成器:其功能是為RF信號產生載波。命令選通處理器:處理CPU所發出的命令。它包含一個24字節的程序存儲器,可以自動執行CSMA/CA機制。6RF內核控制無線射頻模塊,并且在MCU和無線電之間提供一個接口,可以發出命令,讀取狀態和自動對無線電事件排序。RF內核包括以下幾部分:無線電控制狀態模塊(FSM)、調制器,解調器、幀過濾和源匹配、頻率合成器(FS)、命令選通處理器,定時器2(MAC定時器)

5.2RF內核無線電RAM:為發送TXFIFO和接收RXFIFO分別分配128字節的FIFO,為幀過濾和源匹配存儲參數保留128字節。定時器2(MAC定時器):用于為無線電事件計時,以捕獲輸入數據包的時間戳,這一定時器在睡眠模式下也保持計數。7RFERR中斷RF中斷5.2.1中斷CC2530無線射頻的工作涉及到CPU兩個中斷向量8RFERR中斷其功能是表示無線射頻的錯誤情況,無線射頻內核錯誤表現為RFTXRFIO下溢或RXFIFO溢出,通過控制SFR寄存器的IEN0.RFERRIE位使能。并且在TCON.RFERRIF保存了RFERR中斷標志位(即是否發生中斷),

5.2.1中斷RFERR中斷95.2.1中斷IEN0.RFERRIE//使能RF內核錯誤中斷IEN0|=0x01;RFERR中斷105.2.1中斷TCON.RFERRIF中斷標志//判斷RFERRIF中斷是否發生if(RFERRIF=1){}RFERR中斷115.2.1中斷RF中斷RF中斷其功能是數據發送和接收中斷。RF中斷是上升沿觸發的,通過控制SFR寄存器的IEN2.RFIE位使能,并且在S1CON.RFIF保存了RFIF中斷標志位125.2.1中斷RF中斷IEN2.RFIE//使能RF中斷IEN2|=0x01;135.2.1中斷RF中斷S1CON.RFIF中斷標志//判斷RF一般中斷是否發生if((RFIF_1=1)&(RFIF_2=1)){…}145.2.2中斷寄存器RF內核的兩個中斷源(RFERR和RF),是RF內核中若干中斷源的組合,其中每個單獨的中斷源在RF內核中有自己的中斷屏蔽寄存器和中斷標志寄存器。中斷屏蔽寄存器中斷標志寄存器155.2.2中斷寄存器中斷屏蔽寄存器RF中斷屏蔽寄存器RFIRQM0RF中斷屏蔽寄存器RFIRQM1RF錯誤中斷屏蔽寄存器RFERRM

165.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錯誤中斷標志寄存器RFIERRF

205.2.2中斷寄存器中斷標志寄存器RFIRQF0//判斷RF一般中斷是否發生if((RFIRQF0&0x40){…}215.2.2中斷寄存器中斷標志寄存器RFIRQF1225.2.2中斷寄存器中斷標志寄存器RFIERRF

235.3FIFO訪問CC2530發送或接收數據是通過FIFO操作來進行的。FIFO訪問可以分為TXFIFO訪問和RXFIFO訪問,其操作都是通過SFR寄存器的RFD操作進行。當寫入RFD寄存器時,數據被寫入到TXFIFO,當讀取數據RFD寄存器時,數據從RXFIFO中讀出。

unsignedchari;signedchartx[]={"dh"};//將mac的內容寫到RFD中for(i=0;i<3;i++){RFD=tx[i];}245.3.1RXFIFO訪問RXFIFO存儲器區域位于地址0x6000到0x607F,一共128字節,在XREG存儲區域中是可以訪問的。RXFIFO可以保存一個或多個收到的幀,只要總字節數不大于128字節。有兩種方式確定RXFIFO中的字節數:

讀RFD寄存器

讀RXFIFOCNT寄存器

255.3.1RXFIFO訪問讀RFD寄存器//通過RFD讀接收的數據長度unsignedcharlen;len=RFD;265.3.1RXFIFO訪問讀RXFIFOCNT寄存器//通過RXFIFOCNT讀接收的數據長度unsignedcharlen;len=RXFIFOCNT;通過RFD寄存器讀取的幀長度為數據幀的“實際發送數據域+幀尾域”部分;通過RXFIFOCNT寄存器讀取的幀長度為數據幀“幀長度域+實際發送數據域+幀尾域”,由于幀長度域占一個字節,因此通過RXFIFOCNT寄存器讀出來的數據長度比通過RFD寄存器讀出來的長度多一個字節

275.3.2TXFIFO訪問TXFIFO存儲器區域位于地址0x6080到0x60FF,一共128字節。它在XREG存儲區域中是可以訪問的。在不產生TX下溢的情況下,幀數據可以在執行TX命令選通之前或之后緩沖陰影部分的字節必須寫到TXFIFO的字節,其他字節可以被忽略。寫入TXFIFO的幀數據根據AUTOCRC(CRC自動校驗)是否啟用可以分為兩種情況:當AUTOCRC為0時,沒有啟動硬件自動檢測;當AUTOCRC為1時,啟動了硬件自動檢測。

285.3.2TXFIFO訪問TXFIFO中的字節數存儲在TXFIFOCNT寄存器中,可以通過兩種方式來進行TXFIFO的寫操作寫入RFD寄存器。由于幀緩沖總是開始于TXFIFO存儲器的起始地址,因此可以通過使能FRMCTRL1.IGNORE_TX_UNDERF位,直接將幀數據寫到無線電存儲器的RAM區域。本書中建議使用RFD寫數據到TXFIFO。不建議用此種操作295.4發送模式CC2530射頻的發送過程:發送器的控制幀的處理305.4.1TX控制在幀處理和報告狀態下,無線電有許多內置的功能,這些功能可精確控制輸出幀的時序。在設置TX和RX的過程中可以通過寄存器來設置,且必須在TX和RX中同時設置

//設置TX抗混疊過濾器以獲得合適的帶寬TXFILTCFG=0x09;//調整AGC目標值AGCCTRL1=0x15;//獲得最佳的EVMFSCAL1=0x00;315.4.2幀處理CC2530數據幀的基本結構如下:同步頭需要傳輸的數據幀尾325.4.2幀處理同步頭幀引導序列幀開始界定符當已經發送了所需的幀引導序列字節數,射頻部分會自動發送1字節長的SFD(幀開始界定符)。SFD是固定的,軟件不能改變其值。

335.4.2幀處理需要傳輸的數據LEN(幀長度域):幀長度域用于確定要發送多少個字節。MAC幀:MAC幀包括MHR(MAC幀頭)和MAC負載兩部分,是來自與MAC層的數據。當發送了SFD,調制器開始從TXFIFO讀數據,首先讀幀長度域,然后是MHR(MAC幀頭)和MAC負載。

345.4.2幀處理幀尾寄存器FRMCTRL0.AUTOCRC控制位控制幀尾域的幀校驗序列自動產生,其中幀尾不寫入TXFIFO中,存儲在一個單獨的16位寄存器中。除了可能用于調試的目的,建議使能AUTOCRC。如果FRMCTRL.AUTOCRC=0,那么調制器期望在TXFIFO中找到FCS,所以軟件必須產生FCS,連同MAC負載一起寫到TXFIFO

FRMCTRL0幀處理寄存器355.4.2幀處理幀尾FRMCTRL0幀處理寄存器365.4.2幀處理數據幀的產生CC2530射頻部分產生并自動傳輸物理層的同步頭,包括幀引導序列和幀開始界定符(SFD)。通過射頻部分傳輸幀長度域和指定的字節數,包括MAC幀頭和MAC負載。通過操作寄存器計算并自動傳輸幀尾(FSC)。375.5接收模式接收器的控制RX幀的處理

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

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

匹配源地址:包括多達24個短地址的表,或12個擴展IEEE地址。源地址存儲在無線電RAM中。自動FCS檢查:通過操作寄存器可以選擇把自動檢查的結果和其它狀態值(RSSI、LQI和源匹配結果)填入接收到的幀中。具有正確時序的自動確認傳輸:可以通過操作寄存器且正確設置幀未決位,基于源地址匹配和FCS校驗的結果“匹配源地址”是符合IEEE802.15.4標準的,在直接操作寄存器實現數據的發送和接收是可以不考慮此項操作的,即可以禁止幀過濾功能。

415.6CSMA/CA選通處理器CSMA/CA選通處理器提供控制CPU和無線射頻模塊之間的通信。CSMA/CA選通處理器通過SFR寄存器RFST以及XREG寄存器和CPU通信。本書中采用RFST寄存器和CPU進行通信。

RFSTCSMA/CA選通處理寄存器//為RX使能并校準頻率合成器RFST=0xe3;寫入RFST寄存器的指令為CC2530的RF指令集,操作RFST實現使能RX并校準頻率合成器的操作指令碼為0xe3425.6CSMA/CA選通處理器以下內容將實現任務描述5.D.1

,操作寄存器實現數據的發送接收。發送節點發送完數據LED1燈閃爍,接收節點接收完數據后LED1閃爍

射頻初始化程序voidrf_init(){ //硬件CRC以及AUTO_ACK使能

FRMCTRL0|=(0x20|0x40); //設置TX抗混疊過濾器以獲得合適的帶寬

TXFILTCFG=0x09; //調整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緩沖區并復位解調器

RFST=0xed; //為RX使能并校準頻率合成器

RFST=0xe3; //禁止幀過濾

FRMFILT0&=~(1<<0);}435.6CSMA/CA選通處理器以下內容將實現任務描述5.D.1

,操作寄存器實現數據的發送接收。發送節點發送完數據LED1燈閃爍,接收節點接收完數據后LED1閃爍

發送程序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);//發送的第一個字節是傳輸的幀長度RFD=5;

//將mac的內容寫到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狀態RFIRQF1=~(1<<1);//LED1燈狀態改變LED1=~LED1;//延時Delay(200);Delay(200);}445.6CSMA/CA選通處理器以下內容將實現任務描述5.D.1

,操作寄存器實現數據的發送接收。發送節點發送完數據LED1燈閃爍,接收節點接收完數據后LED1閃爍

接收程序//接收中斷處理#pragmavector=RF_VECTOR__interruptvoidrf_isr(void){ unsignedchari; //關中斷

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

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

len=RFD; len&=0x7f; //將接收的數據寫入buf中

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

S1CON=0; //清RXPKTDONE中斷

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

LED1=~LED1; } IEN2|=(1<<0);}455.6CSMA/CA選通處理器以下內容將實現任務描述5.D.1

,操作寄存器實現數據的發送接收。發送節點發送完數據LED1燈閃爍,接收節點接收完數據后LED1閃爍

主函數#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;//等待時鐘穩定while(!(SLEEPSTA&0x40));

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

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

#endif

}}465.6CSMA/CA選通處理器以下內容將實現任務描述5.D.1

,操作寄存器實現數據的發送接收。發送節點發送完數據LED1燈閃爍,接收節點接收完數據后LED1閃爍

實驗結果分別將發送程序與接收程序下載至兩個不同的設備中,首先打開發送設備,可以觀察到發送設備的LED1閃爍;然后打開接收設備,可以觀察到接收設備的LED1閃爍頻率和發送設備的LED1是相同的。如果將發送設備關掉,接收設備的LED1將停止閃爍。475.7IEEE802.15.4CC2530芯片的射頻發送和接收是通過操作寄存器來實現的,雖然直接操作寄存器可以實現數據的發送和接收,但是直接操作寄存器實現數據的發送和接收存在以下弊端:不能指定接收者,即一個接收設備可以接收任何一個發送者發來的數據。當發送者比較多時會出現信道碰撞問題。不能建立個域網。?使用IEEE80215.4標準可以解決以上問題485.7.1IEEE802.15.4調制規范IEEE802.15.4的數字高頻調制使用2.4G直接序列擴頻技術。

直接序列擴頻(DirectSequenceSpreadSpectrum)工作方式,簡稱直擴方式(DSSS方式)。DSSS是直接用偽噪聲序列對載波進行調制,要傳送的數據信息需要經過信道編碼后,進行調制。在接收機收到發射信號后,首先通過解調以便能夠及時恢復出數據信息,完成整個直擴通信系統的信號接收。495.7.1IEEE802.15.4調制規范采用直接序列擴頻系統的優點如下抗干擾能力強,且具有強的抗多徑干擾能力。對其他電臺干擾小,抗截獲能力強。可以同頻工作。便于實現多址通信。505.7.2IEEE802.15.4數據格式IEEE802.15.4定義了MAC層以及物理層的通信數據格式。其中,物理層的數據格式是在MAC協議數據單元格式前加上同步頭以及物理頭兩部分

同步頭包括幀引導序列和幀開始界定符。物理頭即幀長度域。物理層服務數據單元(PSDU)即MAC協議數據單元(MPDU),包括以下幾部分:MAC頭、MAC載荷以及幀尾。515.7.3IEEE802.15.4射頻程序設計IEEE802.15.4射頻程序主要分為發送和接收兩部分。其主函數部分程序設計流程如下:525.7.3IEEE802.15.4射頻程序設計IEEE802.15.4射頻程序主要分為發送和接收兩部分。其操作過程如下:下載軟件包定義發送和接收選項修改程序535.7.3IEEE802.15.4射頻程序設計下載軟件包首先從TI的官方網站上下載srf05_cc2530軟件包,解壓后使用IAR打開CC2530BasicRFidesrf05_cc2530iarlight_switch.eww文件

從TI官方網站下載的srf05_cc2530軟件包,要求用IAR7.51A版本打開

545.7.3IEEE802.15.4射頻程序設計定義發送和接收選項為了實現點對點的發送和接收需要對light_switch工程做如下改動:需要定義“發送”和“接收”兩個不同的工程選項,本例程將“發送”定義為“SWITCH”,“接收”定義為“LIGHT”。以定義發送選項“SWITCH為例講解”555.7.3IEEE802.15.4射頻程序設計定義發送和接收選項點擊工程的工具欄的Project選項,選擇下拉菜單中的“EditConfiguration…”選項

565.7.3IEEE802.15.4射頻程序設計定義發送和接收選項點擊EditConfiguration選項后,彈出Configurationfor“light_switch”對話框,點擊“New…”選項

575.7.3IEEE802.15.4射頻程序設計定義發送和接收選項彈出“NewConfiguration”的對話框后,在此對話框的“Name:”一欄中寫入“SWITCH”,點擊“OK”選項

585.7.3IEEE802.15.4射頻程序設計定義發送和接收選項可以看到在“Configurationfor‘light_switch’”對話框中已經添加了“SWITCH”選項

595.7.3IEEE802.15.4射頻程序設計定義發送和接收選項以相同的方式添加“LIGHT”選項,添加完成之后,在“light_switch”工程的“Workspace”的下拉菜單中可以看到添加了“SWITCH”和“LIGHT”選項605.7.3IEEE802.15.4射頻程序設計定義發送和接收選項選擇“LIGHT”選項,右擊“light_switch-LIGHT”選擇“option”選項,編輯“Options”選項615.7.3IEEE802.15.4射頻程序設計定義發送和接收選項彈出“Optionfornode‘light_switch’”的對話框,在此對話框右側的“Category”一欄中選擇“C/C++Compiler”選項,然后在左側選擇“Preprocessor”選項,在“DefineSymbol:”一欄中添加宏定義“LIGH”,并點擊“OK”選項完成添加625.7.4發送過程修改程序將“light_switch.c”文件下的main函數修改如下: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發送過程修改程序將“light_switch.c”文件下的main函數修改如下://點亮LED1halLedSet(1);//等待S1按下while(halButtonPushed()!=HAL_BUTTON_1);//延時halMcuWaitMs(350);//如果定義了SWIH#ifdefSWTH//模式為按鍵模式appMode=SWITCH;#endif//如果定義了LIHT#ifdefLIHT//模式為LIGHT模式appMode=LIGHT;#endif//如果模式為SWITCH模式,將調用appSwitch()函數if(appMode==SWITCH){appSwitch();}//如果為LIGHT模式,將調用appLight()函數elseif(appMode==LIGHT){appLight();}//如果返回錯誤將執行閃燈命令HAL_ASSERT(FALSE);}645.7.4發送過程修改程序基于IEEE802.15.4點對點的數據發送和接收,由于發送和接收需要符合IEEE802.15.4規范,因此在程序的編寫過程中首先要定義一些結構體,比較重要的結構體有兩個:RF初始化結構體basicRfCfg_t。MAC數據幀幀頭結構體basicRfPktHdr_t。

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

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

網絡PANID:16位信息

信道:取值為11~26

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

665.7.4發送過程修改程序MAC數據幀幀頭結構體basicRfPktHdr_t

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

幀控制域低字節

幀控制域高字節

幀序號

PANID

源地址和目的地址

675.7.3發送過程修改程序發送過程:在主函數中判定發送模式和接收模式,如果為發送模式,將調用appSwitch()函數發送數據,此函數的功能為實現每秒鐘發送一次數據。appSwitch()函數在light_switch.c文件中。

staticvoidappSwitch(){//需要發送的命令pTxData[0]=LIGHT_TOGGLE_CMD;//賦予源地址信息basicRfConfig.myAddr=SWITCH_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}//關閉接收器basicRfReceiveOff();//每隔一秒鐘發送一個數據while(TRUE){//延時1sDelay();//發送函數basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH);}}685.7.4發送過程修改程序發送過程:在發送函數appSwitch()中調用了一個重要的函數basicRfSendPacket(),此函數在basic_rf.c文件中。basicRfSendPacket()實現將數據按照IEEE802.15.4的數據格式將數據發送出去,如果發送成功幀序號將加1。uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length){uint8mpduLength;uint8status;//如果接收器沒有打開將打開接收器

if(!txState.receiveOn){halRfReceiveOn();}//發送數據幀長度

length=min(length,BASIC_RF_MAX_PAYLOAD_SIZE);//等待發送就緒

halRfWaitTransceiverReady();//關閉接收中斷

halRfDisableRxInterrupt();//獲得發送數據長度

mpduLength=basicRfBuildMpdu(destAddr,pPayload,length);//將txbuffer寫入RFDhalRfWriteTxBuf(txMpdu,mpduLength);//打開RX中斷接收ACK幀

halRfEnableRxInterrupt();用來獲得發送數據的長度。

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

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

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

returnhdrLength+payloadLength;}705.7.4發送過程修改程序發送過程:basicRfBuildHeader()函數按照IEEE802.15.4規范的數據幀結構寫在用戶發送數據前添加數據MAC幀頭部分,MAC幀頭部分首先要判斷是否需要確認幀回復,需要確認幀回復的MAC幀頭部分和不需要確認幀回復的幀頭部分是不同的。basicRfBuildHeader()函數在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;//幀控制域低字節

pHdr->fcf0=LO_UINT16(fcf);//幀控制域高字節

pHdr->fcf1=HI_UINT16(fcf);//幀序號

pHdr->seqNumber=txState.txSeqNumber;//panId設置

pHdr->panId=pConfig->panId;//目的地址信息

pHdr->destAddr=destAddr;//源地址信息

pHdr->srcAddr=pConfig->myAddr;/*****確保地址信息為IEEE802.15.4所定義的類型*********/UINT16_HTON(pHdr->panId);UINT16_HTON(pHdr->destAddr);UINT16_HTON(pHdr->srcAddr);//返回值為MAC幀頭長度

returnBASIC_RF_HDR_SIZE;}715.7.4發送過程修改程序發送過程:數據的發送和接收函數是通過hal_rf.c文件中的halRfWriteTxBuf()和halRfTransmit()函數實現數據的發送,halRfWriteTxBuf()函數實現將發送的數據寫入到RX中,halRfTransmit()函數實現在發送數據幀的同時檢測信道是否空閑。

halRfWriteTxBuf()函數如下:voidhalRfWriteTxBuf(uint8*pData,uint8length){uint8i;//清空TXFIFOISFLUSHTX();//清TX中斷

RFIRQF1=~IRQ_TXDONE;//將要發送的數據給RFDfor(i=0;i<length;i++){RFD=pData[i];}}725.7.4發送過程修改程序發送過程:數據的發送和接收函數是通過hal_rf.c文件中的halRfWriteTxBuf()和halRfTransmit()函數實現數據的發送,halRfWriteTxBuf()函數實現將發送的數據寫入到RX中,halRfTransmit()函數實現在發送數據幀的同時檢測信道是否空閑。

halRfTransmit()函數如下

:uint8halRfTransmit(void){uint8status;//使能TX發送

ISTXON();//等待發送完成(檢測到接收一個完整的幀)

while(!(RFIRQF1&IRQ_TXDONE));//清標志位

RFIRQF1=~IRQ_TXDONE;//發送成功返回SUCCESSstatus=SUCCESS;returnstatus;}735.7.4發送過程修改程序發送過程:數據的發送和接收函數是通過hal_rf.c文件中的halRfWriteTxBuf()和halRfTransmit()函數實現數據的發送,halRfWriteTxBuf()函數實現將發送的數據寫入到RX中,halRfTransmit()函數實現在發送數據幀的同時檢測信道是否空閑。

halRfWriteTxBuf()和halRfTransmit()函數是通過basicRfSendPacket()函數來觸發的

745.7.5接收過程接收過程在主函數中判定為接收模式時,程序將執行light_switch.c文件中的接收函數appLight(),該函數對射頻進行初始化,然后按照接收信息執行命令staticvoidappLight(){//BasicRF初始化

basicRfConfig.myAddr=LIGHT_ADDR;//初始化射頻

if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}//打開射頻接收器

basicRfReceiveOn();//等待接收中斷

while(TRUE){while(!basicRfPacketIsReady());//如果接收到的數據

if(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0){//判斷接收數據是否為閃燈命令

if(pRxData[0]==LIGHT_TOGGLE_CMD){//LED1狀態改變

halLedToggle(1);}}}}755.7.5接收過程接收過程在appLight()函數中調用basic_rf.c文件中的basicRfInit()對射頻進行初始化、配置信道、短地址信息和PANID,并且對中斷接收做了相應的配置。其代碼如下所示:

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

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

pConfig=pRfConfig;rxi.pPayload=NULL;//接收狀態設置

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

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

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

//設置射頻中斷接收函數

halRfRxInterruptConfig(basicRfRxFrmDoneIsr);//開總中斷

halIntOn();returnSUCCESS;}765.7.5接收過程接收過程basic_rf.c文件中的basicRfRxFrmDoneIsr()函數為中斷接收函數,在中斷接收函數中,除了接收數據外,還對接收到的數據進行CRC校驗,其具體代碼如下所示:staticvoidbasicRfRxFrmDoneIsr(void){basicRfPktHdr_t*pHdr;uint8*pStatusWord;//配置MAC幀頭

pHdr=(basicRfPktHdr_t*)rxMpdu;//清接收中斷

halRfDisableRxInterrupt();//打開所有的中斷

halIntOn();//讀數據長度

halRfReadRxBuf(&pHdr->packetLength,1);pHdr->packetLength&=BASIC_RF_PLD_LEN_MASK;

//如果是確認幀(只有確認幀是5個字節)if(pHdr->packetLength==BASIC_RF_ACK_PACKET_SIZE){//讀數據幀

halRfReadRxBuf(&rxMpdu[1],pHdr->packetLength);/******確保地址信息為IEEE802.15.4所定義的類型******/ UINT16_NTOH(pHdr->panId); UINT16_NTOH(pHdr->destAddr); UINT16_NTOH(pHdr->srcAddr);

//是否需要確認請求判斷,判斷幀控制域的確認請求域是否為1rxi.ackRequest=!!(pHdr->fcf0&BASIC_RF_FCF_ACK_BM_L);//取出確認幀的最后一個字節進行CRC校驗

pStatusWord=rxMpdu+4;775.7.5接收過程接收過程basic_rf.c文件中的basicRfRxFrmDoneIsr()

溫馨提示

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

最新文檔

評論

0/150

提交評論