版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章无线射频与MAC层1本章目标掌握RF内核结构掌握FIFO访问掌握CC2530无线发送模式掌握CC2530无线接收模式掌握程序设计方法2本章目标掌握RF内核结构掌握FIFO访问掌握CC2530无线发送模式掌握CC2530无线接收模式掌握程序设计方法3CC2530是兼容标准射频模块的片上系统
5.1概述4RF内核控制无线射频模块,并且在MCU和无线电之间提供一个接口,可以发出命令,读取状态和自动对无线电事件排序。RF内核包括以下几局部:无线电控制状态模块〔FSM〕、调制器,解调器、帧过滤和源匹配、频率合成器〔FS〕、命令选通处理器,定时器2〔MAC定时器〕5.2RF内核FSM模块的主要功能包括控制RF收发器的状态、发送和接收FIFO,以及大局部动态受控的模拟信号,比方模拟模块的上电/掉电调制器:将原始数据转换为I/Q〔同相/正交〕信号发送到发送器DAC,并且遵守标准解调器:负责从收到的信号中检索无线数据。解调器的振幅信息由自动增益控制使用,自动增益控制调整模拟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错误中断屏蔽存放器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一般中断是否发生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负载一起写到TXFIFOFRMCTRL0帧处理存放器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校验的结果“匹配源地址〞是符合标准的,在直接操作存放器实现数据的发送和接收是可以不考虑此项操作的,即可以禁止帧过滤功能。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选通处理器以下内容将实现任务描述,操作存放器实现数据的发送接收。发送节点发送完数据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选通处理器以下内容将实现任务描述,操作存放器实现数据的发送接收。发送节点发送完数据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选通处理器以下内容将实现任务描述,操作存放器实现数据的发送接收。发送节点发送完数据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选通处理器以下内容将实现任务描述,操作存放器实现数据的发送接收。发送节点发送完数据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选通处理器以下内容将实现任务描述,操作存放器实现数据的发送接收。发送节点发送完数据LED1灯闪烁,接收节点接收完数据后LED1闪烁实验结果分别将发送程序与接收程序下载至两个不同的设备中,首先翻开发送设备,可以观察到发送设备的LED1闪烁;然后翻开接收设备,可以观察到接收设备的LED1闪烁频率和发送设备的LED1是相同的。如果将发送设备关掉,接收设备的LED1将停止闪烁。47CC2530芯片的射频发送和接收是通过操作存放器来实现的,虽然直接操作存放器可以实现数据的发送和接收,但是直接操作存放器实现数据的发送和接收存在以下弊端:不能指定接收者,即一个接收设备可以接收任何一个发送者发来的数据。当发送者比较多时会出现信道碰撞问题。不能建立个域网。?使用IEEE80215.4标准可以解决以上问题48调制标准的数字高频调制使用2.4G直接序列扩频技术。直接序列扩频〔DirectSequenceSpreadSpectrum〕工作方式,简称直扩方式〔DSSS方式〕。DSSS是直接用伪噪声序列对载波进行调制,要传送的数据信息需要经过信道编码后,进行调制。在接收机收到发射信号后,首先通过解调以便能够及时恢复出数据信息,完成整个直扩通信系统的信号接收。49调制标准采用直接序列扩频系统的优点如下抗干扰能力强,且具有强的抗多径干扰能力。对其他电台干扰小,抗截获能力强。可以同频工作。便于实现多址通信。50数据格式定义了MAC层以及物理层的通信数据格式。其中,物理层的数据格式是在MAC协议数据单元格式前加上同步头以及物理头两局部同步头包括帧引导序列和帧开始界定符。物理头即帧长度域。物理层效劳数据单元〔PSDU〕即MAC协议数据单元〔MPDU〕,包括以下几局部:MAC头、MAC载荷以及帧尾。51射频程序设计射频程序主要分为发送和接收两局部。其主函数局部程序设计流程如下:52射频程序设计射频程序主要分为发送和接收两局部。其操作过程如下:下载软件包定义发送和接收选项修改程序53射频程序设计下载软件包首先从TI的官方网站上下载srf05_cc2530软件包,解压后使用IAR翻开CC2530BasicRFidesrf05_cc2530iarlight_switch.eww文件从TI官方网站下载的srf05_cc2530软件包,要求用IAR7.51A版本翻开54射频程序设计定义发送和接收选项为了实现点对点的发送和接收需要对light_switch工程做如下改动:需要定义“发送〞和“接收〞两个不同的工程选项,本例程将“发送〞定义为“SWITCH〞,“接收〞定义为“LIGHT〞。以定义发送选项“SWITCH为例讲解〞55射频程序设计定义发送和接收选项点击工程的工具栏的Project选项,选择下拉菜单中的“EditConfiguration…〞选项56射频程序设计定义发送和接收选项点击EditConfiguration选项后,弹出Configurationfor“light_switch〞对话框,点击“New…〞选项57射频程序设计定义发送和接收选项弹出“NewConfiguration〞的对话框后,在此对话框的“Name:〞一栏中写入“SWITCH〞,点击“OK〞选项58射频程序设计定义发送和接收选项可以看到在“Configurationfor‘light_switch’〞对话框中已经添加了“SWITCH〞选项59射频程序设计定义发送和接收选项以相同的方式添加“LIGHT〞选项,添加完成之后,在“light_switch〞工程的“Workspace〞的下拉菜单中可以看到添加了“SWITCH〞和“LIGHT〞选项60射频程序设计定义发送和接收选项选择“LIGHT〞选项,右击“light_switch-LIGHT〞选择“option〞选项,编辑“Options〞选项61射频程序设计定义发送和接收选项弹出“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发送过程修改程序基于点对点的数据发送和接收,由于发送和接收需要符合标准,因此在程序的编写过程中首先要定义一些结构体,比较重要的结构体有两个: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〔〕实现将数据按照的数据格式将数据发送出去,如果发送成功帧序号将加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〔〕函数按照标准的数据帧结构写在用户发送数据前添加数据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;/*****确保地址信息为所定义的类型*********/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);/******确保地址信息为所定义的类型******/ 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北武汉市大型国有企业春季校园招聘笔试参考题库及答案解析
- 2026上海市质子重离子医院上海市质子重离子临床技术研发中心招聘3人笔试参考题库及答案解析
- 2026年山东省事业单位招聘笔试参考试题及答案解析
- 2025年邯郸市峰峰矿区事业单位招聘笔试试题及答案解析
- 2026年昆明市国有资产管理有限公司校园招聘考试模拟试题及答案解析
- 2026年中国石油大庆油田有限责任公司校园招聘笔试参考试题及答案解析
- 2026年贵州联通校园招聘笔试备考题库及答案解析
- 2026年吐鲁番市高昌区事业单位招聘笔试备考试题及答案解析
- 重症肺癌的国际共识重点2026
- 公路改建项目二级公路工程圆管涵专项施工方案
- 2025年陕西、山西、宁夏、青海四省(陕晋宁青)高考 政治真题试卷 附答案
- 介入导管护理
- 多层钢筋混凝土框架结构的设计与优化
- 8D培训试题和答案
- TOPCon 电池无银化进展-蒋秀林
- 人工智能数据标注试题及答案
- 外协喷漆协议合同模板
- DL∕T 1917-2018 电力用户业扩报装技术规范
- 四型干部建设方案
- JCT587-2012 玻璃纤维缠绕增强热固性树脂耐腐蚀立式贮罐
- 2023年上海奉贤区高三二模作文解析(质疑比相信更难) 上海市高三语文二模作文【范文批注+能力提升】
评论
0/150
提交评论