第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

提交评论