版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章無(wú)線射頻與MAC層1本章目標(biāo)掌握RF內(nèi)核結(jié)構(gòu)掌握FIFO訪問(wèn)掌握CC2530無(wú)線發(fā)送模式掌握CC2530無(wú)線接收模式掌握程序設(shè)計(jì)方法2本章目標(biāo)掌握RF內(nèi)核結(jié)構(gòu)掌握FIFO訪問(wèn)掌握CC2530無(wú)線發(fā)送模式掌握CC2530無(wú)線接收模式掌握程序設(shè)計(jì)方法3CC2530是兼容標(biāo)準(zhǔn)射頻模塊的片上系統(tǒng)
5.1概述4RF內(nèi)核控制無(wú)線射頻模塊,并且在MCU和無(wú)線電之間提供一個(gè)接口,可以發(fā)出命令,讀取狀態(tài)和自動(dòng)對(duì)無(wú)線電事件排序。RF內(nèi)核包括以下幾局部:無(wú)線電控制狀態(tài)模塊〔FSM〕、調(diào)制器,解調(diào)器、幀過(guò)濾和源匹配、頻率合成器〔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,并且遵守標(biāo)準(zhǔn)解調(diào)器:負(fù)責(zé)從收到的信號(hào)中檢索無(wú)線數(shù)據(jù)。解調(diào)器的振幅信息由自動(dòng)增益控制使用,自動(dòng)增益控制調(diào)整模擬LAN的增益,使接收器內(nèi)的信號(hào)水平大約是個(gè)常量。5RF內(nèi)核控制無(wú)線射頻模塊,并且在MCU和無(wú)線電之間提供一個(gè)接口,可以發(fā)出命令,讀取狀態(tài)和自動(dòng)對(duì)無(wú)線電事件排序。RF內(nèi)核包括以下幾局部:無(wú)線電控制狀態(tài)模塊〔FSM〕、調(diào)制器,解調(diào)器、幀過(guò)濾和源匹配、頻率合成器〔FS〕、命令選通處理器,定時(shí)器2〔MAC定時(shí)器〕5.2RF內(nèi)核幀過(guò)濾和源匹配:其功能是支持RF內(nèi)核中的FSM模塊來(lái)執(zhí)行幀過(guò)濾和源地址匹配。頻率合成器:其功能是為RF信號(hào)產(chǎn)生載波。命令選通處理器:處理CPU所發(fā)出的命令。它包含一個(gè)24字節(jié)的程序存儲(chǔ)器,可以自動(dòng)執(zhí)行CSMA/CA機(jī)制。6RF內(nèi)核控制無(wú)線射頻模塊,并且在MCU和無(wú)線電之間提供一個(gè)接口,可以發(fā)出命令,讀取狀態(tài)和自動(dòng)對(duì)無(wú)線電事件排序。RF內(nèi)核包括以下幾局部:無(wú)線電控制狀態(tài)模塊〔FSM〕、調(diào)制器,解調(diào)器、幀過(guò)濾和源匹配、頻率合成器〔FS〕、命令選通處理器,定時(shí)器2〔MAC定時(shí)器〕5.2RF內(nèi)核無(wú)線電RAM:為發(fā)送TXFIFO和接收RXFIFO分別分配128字節(jié)的FIFO,為幀過(guò)濾和源匹配存儲(chǔ)參數(shù)保存128字節(jié)。定時(shí)器2〔MAC定時(shí)器〕:用于為無(wú)線電事件計(jì)時(shí),以捕獲輸入數(shù)據(jù)包的時(shí)間戳,這一定時(shí)器在睡眠模式下也保持計(jì)數(shù)。7RFERR中斷RF中斷5.2.1中斷CC2530無(wú)線射頻的工作涉及到CPU兩個(gè)中斷向量8RFERR中斷其功能是表示無(wú)線射頻的錯(cuò)誤情況,無(wú)線射頻內(nèi)核錯(cuò)誤表現(xiàn)為RFTXRFIO下溢或RXFIFO溢出,通過(guò)控制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ā)的,通過(guò)控制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)核中假設(shè)干中斷源的組合,其中每個(gè)單獨(dú)的中斷源在RF內(nèi)核中有自己的中斷屏蔽存放器和中斷標(biāo)志存放器。中斷屏蔽存放器中斷標(biāo)志存放器155.2.2中斷存放器中斷屏蔽存放器RF中斷屏蔽存放器RFIRQM0RF中斷屏蔽存放器RFIRQM1RF錯(cuò)誤中斷屏蔽存放器RFERRM165.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)志存放器RFIERRF205.2.2中斷存放器中斷標(biāo)志存放器RFIRQF0//判斷RF一般中斷是否發(fā)生if((RFIRQF0&0x40){…}215.2.2中斷存放器中斷標(biāo)志存放器RFIRQF1225.2.2中斷存放器中斷標(biāo)志存放器RFIERRF
235.3FIFO訪問(wèn)CC2530發(fā)送或接收數(shù)據(jù)是通過(guò)FIFO操作來(lái)進(jìn)行的。FIFO訪問(wèn)可以分為TXFIFO訪問(wèn)和RXFIFO訪問(wèn),其操作都是通過(guò)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訪問(wèn)RXFIFO存儲(chǔ)器區(qū)域位于地址0x6000到0x607F,一共128字節(jié),在XREG存儲(chǔ)區(qū)域中是可以訪問(wèn)的。RXFIFO可以保存一個(gè)或多個(gè)收到的幀,只要總字節(jié)數(shù)不大于128字節(jié)。有兩種方式確定RXFIFO中的字節(jié)數(shù):
讀RFD存放器讀RXFIFOCNT存放器255.3.1RXFIFO訪問(wèn)讀RFD存放器//通過(guò)RFD讀接收的數(shù)據(jù)長(zhǎng)度unsignedcharlen;len=RFD;265.3.1RXFIFO訪問(wèn)讀RXFIFOCNT存放器//通過(guò)RXFIFOCNT讀接收的數(shù)據(jù)長(zhǎng)度unsignedcharlen;len=RXFIFOCNT;通過(guò)RFD存放器讀取的幀長(zhǎng)度為數(shù)據(jù)幀的“實(shí)際發(fā)送數(shù)據(jù)域+幀尾域〞局部;通過(guò)RXFIFOCNT存放器讀取的幀長(zhǎng)度為數(shù)據(jù)幀“幀長(zhǎng)度域+實(shí)際發(fā)送數(shù)據(jù)域+幀尾域〞,由于幀長(zhǎng)度域占一個(gè)字節(jié),因此通過(guò)RXFIFOCNT存放器讀出來(lái)的數(shù)據(jù)長(zhǎng)度比通過(guò)RFD存放器讀出來(lái)的長(zhǎng)度多一個(gè)字節(jié)275.3.2TXFIFO訪問(wèn)TXFIFO存儲(chǔ)器區(qū)域位于地址0x6080到0x60FF,一共128字節(jié)。它在XREG存儲(chǔ)區(qū)域中是可以訪問(wèn)的。在不產(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í),沒(méi)有啟動(dòng)硬件自動(dòng)檢測(cè);當(dāng)AUTOCRC為1時(shí),啟動(dòng)了硬件自動(dòng)檢測(cè)。285.3.2TXFIFO訪問(wèn)TXFIFO中的字節(jié)數(shù)存儲(chǔ)在TXFIFOCNT存放器中,可以通過(guò)兩種方式來(lái)進(jìn)行TXFIFO的寫操作寫入RFD存放器。由于幀緩沖總是開(kāi)始于TXFIFO存儲(chǔ)器的起始地址,因此可以通過(guò)使能FRMCTRL1.IGNORE_TX_UNDERF位,直接將幀數(shù)據(jù)寫到無(wú)線電存儲(chǔ)器的RAM區(qū)域。本書(shū)中建議使用RFD寫數(shù)據(jù)到TXFIFO。不建議用此種操作295.4發(fā)送模式CC2530射頻的發(fā)送過(guò)程:發(fā)送器的控制幀的處理305.4.1TX控制在幀處理和報(bào)告狀態(tài)下,無(wú)線電有許多內(nèi)置的功能,這些功能可精確控制輸出幀的時(shí)序。在設(shè)置TX和RX的過(guò)程中可以通過(guò)存放器來(lái)設(shè)置,且必須在TX和RX中同時(shí)設(shè)置//設(shè)置TX抗混疊過(guò)濾器以獲得適宜的帶寬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)序列幀開(kāi)始界定符當(dāng)已經(jīng)發(fā)送了所需的幀引導(dǎo)序列字節(jié)數(shù),射頻局部會(huì)自動(dòng)發(fā)送1字節(jié)長(zhǎng)的SFD〔幀開(kāi)始界定符〕。SFD是固定的,軟件不能改變其值。335.4.2幀處理需要傳輸?shù)臄?shù)據(jù)LEN〔幀長(zhǎng)度域〕:幀長(zhǎng)度域用于確定要發(fā)送多少個(gè)字節(jié)。MAC幀:MAC幀包括MHR〔MAC幀頭〕和MAC負(fù)載兩局部,是來(lái)自與MAC層的數(shù)據(jù)。當(dāng)發(fā)送了SFD,調(diào)制器開(kāi)始從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ù)載一起寫到TXFIFOFRMCTRL0幀處理存放器355.4.2幀處理幀尾FRMCTRL0幀處理存放器365.4.2幀處理數(shù)據(jù)幀的產(chǎn)生CC2530射頻局部產(chǎn)生并自動(dòng)傳輸物理層的同步頭,包括幀引導(dǎo)序列和幀開(kāi)始界定符〔SFD〕。通過(guò)射頻局部傳輸幀長(zhǎng)度域和指定的字節(jié)數(shù),包括MAC幀頭和MAC負(fù)載。通過(guò)操作存放器計(jì)算并自動(dòng)傳輸幀尾〔FSC〕。375.5接收模式接收器的控制RX幀的處理
385.5.1RX控制一般接收數(shù)據(jù)是通過(guò)接收中斷來(lái)處理的,在發(fā)送數(shù)據(jù)完成之后,首先要翻開(kāi)接收中斷,接收中斷是通過(guò)存放器RFIRQM0的第6位RXPKTDONE和IEN2存放器的第0位來(lái)控制的/*翻開(kāi)接收中斷*///翻開(kāi)RX中斷RFIRQM0|=(1<<6);//翻開(kāi)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ù)幀:通過(guò)操作存放器接收幀長(zhǎng)度域規(guī)定的字節(jié)數(shù),〔包括MHR和MAC負(fù)載〕。幀過(guò)濾:通過(guò)操作存放器可以實(shí)現(xiàn)幀過(guò)濾功能,拒絕接收目標(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ǔ)在無(wú)線電RAM中。自動(dòng)FCS檢查:通過(guò)操作存放器可以選擇把自動(dòng)檢查的結(jié)果和其它狀態(tài)值〔RSSI、LQI和源匹配結(jié)果〕填入接收到的幀中。具有正確時(shí)序的自動(dòng)確認(rèn)傳輸:可以通過(guò)操作存放器且正確設(shè)置幀未決位,基于源地址匹配和FCS校驗(yàn)的結(jié)果“匹配源地址〞是符合標(biāo)準(zhǔn)的,在直接操作存放器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收是可以不考慮此項(xiàng)操作的,即可以禁止幀過(guò)濾功能。415.6CSMA/CA選通處理器CSMA/CA選通處理器提供控制CPU和無(wú)線射頻模塊之間的通信。CSMA/CA選通處理器通過(guò)SFR存放器RFST以及XREG存放器和CPU通信。本書(shū)中采用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ù)描述,操作存放器實(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抗混疊過(guò)濾器以獲得適宜的帶寬 TXFILTCFG=0x09; //調(diào)整AGC目標(biāo)值 AGCCTRL1=0x15; //獲得最正確的EVM FSCAL1=0x00; //RXPKTDONE中斷位使能 RFIRQM0|=(1<<6); //RF中斷使能 IEN2|=(1<<0); //開(kāi)中斷 EA=1; //信道選擇,選擇11信道 FREQCTRL=0x0b; //目標(biāo)地址過(guò)濾期間使用的短地址 SHORT_ADDR0=0x05; SHORT_ADDR1=0x00; //目標(biāo)地址過(guò)濾期間使用的PANID PAN_ID0=0x22; PAN_ID1=0x00; //去除RXFIFO緩沖區(qū)并復(fù)位解調(diào)器 RFST=0xed; //為RX使能并校準(zhǔn)頻率合成器 RFST=0xe3; //禁止幀過(guò)濾 FRMFILT0&=~(1<<0);}435.6CSMA/CA選通處理器以下內(nèi)容將實(shí)現(xiàn)任務(wù)描述,操作存放器實(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];}//翻開(kāi)RX中斷RFIRQM0|=(1<<6);//翻開(kāi)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ù)描述,操作存放器實(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ù)描述,操作存放器實(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//如果沒(méi)有定義RX,開(kāi)始發(fā)送tx();//延時(shí)Delay(200);Delay(200);//如果定義RX,等待接收中斷#else
#endif
}}465.6CSMA/CA選通處理器以下內(nèi)容將實(shí)現(xiàn)任務(wù)描述,操作存放器實(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è)備中,首先翻開(kāi)發(fā)送設(shè)備,可以觀察到發(fā)送設(shè)備的LED1閃爍;然后翻開(kāi)接收設(shè)備,可以觀察到接收設(shè)備的LED1閃爍頻率和發(fā)送設(shè)備的LED1是相同的。如果將發(fā)送設(shè)備關(guān)掉,接收設(shè)備的LED1將停止閃爍。47CC2530芯片的射頻發(fā)送和接收是通過(guò)操作存放器來(lái)實(shí)現(xiàn)的,雖然直接操作存放器可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收,但是直接操作存放器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收存在以下弊端:不能指定接收者,即一個(gè)接收設(shè)備可以接收任何一個(gè)發(fā)送者發(fā)來(lái)的數(shù)據(jù)。當(dāng)發(fā)送者比較多時(shí)會(huì)出現(xiàn)信道碰撞問(wèn)題。不能建立個(gè)域網(wǎng)。?使用IEEE80215.4標(biāo)準(zhǔn)可以解決以上問(wèn)題48調(diào)制標(biāo)準(zhǔn)的數(shù)字高頻調(diào)制使用2.4G直接序列擴(kuò)頻技術(shù)。直接序列擴(kuò)頻〔DirectSequenceSpreadSpectrum〕工作方式,簡(jiǎn)稱直擴(kuò)方式〔DSSS方式〕。DSSS是直接用偽噪聲序列對(duì)載波進(jìn)行調(diào)制,要傳送的數(shù)據(jù)信息需要經(jīng)過(guò)信道編碼后,進(jìn)行調(diào)制。在接收機(jī)收到發(fā)射信號(hào)后,首先通過(guò)解調(diào)以便能夠及時(shí)恢復(fù)出數(shù)據(jù)信息,完成整個(gè)直擴(kuò)通信系統(tǒng)的信號(hào)接收。49調(diào)制標(biāo)準(zhǔn)采用直接序列擴(kuò)頻系統(tǒng)的優(yōu)點(diǎn)如下抗干擾能力強(qiáng),且具有強(qiáng)的抗多徑干擾能力。對(duì)其他電臺(tái)干擾小,抗截獲能力強(qiáng)??梢酝l工作。便于實(shí)現(xiàn)多址通信。50數(shù)據(jù)格式定義了MAC層以及物理層的通信數(shù)據(jù)格式。其中,物理層的數(shù)據(jù)格式是在MAC協(xié)議數(shù)據(jù)單元格式前加上同步頭以及物理頭兩局部同步頭包括幀引導(dǎo)序列和幀開(kāi)始界定符。物理頭即幀長(zhǎng)度域。物理層效勞數(shù)據(jù)單元〔PSDU〕即MAC協(xié)議數(shù)據(jù)單元〔MPDU〕,包括以下幾局部:MAC頭、MAC載荷以及幀尾。51射頻程序設(shè)計(jì)射頻程序主要分為發(fā)送和接收兩局部。其主函數(shù)局部程序設(shè)計(jì)流程如下:52射頻程序設(shè)計(jì)射頻程序主要分為發(fā)送和接收兩局部。其操作過(guò)程如下:下載軟件包定義發(fā)送和接收選項(xiàng)修改程序53射頻程序設(shè)計(jì)下載軟件包首先從TI的官方網(wǎng)站上下載srf05_cc2530軟件包,解壓后使用IAR翻開(kāi)CC2530BasicRFidesrf05_cc2530iarlight_switch.eww文件從TI官方網(wǎng)站下載的srf05_cc2530軟件包,要求用IAR7.51A版本翻開(kāi)54射頻程序設(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為例講解〞55射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)點(diǎn)擊工程的工具欄的Project選項(xiàng),選擇下拉菜單中的“EditConfiguration…〞選項(xiàng)56射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)點(diǎn)擊EditConfiguration選項(xiàng)后,彈出Configurationfor“l(fā)ight_switch〞對(duì)話框,點(diǎn)擊“New…〞選項(xiàng)57射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)彈出“NewConfiguration〞的對(duì)話框后,在此對(duì)話框的“Name:〞一欄中寫入“SWITCH〞,點(diǎn)擊“OK〞選項(xiàng)58射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)可以看到在“Configurationfor‘light_switch’〞對(duì)話框中已經(jīng)添加了“SWITCH〞選項(xiàng)59射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)以相同的方式添加“LIGHT〞選項(xiàng),添加完成之后,在“l(fā)ight_switch〞工程的“Workspace〞的下拉菜單中可以看到添加了“SWITCH〞和“LIGHT〞選項(xiàng)60射頻程序設(shè)計(jì)定義發(fā)送和接收選項(xiàng)選擇“LIGHT〞選項(xiàng),右擊“l(fā)ight_switch-LIGHT〞選擇“option〞選項(xiàng),編輯“Options〞選項(xiàng)61射頻程序設(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ā)送過(guò)程修改程序?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ā)送過(guò)程修改程序?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ā)送過(guò)程修改程序基于點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)發(fā)送和接收,由于發(fā)送和接收需要符合標(biāo)準(zhǔn),因此在程序的編寫過(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ā)送過(guò)程修改程序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ā)送過(guò)程修改程序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ā)送過(guò)程修改程序發(fā)送過(guò)程:在主函數(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ā)送過(guò)程修改程序發(fā)送過(guò)程:在發(fā)送函數(shù)appSwitch〔〕中調(diào)用了一個(gè)重要的函數(shù)basicRfSendPacket〔〕,此函數(shù)在basic_rf.c文件中。basicRfSendPacket〔〕實(shí)現(xiàn)將數(shù)據(jù)按照的數(shù)據(jù)格式將數(shù)據(jù)發(fā)送出去,如果發(fā)送成功幀序號(hào)將加1。uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length){uint8mpduLength;uint8status;//如果接收器沒(méi)有翻開(kāi)將翻開(kāi)接收器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);//翻開(kāi)RX中斷接收ACK幀halRfEnableRxInterrupt();用來(lái)獲得發(fā)送數(shù)據(jù)的長(zhǎng)度。
695.7.4發(fā)送過(guò)程修改程序發(fā)送過(guò)程: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ā)送過(guò)程修改程序發(fā)送過(guò)程:basicRfBuildHeader〔〕函數(shù)按照標(biāo)準(zhǔn)的數(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;/*****確保地址信息為所定義的類型*********/UINT16_HTON(pHdr->panId);UINT16_HTON(pHdr->destAddr);UINT16_HTON(pHdr->srcAddr);//返回值為MAC幀頭長(zhǎng)度returnBASIC_RF_HDR_SIZE;}715.7.4發(fā)送過(guò)程修改程序發(fā)送過(guò)程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過(guò)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ā)送過(guò)程修改程序發(fā)送過(guò)程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過(guò)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ā)送過(guò)程修改程序發(fā)送過(guò)程:數(shù)據(jù)的發(fā)送和接收函數(shù)是通過(guò)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ù)是通過(guò)basicRfSendPacket〔〕函數(shù)來(lái)觸發(fā)的745.7.5接收過(guò)程接收過(guò)程在主函數(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);}//翻開(kāi)射頻接收器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接收過(guò)程接收過(guò)程在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);//開(kāi)總中斷
halIntOn();returnSUCCESS;}765.7.5接收過(guò)程接收過(guò)程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();//翻開(kāi)所有的中斷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);/******確保地址信息為所定義的類型******/ UINT16_NTOH(pHdr->panId); UINT16_NTOH(pHdr->destAddr); UINT16_NTOH(pHdr->srcAddr);
//是否需要確認(rèn)請(qǐng)求判斷,判斷幀控制域確實(shí)認(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接收過(guò)程接收過(guò)程basic_rf.c文件中的basicRfRxFrmDoneIsr()函數(shù)為中斷接收函數(shù),在中斷接
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026河南安陽(yáng)市兵役登記參考筆試題庫(kù)附答案解析
- 2025中國(guó)資源循環(huán)集團(tuán)機(jī)動(dòng)車有限公司崗位招聘【社招】備考筆試試題及答案解析
- 2026年春季學(xué)期廣西南寧市第四十七中學(xué)招聘?jìng)淇伎荚囋囶}及答案解析
- 《去游樂(lè)園》數(shù)學(xué)課件教案
- 2025年12月江蘇南京江北新區(qū)教育局所屬部分事業(yè)單位招聘教師20人備考筆試題庫(kù)及答案解析
- 2026中國(guó)農(nóng)業(yè)科學(xué)院第一批統(tǒng)一招聘模擬筆試試題及答案解析
- 2025年甘肅省張掖市山丹縣招聘城鎮(zhèn)公益性崗位人員33人模擬筆試試題及答案解析
- 2025黑龍江雞西社會(huì)福利院招聘公益崗位就業(yè)人員7人參考考試試題及答案解析
- 2025貴州黔西南州興義市消防救援大隊(duì)招錄專職消防員招錄20人參考考試試題及答案解析
- 2025中國(guó)農(nóng)業(yè)科學(xué)院鄭州果樹(shù)研究所鄭果所桃資源與育種創(chuàng)新團(tuán)隊(duì)招聘2人(河南)參考考試試題及答案解析
- 2026成方金融信息技術(shù)服務(wù)有限公司校園招聘5人考試題庫(kù)附答案
- 車輛租賃服務(wù)協(xié)議書(shū)
- 2025安徽安慶市公安機(jī)關(guān)招聘警務(wù)輔助人員418人備考筆試題庫(kù)及答案解析
- 2025廣東廣州市黃埔區(qū)招聘社區(qū)專職工作人員50人(第二次)參考筆試題庫(kù)及答案解析
- 2024年廣州市南沙區(qū)南沙街道社區(qū)專職招聘考試真題
- 2026年牡丹江大學(xué)單招職業(yè)技能考試題庫(kù)新版
- 國(guó)家開(kāi)放大學(xué)22517《社區(qū)工作》(統(tǒng)設(shè)課)期末終考題庫(kù)
- 惡性胸腹腔積液病人護(hù)理
- 國(guó)家能源集團(tuán)陸上風(fēng)電項(xiàng)目通 用造價(jià)指標(biāo)(2025年)
- 學(xué)堂在線 雨課堂 學(xué)堂云 中國(guó)建筑史-元明清與民居 期末考試答案
- MOOC 國(guó)際商務(wù)-暨南大學(xué) 中國(guó)大學(xué)慕課答案
評(píng)論
0/150
提交評(píng)論