版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章無線射頻與MAC層1本章目標(biāo)掌握RF內(nèi)核結(jié)構(gòu)掌握FIFO訪問掌握CC2530無線發(fā)送模式掌握CC2530無線接收模式掌握IEEE802.15.4程序設(shè)計(jì)方法2本章目標(biāo)掌握RF內(nèi)核結(jié)構(gòu)掌握FIFO訪問掌握CC2530無線發(fā)送模式掌握CC2530無線接收模式掌握IEEE802.15.4程序設(shè)計(jì)方法3CC2530是兼容IEEE802.15.4標(biāo)準(zhǔn)射頻模塊的片上系統(tǒng)
5.1概述4RF內(nèi)核控制無線射頻模塊,并且在MCU和無線電之間提供一個(gè)接口,可以發(fā)出命令,讀取狀態(tài)和自動(dòng)對(duì)無線電事件排序。RF內(nèi)核包括以下幾部分:無線電控制狀態(tài)模塊(FSM)、調(diào)制器,解調(diào)器、幀過濾和源匹配、頻率合成器(FS)、命令選通處理器,定時(shí)器2(MAC定時(shí)器)
5.2RF內(nèi)核FSM模塊的主要功能包括控制RF收發(fā)器的狀態(tài)、發(fā)送和接收FIFO,以及大部分動(dòng)態(tài)受控的模擬信號(hào),比如模擬模塊的上電/掉電調(diào)制器:將原始數(shù)據(jù)轉(zhuǎn)換為I/Q(同相/正交)信號(hào)發(fā)送到發(fā)送器DAC,并且遵守IEEE802.15.4標(biāo)準(zhǔn)解調(diào)器:負(fù)責(zé)從收到的信號(hào)中檢索無線數(shù)據(jù)。解調(diào)器的振幅信息由自動(dòng)增益控制使用,自動(dòng)增益控制調(diào)整模擬LAN的增益,使接收器內(nèi)的信號(hào)水平大約是個(gè)常量。5RF內(nèi)核控制無線射頻模塊,并且在MCU和無線電之間提供一個(gè)接口,可以發(fā)出命令,讀取狀態(tài)和自動(dòng)對(duì)無線電事件排序。RF內(nèi)核包括以下幾部分:無線電控制狀態(tài)模塊(FSM)、調(diào)制器,解調(diào)器、幀過濾和源匹配、頻率合成器(FS)、命令選通處理器,定時(shí)器2(MAC定時(shí)器)
5.2RF內(nèi)核幀過濾和源匹配:其功能是支持RF內(nèi)核中的FSM模塊來執(zhí)行幀過濾和源地址匹配。頻率合成器:其功能是為RF信號(hào)產(chǎn)生載波。命令選通處理器:處理CPU所發(fā)出的命令。它包含一個(gè)24字節(jié)的程序存儲(chǔ)器,可以自動(dòng)執(zhí)行CSMA/CA機(jī)制。6RF內(nèi)核控制無線射頻模塊,并且在MCU和無線電之間提供一個(gè)接口,可以發(fā)出命令,讀取狀態(tài)和自動(dòng)對(duì)無線電事件排序。RF內(nèi)核包括以下幾部分:無線電控制狀態(tài)模塊(FSM)、調(diào)制器,解調(diào)器、幀過濾和源匹配、頻率合成器(FS)、命令選通處理器,定時(shí)器2(MAC定時(shí)器)
5.2RF內(nèi)核無線電RAM:為發(fā)送TXFIFO和接收RXFIFO分別分配128字節(jié)的FIFO,為幀過濾和源匹配存儲(chǔ)參數(shù)保留128字節(jié)。定時(shí)器2(MAC定時(shí)器):用于為無線電事件計(jì)時(shí),以捕獲輸入數(shù)據(jù)包的時(shí)間戳,這一定時(shí)器在睡眠模式下也保持計(jì)數(shù)。7RFERR中斷RF中斷5.2.1中斷CC2530無線射頻的工作涉及到CPU兩個(gè)中斷向量8RFERR中斷其功能是表示無線射頻的錯(cuò)誤情況,無線射頻內(nèi)核錯(cuò)誤表現(xiàn)為RFTXRFIO下溢或RXFIFO溢出,通過控制SFR寄存器的IEN0.RFERRIE位使能。并且在TCON.RFERRIF保存了RFERR中斷標(biāo)志位(即是否發(fā)生中斷),
5.2.1中斷RFERR中斷95.2.1中斷IEN0.RFERRIE//使能RF內(nèi)核錯(cuò)誤中斷IEN0|=0x01;RFERR中斷105.2.1中斷TCON.RFERRIF中斷標(biāo)志//判斷RFERRIF中斷是否發(fā)生if(RFERRIF=1){}RFERR中斷115.2.1中斷RF中斷RF中斷其功能是數(shù)據(jù)發(fā)送和接收中斷。RF中斷是上升沿觸發(fā)的,通過控制SFR寄存器的IEN2.RFIE位使能,并且在S1CON.RFIF保存了RFIF中斷標(biāo)志位125.2.1中斷RF中斷IEN2.RFIE//使能RF中斷IEN2|=0x01;135.2.1中斷RF中斷S1CON.RFIF中斷標(biāo)志//判斷RF一般中斷是否發(fā)生if((RFIF_1=1)&(RFIF_2=1)){…}145.2.2中斷寄存器RF內(nèi)核的兩個(gè)中斷源(RFERR和RF),是RF內(nèi)核中若干中斷源的組合,其中每個(gè)單獨(dú)的中斷源在RF內(nèi)核中有自己的中斷屏蔽寄存器和中斷標(biāo)志寄存器。中斷屏蔽寄存器中斷標(biāo)志寄存器155.2.2中斷寄存器中斷屏蔽寄存器RF中斷屏蔽寄存器RFIRQM0RF中斷屏蔽寄存器RFIRQM1RF錯(cuò)誤中斷屏蔽寄存器RFERRM
165.2.2中斷寄存器中斷屏蔽寄存器RF中斷屏蔽寄存器RFIRQM0//RXPKTDONE中斷位使能RFIRQM0|=(1<<6);175.2.2中斷寄存器中斷屏蔽寄存器RF中斷屏蔽寄存器RFIRQM1//TXPKTDONE中斷位使能RFIRQM1|=(1<<1);185.2.2中斷寄存器中斷屏蔽寄存器RF錯(cuò)誤中斷屏蔽寄存器RFERRM195.2.2中斷寄存器中斷標(biāo)志寄存器RFIRQF0RFIRQF1錯(cuò)誤中斷標(biāo)志寄存器RFIERRF
205.2.2中斷寄存器中斷標(biāo)志寄存器RFIRQF0//判斷RF一般中斷是否發(fā)生if((RFIRQF0&0x40){…}215.2.2中斷寄存器中斷標(biāo)志寄存器RFIRQF1225.2.2中斷寄存器中斷標(biāo)志寄存器RFIERRF
235.3FIFO訪問CC2530發(fā)送或接收數(shù)據(jù)是通過FIFO操作來進(jìn)行的。FIFO訪問可以分為TXFIFO訪問和RXFIFO訪問,其操作都是通過SFR寄存器的RFD操作進(jìn)行。當(dāng)寫入RFD寄存器時(shí),數(shù)據(jù)被寫入到TXFIFO,當(dāng)讀取數(shù)據(jù)RFD寄存器時(shí),數(shù)據(jù)從RXFIFO中讀出。
unsignedchari;signedchartx[]={"dh"};//將mac的內(nèi)容寫到RFD中for(i=0;i<3;i++){RFD=tx[i];}245.3.1RXFIFO訪問RXFIFO存儲(chǔ)器區(qū)域位于地址0x6000到0x607F,一共128字節(jié),在XREG存儲(chǔ)區(qū)域中是可以訪問的。RXFIFO可以保存一個(gè)或多個(gè)收到的幀,只要總字節(jié)數(shù)不大于128字節(jié)。有兩種方式確定RXFIFO中的字節(jié)數(shù):
讀RFD寄存器
讀RXFIFOCNT寄存器
255.3.1RXFIFO訪問讀RFD寄存器//通過RFD讀接收的數(shù)據(jù)長(zhǎng)度unsignedcharlen;len=RFD;265.3.1RXFIFO訪問讀RXFIFOCNT寄存器//通過RXFIFOCNT讀接收的數(shù)據(jù)長(zhǎng)度unsignedcharlen;len=RXFIFOCNT;通過RFD寄存器讀取的幀長(zhǎng)度為數(shù)據(jù)幀的“實(shí)際發(fā)送數(shù)據(jù)域+幀尾域”部分;通過RXFIFOCNT寄存器讀取的幀長(zhǎng)度為數(shù)據(jù)幀“幀長(zhǎng)度域+實(shí)際發(fā)送數(shù)據(jù)域+幀尾域”,由于幀長(zhǎng)度域占一個(gè)字節(jié),因此通過RXFIFOCNT寄存器讀出來的數(shù)據(jù)長(zhǎng)度比通過RFD寄存器讀出來的長(zhǎng)度多一個(gè)字節(jié)
275.3.2TXFIFO訪問TXFIFO存儲(chǔ)器區(qū)域位于地址0x6080到0x60FF,一共128字節(jié)。它在XREG存儲(chǔ)區(qū)域中是可以訪問的。在不產(chǎn)生TX下溢的情況下,幀數(shù)據(jù)可以在執(zhí)行TX命令選通之前或之后緩沖陰影部分的字節(jié)必須寫到TXFIFO的字節(jié),其他字節(jié)可以被忽略。寫入TXFIFO的幀數(shù)據(jù)根據(jù)AUTOCRC(CRC自動(dòng)校驗(yàn))是否啟用可以分為兩種情況:當(dāng)AUTOCRC為0時(shí),沒有啟動(dòng)硬件自動(dòng)檢測(cè);當(dāng)AUTOCRC為1時(shí),啟動(dòng)了硬件自動(dòng)檢測(cè)。
285.3.2TXFIFO訪問TXFIFO中的字節(jié)數(shù)存儲(chǔ)在TXFIFOCNT寄存器中,可以通過兩種方式來進(jìn)行TXFIFO的寫操作寫入RFD寄存器。由于幀緩沖總是開始于TXFIFO存儲(chǔ)器的起始地址,因此可以通過使能FRMCTRL1.IGNORE_TX_UNDERF位,直接將幀數(shù)據(jù)寫到無線電存儲(chǔ)器的RAM區(qū)域。本書中建議使用RFD寫數(shù)據(jù)到TXFIFO。不建議用此種操作295.4發(fā)送模式CC2530射頻的發(fā)送過程:發(fā)送器的控制幀的處理305.4.1TX控制在幀處理和報(bào)告狀態(tài)下,無線電有許多內(nèi)置的功能,這些功能可精確控制輸出幀的時(shí)序。在設(shè)置TX和RX的過程中可以通過寄存器來設(shè)置,且必須在TX和RX中同時(shí)設(shè)置
//設(shè)置TX抗混疊過濾器以獲得合適的帶寬TXFILTCFG=0x09;//調(diào)整AGC目標(biāo)值A(chǔ)GCCTRL1=0x15;//獲得最佳的EVMFSCAL1=0x00;315.4.2幀處理CC2530數(shù)據(jù)幀的基本結(jié)構(gòu)如下:同步頭需要傳輸?shù)臄?shù)據(jù)幀尾325.4.2幀處理同步頭幀引導(dǎo)序列幀開始界定符當(dāng)已經(jīng)發(fā)送了所需的幀引導(dǎo)序列字節(jié)數(shù),射頻部分會(huì)自動(dòng)發(fā)送1字節(jié)長(zhǎng)的SFD(幀開始界定符)。SFD是固定的,軟件不能改變其值。
335.4.2幀處理需要傳輸?shù)臄?shù)據(jù)LEN(幀長(zhǎng)度域):幀長(zhǎng)度域用于確定要發(fā)送多少個(gè)字節(jié)。MAC幀:MAC幀包括MHR(MAC幀頭)和MAC負(fù)載兩部分,是來自與MAC層的數(shù)據(jù)。當(dāng)發(fā)送了SFD,調(diào)制器開始從TXFIFO讀數(shù)據(jù),首先讀幀長(zhǎng)度域,然后是MHR(MAC幀頭)和MAC負(fù)載。
345.4.2幀處理幀尾寄存器FRMCTRL0.AUTOCRC控制位控制幀尾域的幀校驗(yàn)序列自動(dòng)產(chǎn)生,其中幀尾不寫入TXFIFO中,存儲(chǔ)在一個(gè)單獨(dú)的16位寄存器中。除了可能用于調(diào)試的目的,建議使能AUTOCRC。如果FRMCTRL.AUTOCRC=0,那么調(diào)制器期望在TXFIFO中找到FCS,所以軟件必須產(chǎn)生FCS,連同MAC負(fù)載一起寫到TXFIFO
FRMCTRL0幀處理寄存器355.4.2幀處理幀尾FRMCTRL0幀處理寄存器365.4.2幀處理數(shù)據(jù)幀的產(chǎn)生CC2530射頻部分產(chǎn)生并自動(dòng)傳輸物理層的同步頭,包括幀引導(dǎo)序列和幀開始界定符(SFD)。通過射頻部分傳輸幀長(zhǎng)度域和指定的字節(jié)數(shù),包括MAC幀頭和MAC負(fù)載。通過操作寄存器計(jì)算并自動(dòng)傳輸幀尾(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ù)*///接收幀長(zhǎng)度len=RFD;len&=0x7f;//將接收的數(shù)據(jù)寫入buf中for(i=0;i<len;i++){buf[i]=RFD;Delay(200);}395.5.2幀處理CC2530的接收器收到的幀結(jié)構(gòu)如下當(dāng)CC2530的射頻模塊接收到一個(gè)數(shù)據(jù)幀時(shí)執(zhí)行以下操作
移除同步頭:由CC2530射頻硬件部分檢測(cè)和移除收到的PHY同步頭(幀引導(dǎo)序列和SFD)。接收數(shù)據(jù)幀:通過操作寄存器接收幀長(zhǎng)度域規(guī)定的字節(jié)數(shù),(包括MHR和MAC負(fù)載)。幀過濾:通過操作寄存器可以實(shí)現(xiàn)幀過濾功能,拒絕接收目標(biāo)不明確的數(shù)據(jù)幀。405.5.2幀處理CC2530的接收器收到的幀結(jié)構(gòu)如下當(dāng)CC2530的射頻模塊接收到一個(gè)數(shù)據(jù)幀時(shí)執(zhí)行以下操作
匹配源地址:包括多達(dá)24個(gè)短地址的表,或12個(gè)擴(kuò)展IEEE地址。源地址存儲(chǔ)在無線電RAM中。自動(dòng)FCS檢查:通過操作寄存器可以選擇把自動(dòng)檢查的結(jié)果和其它狀態(tài)值(RSSI、LQI和源匹配結(jié)果)填入接收到的幀中。具有正確時(shí)序的自動(dòng)確認(rèn)傳輸:可以通過操作寄存器且正確設(shè)置幀未決位,基于源地址匹配和FCS校驗(yàn)的結(jié)果“匹配源地址”是符合IEEE802.15.4標(biāo)準(zhǔn)的,在直接操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收是可以不考慮此項(xiàng)操作的,即可以禁止幀過濾功能。
415.6CSMA/CA選通處理器CSMA/CA選通處理器提供控制CPU和無線射頻模塊之間的通信。CSMA/CA選通處理器通過SFR寄存器RFST以及XREG寄存器和CPU通信。本書中采用RFST寄存器和CPU進(jìn)行通信。
RFSTCSMA/CA選通處理寄存器//為RX使能并校準(zhǔn)頻率合成器RFST=0xe3;寫入RFST寄存器的指令為CC2530的RF指令集,操作RFST實(shí)現(xiàn)使能RX并校準(zhǔn)頻率合成器的操作指令碼為0xe3425.6CSMA/CA選通處理器以下內(nèi)容將實(shí)現(xiàn)任務(wù)描述5.D.1
,操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點(diǎn)發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點(diǎn)接收完數(shù)據(jù)后LED1閃爍
射頻初始化程序voidrf_init(){ //硬件CRC以及AUTO_ACK使能
FRMCTRL0|=(0x20|0x40); //設(shè)置TX抗混疊過濾器以獲得合適的帶寬
TXFILTCFG=0x09; //調(diào)整AGC目標(biāo)值
AGCCTRL1=0x15; //獲得最佳的EVM FSCAL1=0x00; //RXPKTDONE中斷位使能
RFIRQM0|=(1<<6); //RF中斷使能
IEN2|=(1<<0); //開中斷
EA=1; //信道選擇,選擇11信道
FREQCTRL=0x0b; //目標(biāo)地址過濾期間使用的短地址
SHORT_ADDR0=0x05; SHORT_ADDR1=0x00; //目標(biāo)地址過濾期間使用的PANID
PAN_ID0=0x22; PAN_ID1=0x00;
//清除RXFIFO緩沖區(qū)并復(fù)位解調(diào)器
RFST=0xed; //為RX使能并校準(zhǔn)頻率合成器
RFST=0xe3; //禁止幀過濾
FRMFILT0&=~(1<<0);}435.6CSMA/CA選通處理器以下內(nèi)容將實(shí)現(xiàn)任務(wù)描述5.D.1
,操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點(diǎn)發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點(diǎn)接收完數(shù)據(jù)后LED1閃爍
發(fā)送程序voidtx(){unsignedchari;signedchartx[]={"hello"};//為RX使能并校準(zhǔn)頻率合成器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ā)送的第一個(gè)字節(jié)是傳輸?shù)膸L(zhǎng)度RFD=5;
//將mac的內(nèi)容寫到RFD中for(i=0;i<5;i++){RFD=tx[i];}//打開RX中斷RFIRQM0|=(1<<6);//打開RF中斷IEN2|=(1<<0);//校準(zhǔn)后使能TXRFST=0xe9;//等待傳輸結(jié)束while(!(RFIRQF1&(1<<1)));//清除TXDONE狀態(tài)RFIRQF1=~(1<<1);//LED1燈狀態(tài)改變LED1=~LED1;//延時(shí)Delay(200);Delay(200);}445.6CSMA/CA選通處理器以下內(nèi)容將實(shí)現(xiàn)任務(wù)描述5.D.1
,操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點(diǎn)發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點(diǎn)接收完數(shù)據(jù)后LED1閃爍
接收程序//接收中斷處理#pragmavector=RF_VECTOR__interruptvoidrf_isr(void){ unsignedchari; //關(guān)中斷
IEN2&=~0X01; //接收幀結(jié)束
if(RFIRQF0&(1<<6)) { //接收幀長(zhǎng)度
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)容將實(shí)現(xiàn)任務(wù)描述5.D.1
,操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點(diǎn)發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點(diǎn)接收完數(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設(shè)置為輸出P1DIR|=0x03;//關(guān)閉LED1LED1=1;//關(guān)閉LED2LED2=1;//關(guān)閉總中斷EA=0;//設(shè)置時(shí)鐘頻率為32MSLEEPCMD&=~0x04;//等待時(shí)鐘穩(wěn)定while(!(SLEEPSTA&0x40));
CLKCONCMD&=~0x47;SLEEPCMD|=0x04;
//初始化RFrf_init();//中斷使能EA=1;//發(fā)送或等待接收中斷while(1){//宏定義RX#ifndefRX//如果沒有定義RX,開始發(fā)送tx();//延時(shí)Delay(200);Delay(200);//如果定義RX,等待接收中斷#else
#endif
}}465.6CSMA/CA選通處理器以下內(nèi)容將實(shí)現(xiàn)任務(wù)描述5.D.1
,操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送接收。發(fā)送節(jié)點(diǎn)發(fā)送完數(shù)據(jù)LED1燈閃爍,接收節(jié)點(diǎn)接收完數(shù)據(jù)后LED1閃爍
實(shí)驗(yàn)結(jié)果分別將發(fā)送程序與接收程序下載至兩個(gè)不同的設(shè)備中,首先打開發(fā)送設(shè)備,可以觀察到發(fā)送設(shè)備的LED1閃爍;然后打開接收設(shè)備,可以觀察到接收設(shè)備的LED1閃爍頻率和發(fā)送設(shè)備的LED1是相同的。如果將發(fā)送設(shè)備關(guān)掉,接收設(shè)備的LED1將停止閃爍。475.7IEEE802.15.4CC2530芯片的射頻發(fā)送和接收是通過操作寄存器來實(shí)現(xiàn)的,雖然直接操作寄存器可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收,但是直接操作寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收存在以下弊端:不能指定接收者,即一個(gè)接收設(shè)備可以接收任何一個(gè)發(fā)送者發(fā)來的數(shù)據(jù)。當(dāng)發(fā)送者比較多時(shí)會(huì)出現(xiàn)信道碰撞問題。不能建立個(gè)域網(wǎng)。?使用IEEE80215.4標(biāo)準(zhǔn)可以解決以上問題485.7.1IEEE802.15.4調(diào)制規(guī)范IEEE802.15.4的數(shù)字高頻調(diào)制使用2.4G直接序列擴(kuò)頻技術(shù)。
直接序列擴(kuò)頻(DirectSequenceSpreadSpectrum)工作方式,簡(jiǎn)稱直擴(kuò)方式(DSSS方式)。DSSS是直接用偽噪聲序列對(duì)載波進(jìn)行調(diào)制,要傳送的數(shù)據(jù)信息需要經(jīng)過信道編碼后,進(jìn)行調(diào)制。在接收機(jī)收到發(fā)射信號(hào)后,首先通過解調(diào)以便能夠及時(shí)恢復(fù)出數(shù)據(jù)信息,完成整個(gè)直擴(kuò)通信系統(tǒng)的信號(hào)接收。495.7.1IEEE802.15.4調(diào)制規(guī)范采用直接序列擴(kuò)頻系統(tǒng)的優(yōu)點(diǎn)如下抗干擾能力強(qiáng),且具有強(qiáng)的抗多徑干擾能力。對(duì)其他電臺(tái)干擾小,抗截獲能力強(qiáng)??梢酝l工作。便于實(shí)現(xiàn)多址通信。505.7.2IEEE802.15.4數(shù)據(jù)格式IEEE802.15.4定義了MAC層以及物理層的通信數(shù)據(jù)格式。其中,物理層的數(shù)據(jù)格式是在MAC協(xié)議數(shù)據(jù)單元格式前加上同步頭以及物理頭兩部分
同步頭包括幀引導(dǎo)序列和幀開始界定符。物理頭即幀長(zhǎng)度域。物理層服務(wù)數(shù)據(jù)單元(PSDU)即MAC協(xié)議數(shù)據(jù)單元(MPDU),包括以下幾部分:MAC頭、MAC載荷以及幀尾。515.7.3IEEE802.15.4射頻程序設(shè)計(jì)IEEE802.15.4射頻程序主要分為發(fā)送和接收兩部分。其主函數(shù)部分程序設(shè)計(jì)流程如下:525.7.3IEEE802.15.4射頻程序設(shè)計(jì)IEEE802.15.4射頻程序主要分為發(fā)送和接收兩部分。其操作過程如下:下載軟件包定義發(fā)送和接收選項(xiàng)修改程序535.7.3IEEE802.15.4射頻程序設(shè)計(jì)下載軟件包首先從TI的官方網(wǎng)站上下載srf05_cc2530軟件包,解壓后使用IAR打開CC2530BasicRFidesrf05_cc2530iarlight_switch.eww文件
從TI官方網(wǎng)站下載的srf05_cc2530軟件包,要求用IAR7.51A版本打開
545.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)為了實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的發(fā)送和接收需要對(duì)light_switch工程做如下改動(dòng):需要定義“發(fā)送”和“接收”兩個(gè)不同的工程選項(xiàng),本例程將“發(fā)送”定義為“SWITCH”,“接收”定義為“LIGHT”。以定義發(fā)送選項(xiàng)“SWITCH為例講解”555.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)點(diǎn)擊工程的工具欄的Project選項(xiàng),選擇下拉菜單中的“EditConfiguration…”選項(xiàng)
565.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)點(diǎn)擊EditConfiguration選項(xiàng)后,彈出Configurationfor“l(fā)ight_switch”對(duì)話框,點(diǎn)擊“New…”選項(xiàng)
575.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)彈出“NewConfiguration”的對(duì)話框后,在此對(duì)話框的“Name:”一欄中寫入“SWITCH”,點(diǎn)擊“OK”選項(xiàng)
585.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)可以看到在“Configurationfor‘light_switch’”對(duì)話框中已經(jīng)添加了“SWITCH”選項(xiàng)
595.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)以相同的方式添加“LIGHT”選項(xiàng),添加完成之后,在“l(fā)ight_switch”工程的“Workspace”的下拉菜單中可以看到添加了“SWITCH”和“LIGHT”選項(xiàng)605.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)選擇“LIGHT”選項(xiàng),右擊“l(fā)ight_switch-LIGHT”選擇“option”選項(xiàng),編輯“Options”選項(xiàng)615.7.3IEEE802.15.4射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)彈出“Optionfornode‘light_switch’”的對(duì)話框,在此對(duì)話框右側(cè)的“Category”一欄中選擇“C/C++Compiler”選項(xiàng),然后在左側(cè)選擇“Preprocessor”選項(xiàng),在“DefineSymbol:”一欄中添加宏定義“LIGH”,并點(diǎn)擊“OK”選項(xiàng)完成添加625.7.4發(fā)送過程修改程序?qū)ⅰ發(fā)ight_switch.c”文件下的main函數(shù)修改如下:voidmain(void){//模式定義為空uint8appMode=NONE;/***********RF配置********************///PANID設(shè)置basicRfConfig.panId=PAN_ID;//信道設(shè)置basicRfConfig.channel=RF_CHANNEL;//確認(rèn)請(qǐng)求basicRfConfig.ackRequest=TRUE;#ifdefSECURITY_CCM//安全選型設(shè)置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ù)修改如下://點(diǎn)亮LED1halLedSet(1);//等待S1按下while(halButtonPushed()!=HAL_BUTTON_1);//延時(shí)halMcuWaitMs(350);//如果定義了SWIH#ifdefSWTH//模式為按鍵模式appMode=SWITCH;#endif//如果定義了LIHT#ifdefLIHT//模式為L(zhǎng)IGHT模式appMode=LIGHT;#endif//如果模式為SWITCH模式,將調(diào)用appSwitch()函數(shù)if(appMode==SWITCH){appSwitch();}//如果為L(zhǎng)IGHT模式,將調(diào)用appLight()函數(shù)elseif(appMode==LIGHT){appLight();}//如果返回錯(cuò)誤將執(zhí)行閃燈命令HAL_ASSERT(FALSE);}645.7.4發(fā)送過程修改程序基于IEEE802.15.4點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)發(fā)送和接收,由于發(fā)送和接收需要符合IEEE802.15.4規(guī)范,因此在程序的編寫過程中首先要定義一些結(jié)構(gòu)體,比較重要的結(jié)構(gòu)體有兩個(gè):RF初始化結(jié)構(gòu)體basicRfCfg_t。MAC數(shù)據(jù)幀幀頭結(jié)構(gòu)體basicRfPktHdr_t。
655.7.4發(fā)送過程修改程序RF初始化結(jié)構(gòu)體basicRfCfg_t。typedefstruct{uint16myAddr;uint16panId;uint8channel;uint8ackRequest;#ifdefSECURITY_CCMuint8*securityKey;
uint8*securityNonce;#endif}basicRfCfg_t;源地址信息:為16位短地址
網(wǎng)絡(luò)PANID:16位信息
信道:取值為11~26
確認(rèn)請(qǐng)求:1接收確認(rèn)幀;0不接收
665.7.4發(fā)送過程修改程序MAC數(shù)據(jù)幀幀頭結(jié)構(gòu)體basicRfPktHdr_t
typedefstruct{uint8packetLength;uint8fcf0;uint8fcf1;uint8seqNumber;uint16panId;uint16destAddr;uint16srcAddr;#ifdefSECURITY_CCMuint8securityControl;uint8frameCounter[4];#endif}basicRfPktHdr_t;數(shù)據(jù)長(zhǎng)度
幀控制域低字節(jié)
幀控制域高字節(jié)
幀序號(hào)
PANID
源地址和目的地址
675.7.3發(fā)送過程修改程序發(fā)送過程:在主函數(shù)中判定發(fā)送模式和接收模式,如果為發(fā)送模式,將調(diào)用appSwitch()函數(shù)發(fā)送數(shù)據(jù),此函數(shù)的功能為實(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);}//關(guān)閉接收器basicRfReceiveOff();//每隔一秒鐘發(fā)送一個(gè)數(shù)據(jù)while(TRUE){//延時(shí)1sDelay();//發(fā)送函數(shù)basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH);}}685.7.4發(fā)送過程修改程序發(fā)送過程:在發(fā)送函數(shù)appSwitch()中調(diào)用了一個(gè)重要的函數(shù)basicRfSendPacket(),此函數(shù)在basic_rf.c文件中。basicRfSendPacket()實(shí)現(xiàn)將數(shù)據(jù)按照IEEE802.15.4的數(shù)據(jù)格式將數(shù)據(jù)發(fā)送出去,如果發(fā)送成功幀序號(hào)將加1。uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length){uint8mpduLength;uint8status;//如果接收器沒有打開將打開接收器
if(!txState.receiveOn){halRfReceiveOn();}//發(fā)送數(shù)據(jù)幀長(zhǎng)度
length=min(length,BASIC_RF_MAX_PAYLOAD_SIZE);//等待發(fā)送就緒
halRfWaitTransceiverReady();//關(guān)閉接收中斷
halRfDisableRxInterrupt();//獲得發(fā)送數(shù)據(jù)長(zhǎng)度
mpduLength=basicRfBuildMpdu(destAddr,pPayload,length);//將txbuffer寫入RFDhalRfWriteTxBuf(txMpdu,mpduLength);//打開RX中斷接收ACK幀
halRfEnableRxInterrupt();用來獲得發(fā)送數(shù)據(jù)的長(zhǎng)度。
695.7.4發(fā)送過程修改程序發(fā)送過程:basicRfBuildMpdu()
函數(shù)如下staticuint8basicRfBuildMpdu(uint16destAddr,uint8*pPayload,uint8payloadLength){uint8hdrLength,n;//按照MAC數(shù)據(jù)幀結(jié)構(gòu)添加幀頭
hdrLength=basicRfBuildHeader(txMpdu,destAddr,payloadLength);for(n=0;n<payloadLength;n++){//將要發(fā)送的信息傳遞給txMpdutxMpdu[hdrLength+n]=pPayload[n];}//返回幀長(zhǎng)度
returnhdrLength+payloadLength;}705.7.4發(fā)送過程修改程序發(fā)送過程:basicRfBuildHeader()函數(shù)按照IEEE802.15.4規(guī)范的數(shù)據(jù)幀結(jié)構(gòu)寫在用戶發(fā)送數(shù)據(jù)前添加數(shù)據(jù)MAC幀頭部分,MAC幀頭部分首先要判斷是否需要確認(rèn)幀回復(fù),需要確認(rèn)幀回復(fù)的MAC幀頭部分和不需要確認(rèn)幀回復(fù)的幀頭部分是不同的。basicRfBuildHeader()函數(shù)在basic_rf.c文件中,其代碼如下所示:
staticuint8basicRfBuildHeader(uint8*buffer,uint16destAddr,uint8payloadLength){basicRfPktHdr_t*pHdr;uint16fcf;pHdr=(basicRfPktHdr_t*)buffer;//計(jì)算幀長(zhǎng)度
pHdr->packetLength=payloadLength+BASIC_RF_PACKET_OVERHEAD_SIZE;/*判斷需不需要確認(rèn)幀回復(fù),如果需要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);//幀序號(hào)
pHdr->seqNumber=txState.txSeqNumber;//panId設(shè)置
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幀頭長(zhǎng)度
returnBASIC_RF_HDR_SIZE;}715.7.4發(fā)送過程修改程序發(fā)送過程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過hal_rf.c文件中的halRfWriteTxBuf()和halRfTransmit()函數(shù)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,halRfWriteTxBuf()函數(shù)實(shí)現(xiàn)將發(fā)送的數(shù)據(jù)寫入到RX中,halRfTransmit()函數(shù)實(shí)現(xiàn)在發(fā)送數(shù)據(jù)幀的同時(shí)檢測(cè)信道是否空閑。
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ù)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,halRfWriteTxBuf()函數(shù)實(shí)現(xiàn)將發(fā)送的數(shù)據(jù)寫入到RX中,halRfTransmit()函數(shù)實(shí)現(xiàn)在發(fā)送數(shù)據(jù)幀的同時(shí)檢測(cè)信道是否空閑。
halRfTransmit()函數(shù)如下
:uint8halRfTransmit(void){uint8status;//使能TX發(fā)送
ISTXON();//等待發(fā)送完成(檢測(cè)到接收一個(gè)完整的幀)
while(!(RFIRQF1&IRQ_TXDONE));//清標(biāo)志位
RFIRQF1=~IRQ_TXDONE;//發(fā)送成功返回SUCCESSstatus=SUCCESS;returnstatus;}735.7.4發(fā)送過程修改程序發(fā)送過程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過hal_rf.c文件中的halRfWriteTxBuf()和halRfTransmit()函數(shù)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,halRfWriteTxBuf()函數(shù)實(shí)現(xiàn)將發(fā)送的數(shù)據(jù)寫入到RX中,halRfTransmit()函數(shù)實(shí)現(xiàn)在發(fā)送數(shù)據(jù)幀的同時(shí)檢測(cè)信道是否空閑。
halRfWriteTxBuf()和halRfTransmit()函數(shù)是通過basicRfSendPacket()函數(shù)來觸發(fā)的
745.7.5接收過程接收過程在主函數(shù)中判定為接收模式時(shí),程序?qū)?zhí)行l(wèi)ight_switch.c文件中的接收函數(shù)appLight(),該函數(shù)對(duì)射頻進(jìn)行初始化,然后按照接收信息執(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()對(duì)射頻進(jìn)行初始化、配置信道、短地址信息和PANID,并且對(duì)中斷接收做了相應(yīng)的配置。其代碼如下所示:
uint8basicRfInit(basicRfCfg_t*pRfConfig){if(halRfInit()==FAILED)returnFAILED;//關(guān)閉所有中斷
halIntOff();//按照協(xié)議配置結(jié)構(gòu)體
pConfig=pRfConfig;rxi.pPayload=NULL;//接收狀態(tài)設(shè)置
txState.receiveOn=TRUE;//接收幀序號(hào)設(shè)置
txState.frameCounter=0;//設(shè)置信道
halRfSetChannel(pConfig->channel);/*向CC2520RAM中寫入源地址信息和PANID信息*/halRfSetShortAddr(pConfig->myAddr);halRfSetPanId(pConfig->panId);
//設(shè)置射頻中斷接收函數(shù)
halRfRxInterruptConfig(basicRfRxFrmDoneIsr);//開總中斷
halIntOn();returnSUCCESS;}765.7.5接收過程接收過程basic_rf.c文件中的basicRfRxFrmDoneIsr()函數(shù)為中斷接收函數(shù),在中斷接收函數(shù)中,除了接收數(shù)據(jù)外,還對(duì)接收到的數(shù)據(jù)進(jìn)行CRC校驗(yàn),其具體代碼如下所示:staticvoidbasicRfRxFrmDoneIsr(void){basicRfPktHdr_t*pHdr;uint8*pStatusWord;//配置MAC幀頭
pHdr=(basicRfPktHdr_t*)rxMpdu;//清接收中斷
halRfDisableRxInterrupt();//打開所有的中斷
halIntOn();//讀數(shù)據(jù)長(zhǎng)度
halRfReadRxBuf(&pHdr->packetLength,1);pHdr->packetLength&=BASIC_RF_PLD_LEN_MASK;
//如果是確認(rèn)幀(只有確認(rèn)幀是5個(gè)字節(jié))if(pHdr->packetLength==BASIC_RF_ACK_PACKET_SIZE){//讀數(shù)據(jù)幀
halRfReadRxBuf(&rxMpdu[1],pHdr->packetLength);/******確保地址信息為IEEE802.15.4所定義的類型******/ UINT16_NTOH(pHdr->panId); UINT16_NTOH(pHdr->destAddr); UINT16_NTOH(pHdr->srcAddr);
//是否需要確認(rèn)請(qǐng)求判斷,判斷幀控制域的確認(rèn)請(qǐng)求域是否為1rxi.ackRequest=!!(pHdr->fcf0&BASIC_RF_FCF_ACK_BM_L);//取出確認(rèn)幀的最后一個(gè)字節(jié)進(jìn)行CRC校驗(yàn)
pStatusWord=rxMpdu+4;775.7.5接收過程接收過程basic_rf.c文件中的basicRfRxFrmDoneIsr()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025交通事故致人死亡賠償協(xié)議書14篇
- 借款借貸合同協(xié)議書七篇
- 補(bǔ)水美容病因介紹
- 內(nèi)蒙古通遼市(2024年-2025年小學(xué)六年級(jí)語文)統(tǒng)編版能力評(píng)測(cè)(下學(xué)期)試卷及答案
- 全國(guó)賽課一等獎(jiǎng)初中統(tǒng)編版七年級(jí)道德與法治上冊(cè)單元思考與行動(dòng)《追求美好人生》精美課件
- (2024年)藝術(shù)學(xué)校建設(shè)項(xiàng)目可行性研究報(bào)告
- 【中職專用】中職對(duì)口高考-機(jī)電與機(jī)制類專業(yè)-核心課-模擬試卷1(河南適用)(答案版)
- 2023年天津市和平區(qū)高考語文三模試卷
- 2023年復(fù)合管道項(xiàng)目融資計(jì)劃書
- 蔬菜園藝工中級(jí)考試題
- 滬教版英語八年級(jí)上冊(cè)知識(shí)點(diǎn)歸納匯總
- 裝飾裝修工程售后服務(wù)具體措施
- 糖皮質(zhì)激素類藥物臨床應(yīng)用指導(dǎo)原則(2023年)
- 世界的海陸分布、世界的地形復(fù)習(xí)提綱
- 門診掛號(hào)系統(tǒng)實(shí)驗(yàn)報(bào)告
- 53工廠質(zhì)量保證能力要求00C-005
- 百家宴活動(dòng)方案
- 高一英語期末考試試卷分析
- 基于STM32單片機(jī)的智能澆花系統(tǒng)設(shè)計(jì)
- 汽車訂購(gòu)合同范本經(jīng)典版
- 雙梁抓斗橋式起重機(jī)大修施工方案【完整版】
評(píng)論
0/150
提交評(píng)論