ZigBee学习之6—无线电2

ZigBee学习之6—无线电2

ID:39470846

大小:171.00 KB

页数:39页

时间:2019-07-04

上传者:U-2437
ZigBee学习之6—无线电2_第1页
ZigBee学习之6—无线电2_第2页
ZigBee学习之6—无线电2_第3页
ZigBee学习之6—无线电2_第4页
ZigBee学习之6—无线电2_第5页
资源描述:

《ZigBee学习之6—无线电2》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

#1楼主:【原创】ZigBee学习之6——无线电2文章发表于:2010-02-0511:17今天把TI的例子程序里的基本RF看了下,有的地方还没有完全看懂,发上来和大家分享一下/***********************************************************************************Filename:basic_rf.cDescription:BasicRFlibrary***********************************************************************************//************************************************************************************INCLUDES*///hal_int.h包含了控制中断的宏#include"hal_int.h"//UsinghalMcuWaitUs(),hal_mcu.h中是一些延时函数#include"hal_mcu.h"//通道编程的宏,以及硬件RF初始化,SECURITY_CCM宏是用来控制安全MAC的 #include"hal_rf.h"#ifdefSECURITY_CCM#include"hal_rf_security.h"#endif//basic_rf.h中定义了RF配置用的数据结构#include"basic_rf.h"#ifdefSECURITY_CCM#include"basic_rf_security.h"#endif#include"util.h"//Usingmin()#include"string.h"/************************************************************************************CONSTANTSANDDEFINES*///Packetandpacketpartlengths#definePKT_LEN_MIC8#definePKT_LEN_SECPKT_LEN_UNSEC+PKT_LEN_MIC#definePKT_LEN_AUTH8 #definePKT_LEN_ENCR24//Packetoverhead((framecontrolfield,sequencenumber,PANID,//destinationandsource)+(footer))//Notethatthelengthbyteitselfisnotincludedincludedinthepacketlength//MPDU的长度宏,(2字节幀控制域+1字节数据序列号+2字节PANID+2字节目标地址+2字节源地址+2字节MAC尾)#defineBASIC_RF_PACKET_OVERHEAD_SIZE((2+1+2+2+2)+(2))//MPDU最大有效载荷的长度(利用FIFO只有128字节空间),BASIC_RF_AUX_HDR_LENGTH和BASIC_RF_LEN_MIC是辅助安全头宏定义的长度分别是5和8,可以将其设置为0,即不具备安全功能#defineBASIC_RF_MAX_PAYLOAD_SIZE(127-BASIC_RF_PACKET_OVERHEAD_SIZE-BASIC_RF_AUX_HDR_LENGTH-BASIC_RF_LEN_MIC)//应答帧的长度宏(2字节帧首界定符+1字节数据序列号+2字节帧校验序列),不包括帧长度域#defineBASIC_RF_ACK_PACKET_SIZE5//MAC帧尾的长度宏#defineBASIC_RF_FOOTER_SIZE2#defineBASIC_RF_HDR_SIZE10//Thetimeittakesfortheacknowledgmentpackettobereceivedafterthe//datapackethasbeentransmitted.#defineBASIC_RF_ACK_DURATION(0.5*32*2*((4+1)+(1)+(2+1)+(2))) #defineBASIC_RF_SYMBOL_DURATION(32*0.5)//Thelengthbyte#defineBASIC_RF_PLD_LEN_MASK0x7F//帧控制域//帧类型子域:000信标帧//001数据帧//010应答帧//011MAC命令//100~110保留//安全允许子域:0帧无安全保护//1帧采用安全保护//帧待定子域:0传输没有附加数据的帧//1当前传输后有附加的数据要发送//应答请求子域:0不需要接收器发送应答帧//1需要接收器发送应答帧//内部PAN子域:决定MAC帧是在内部还是在其他PAN之间发送//0如果目的地址和源地址都存在帧将包括目标和源PAN标志域//1如果目的地址和源地址都存在帧不包括源PAN标志域//目的地址模式子域:若为0,并且帧类型没有指定这是个应答帧或信标帧且源地址域非0,则暗含此帧发送到PAN协调器将其PAN标志作为源PAN标志域 //源地址模式子域:若为0,且帧类型没有指定这是个应答帧或信标帧,目的地址不为0,则暗含此帧来自PAN协调器,用其PAN标志作为目的PAN标志域//00PAN标志器且地址域未提交//01保留//10地址域包含16位的短地址//11地址域包含64位的扩展地址//Framecontrolfield//16位短地址模式,数据帧,没有安全保护#defineBASIC_RF_FCF_NOACK0x8841#defineBASIC_RF_FCF_ACK0x8861#defineBASIC_RF_FCF_ACK_BM0x0020#defineBASIC_RF_FCF_BM(~BASIC_RF_FCF_ACK_BM)#defineBASIC_RF_SEC_ENABLED_FCF_BM0x0008//FramecontrolfieldLSB#defineBASIC_RF_FCF_NOACK_LLO_UINT16(BASIC_RF_FCF_NOACK)#defineBASIC_RF_FCF_ACK_LLO_UINT16(BASIC_RF_FCF_ACK)#defineBASIC_RF_FCF_ACK_BM_LLO_UINT16(BASIC_RF_FCF_ACK_BM)#defineBASIC_RF_FCF_BM_LLO_UINT16(BASIC_RF_FCF_BM)#defineBASIC_RF_SEC_ENABLED_FCF_BM_LLO_UINT16(BASIC_RF_SEC_ENABLED_FCF_BM) //AuxiliarySecurityheader#defineBASIC_RF_AUX_HDR_LENGTH5#defineBASIC_RF_LEN_AUTHBASIC_RF_PACKET_OVERHEAD_SIZE+BASIC_RF_AUX_HDR_LENGTH-BASIC_RF_FOOTER_SIZE#defineBASIC_RF_SECURITY_M2#defineBASIC_RF_LEN_MIC8#ifdefSECURITY_CCM#undefBASIC_RF_HDR_SIZE#defineBASIC_RF_HDR_SIZE15#endif//Footer#defineBASIC_RF_CRC_OK_BM0x80/************************************************************************************TYPEDEFS*///Thereceivestructtypedefstruct{uint8seqNumber;uint16srcAddr; uint16srcPanId;int8length;uint8*pPayload;uint8ackRequest;int8rssi;volatileuint8isReady;uint8status;}basicRfRxInfo_t;//Txstatetypedefstruct{uint8txSeqNumber;volatileuint8ackReceived;uint8receiveOn;uint32frameCounter;}basicRfTxState_t;//兼容IEEE802.15.4的MHR(MAC头)(2字节帧控制+1字节数据序列号+0~20字节地址信息)//BasicRFpacketheader(IEEE802.15.4)typedefstruct{uint8packetLength; uint8fcf0;//FramecontrolfieldLSBuint8fcf1;//FramecontrolfieldMSBuint8seqNumber;uint16panId;uint16destAddr;uint16srcAddr;#ifdefSECURITY_CCMuint8securityControl;uint8frameCounter[4];#endif}basicRfPktHdr_t;/************************************************************************************LOCALVARIABLES*/staticbasicRfRxInfo_trxi={0xFF};//MakesuresequencenumbersarestaticbasicRfTxState_ttxState={0x00};//initialisedanddistinct.staticbasicRfCfg_t*pConfig;staticuint8txMpdu[BASIC_RF_MAX_PAYLOAD_SIZE+BASIC_RF_PACKET_OVERHEAD_SIZE+1]; staticuint8rxMpdu[128];/************************************************************************************GLOBALVARIABLES*//************************************************************************************LOCALFUNCTIONS*//************************************************************************************@fnbasicRfBuildHeader**@briefBuildspacketheaderaccordingtoIEEE802.15.4frameformat**@parambuffer-Pointertobuffertowritetheheader*destAddr-destinationshortaddress*payloadLength-lengthofhigherlayerpayload **@returnuint8-lengthofheader*///构造兼容IEEE802.15.4的帧头staticuint8basicRfBuildHeader(uint8*buffer,uint16destAddr,uint8payloadLength){//声明一个指向MAC帧头结构的指针basicRfPktHdr_t*pHdr;uint16fcf;pHdr=(basicRfPktHdr_t*)buffer;//payloadLength为有效载荷的长度,即要发送的数据的长度//PopulatepacketheaderpHdr->packetLength=payloadLength+BASIC_RF_PACKET_OVERHEAD_SIZE;//pConfig为基本配置数据结构/*typedefstruct{uint16myAddr;uint16panId;uint8channel;uint8ackRequest;}basicRfCfg_t; *///pHdr->frameControlField=pConfig->ackRequest?BASIC_RF_FCF_ACK:BASIC_RF_FCF_NOACK;fcf=pConfig->ackRequest?BASIC_RF_FCF_ACK:BASIC_RF_FCF_NOACK;//分别得到16位数的低8位和高8位//#defineHI_UINT16(a)(((uint16)(a)>>8)&0xFF)//#defineLO_UINT16(a)((uint16)(a)&0xFF)pHdr->fcf0=LO_UINT16(fcf);pHdr->fcf1=HI_UINT16(fcf);//得到数据序列pHdr->seqNumber=txState.txSeqNumber;pHdr->panId=pConfig->panId;pHdr->destAddr=destAddr;pHdr->srcAddr=pConfig->myAddr;#ifdefSECURITY_CCM//AddsecuritytoFCF,lengthandsecurityheaderpHdr->fcf0|=BASIC_RF_SEC_ENABLED_FCF_BM_L;pHdr->packetLength+=PKT_LEN_MIC;pHdr->packetLength+=BASIC_RF_AUX_HDR_LENGTH;pHdr->securityControl=SECURITY_CONTROL; pHdr->frameCounter[0]=LO_UINT16(LO_UINT32(txState.frameCounter));pHdr->frameCounter[1]=HI_UINT16(LO_UINT32(txState.frameCounter));pHdr->frameCounter[2]=LO_UINT16(HI_UINT32(txState.frameCounter));pHdr->frameCounter[3]=HI_UINT16(HI_UINT32(txState.frameCounter));#endif//Makesurebytefieldsarenetworkbyteorder//这里把大的字节放到了前面,但有不是完全按从大到小的顺序排列字节,不知道为什么?UINT16_HTON(pHdr->panId);UINT16_HTON(pHdr->destAddr);UINT16_HTON(pHdr->srcAddr);//1字节长度,2字节FCF,1字节序列,2字节PanID,2字节目的地址,2字节源地址=10returnBASIC_RF_HDR_SIZE;}/************************************************************************************@fnbasicRfBuildMpdu **@briefBuildsmpdu(MACheader+payload)accordingtoIEEE802.15.4*frameformat**@paramdestAddr-Destinationshortaddress*pPayload-pointertobufferwithpayload*payloadLength-lengthofpayloadbuffer**@returnuint8-lengthofmpdu*///构造MPDUstaticuint8basicRfBuildMpdu(uint16destAddr,uint8*pPayload,uint8payloadLength){uint8hdrLength,n;//txMpdu是定义txMpdu[BASIC_RF_MAX_PAYLOAD_SIZE+BASIC_RF_PACKET_OVERHEAD_SIZE+1]hdrLength=basicRfBuildHeader(txMpdu,destAddr,payloadLength);//将有效载荷数据放入MPDU单元中for(n=0;n0){*pData++=RFD;length--;} }*///读取MPDU的长度//Readpayloadlength.halRfReadRxBuf(&pHdr->packetLength,1);//指定MPDU的长度字节的高位默认固定为0,所以去掉高位,得到长度真实值pHdr->packetLength&=BASIC_RF_PLD_LEN_MASK;//IgnoreMSB//Isthisanacknowledgmentpacket?//Onlyackpacketsmaybe5bytesintotal.if(pHdr->packetLength==BASIC_RF_ACK_PACKET_SIZE){//如果只有5个字节长度,则此帧为应答帧//ReadthepackethalRfReadRxBuf(&rxMpdu[1],pHdr->packetLength);//MakesurebytefieldsarechangedfromnetworktohostbyteorderUINT16_NTOH(pHdr->panId);UINT16_NTOH(pHdr->destAddr);UINT16_NTOH(pHdr->srcAddr);#ifdefSECURITY_CCMUINT32_NTOH(pHdr->frameCounter);#endif rxi.ackRequest=!!(pHdr->fcf0&BASIC_RF_FCF_ACK_BM_L);//条过RSSI指到CRC校验//ReadthestatuswordandcheckforCRCOKpStatusWord=rxMpdu+4;//IndicatethesuccessfulACKreceptionifCRCandsequencenumberOKif((pStatusWord[1]&BASIC_RF_CRC_OK_BM)&&(pHdr->seqNumber==txState.txSeqNumber)){txState.ackReceived=TRUE;}//No,itisdata}else{//Itisassumedthattheradiorejectspacketswithinvalidlength.//Subtractthenumberofbytesintheframeoverheadtogetactualpayload.rxi.length=pHdr->packetLength-BASIC_RF_PACKET_OVERHEAD_SIZE;#ifdefSECURITY_CCMrxi.length-=(BASIC_RF_AUX_HDR_LENGTH+BASIC_RF_LEN_MIC); authStatus=halRfReadRxBufSecure(&rxMpdu[1],pHdr->packetLength,rxi.length,BASIC_RF_LEN_AUTH,BASIC_RF_SECURITY_M);#elsehalRfReadRxBuf(&rxMpdu[1],pHdr->packetLength);#endif//MakesurebytefieldsarechangedfromnetworktohostbyteorderUINT16_NTOH(pHdr->panId);UINT16_NTOH(pHdr->destAddr);UINT16_NTOH(pHdr->srcAddr);#ifdefSECURITY_CCMUINT32_NTOH(pHdr->frameCounter);#endifrxi.ackRequest=!!(pHdr->fcf0&BASIC_RF_FCF_ACK_BM_L);//Readthesourceaddressrxi.srcAddr=pHdr->srcAddr;//Readthepacketpayloadrxi.pPayload=rxMpdu+BASIC_RF_HDR_SIZE; //ReadtheFCStogettheRSSIandCRCpStatusWord=rxi.pPayload+rxi.length;#ifdefSECURITY_CCMpStatusWord+=BASIC_RF_LEN_MIC;#endifrxi.rssi=pStatusWord[0];//NotifytheapplicationaboutthereceiveddatapacketiftheCRCisOK//Throwpacketifthepreviouspackethadthesamesequencenumberif((pStatusWord[1]&BASIC_RF_CRC_OK_BM)&&(rxi.seqNumber!=pHdr->seqNumber)){//Ifsecurityisusedcheckalsothatauthenticationpassed#ifdefSECURITY_CCMif(authStatus==SUCCESS){if((pHdr->fcf0&BASIC_RF_FCF_BM_L)==(BASIC_RF_FCF_NOACK_L|BASIC_RF_SEC_ENABLED_FCF_BM_L)){rxi.isReady=TRUE;}}#elseif(((pHdr->fcf0&(BASIC_RF_FCF_BM_L))==BASIC_RF_FCF_NOACK_L)){ rxi.isReady=TRUE;}#endif}rxi.seqNumber=pHdr->seqNumber;}//EnableRXframedoneinterruptagainhalIntOff();halRfEnableRxInterrupt();}/************************************************************************************GLOBALFUNCTIONS*//************************************************************************************@fnbasicRfInit**@briefInitialisebasicRFdatastructures.Setschannel,shortaddressand *PANidinthechipandconfiguresinterruptonpacketreception**@parampRfConfig-pointertoBASIC_RF_CONFIGstruct.*Thisstructmustbeallocatedbyhigherlayer*txState-filescopevariablethatkeepstxstateinfo*rxi-filescopevariableinfoextractedfromthelastincoming*frame**@returnnone*///几个重要的底层函数:/*RF初始化,调用hal_rf.c中的函数uint8halRfInit(void){uint8i;//turningonPowertoanalogpartofradioandwaitingforvoltageregulator.//模拟稳压器上电,延时250uS上电RFPWR=0x04;//等待ADI_RADIO_PD为0,也可以通过检测中断标志RFIF.IRQ_RREG_ON为1来等待稳压器稳定while(RFPWR&0x10); //根据需要设置RF功能,自动CRC,自动应答0x03//SettingforAUTOCRCandAUTOACKMDMCTRL0L|=(AUTO_CRC|AUTO_ACK);//打开自动收发转换,接收包后12个符号超时,接受应答包控制//TurningonAUTO_TX2RXFSMTC1=((FSMTC1&(~AUTO_TX2RX_OFF&~RX2RX_TIME_OFF))|ACCEPT_ACKPKT);//当SRXON发送时包接收不终止//TurningoffabortRxOnSrxon.FSMTC1&=~0x20;//FIFO门限设为最大值127//SetFIFOPthresholdtomaximumIOCFG0=0x7F;//增益这部分没看懂,好像是用来优化的//tuningadjustmentsforoptimalradioperformance;detailsavailableindatasheet*/RXCTRL0H=0x32;RXCTRL0L=0xF5;//TurningonreceivertogetoutputfromIF-ADC ISRXON();halMcuWaitUs(1);//运行随机数发生器//EnablerandomgeneratorADCCON1&=~0x0C;for(i=0;i<32;i++){RNDH=ADCTSTH;//ClockrandomgeneratorADCCON1|=0x04;}ISRFOFF();//EnableCC2591withHighGainModehalPaLnaInit();//打开接收中断halRfEnableRxInterrupt();returnSUCCESS; }//设置2.4G的RF通道。voidhalRfSetChannel(uint8channel){uint16freqMHz;//MIN_CHANNEL为11,CHANNEL_SPACING为5,在hal_rf.h中定义freqMHz=2405+((channel-MIN_CHANNEL)*CHANNEL_SPACING);//CalculatefrequencyfreqMHz-=(uint32)2048;//Subtract;datasheetsect14.16FSCTRLL=LO_UINT16(freqMHz);FSCTRLH&=~0x03;FSCTRLH|=(HI_UINT16(freqMHz)&0x03);}//设置16位短地址voidhalRfSetShortAddr(uint16shortAddr){SHORTADDRL=LO_UINT16(shortAddr);SHORTADDRH=HI_UINT16(shortAddr); }//设置PANIDvoidhalRfSetPanId(uint16panId){PANIDL=LO_UINT16(panId);PANIDH=HI_UINT16(panId);}*/uint8basicRfInit(basicRfCfg_t*pRfConfig){if(halRfInit()==FAILED)returnFAILED;//关闭所有中断halIntOff();//SettheprotocolconfigurationpConfig=pRfConfig;rxi.pPayload=NULL;txState.receiveOn=TRUE;txState.frameCounter=0; //设置通道//SetchannelhalRfSetChannel(pConfig->channel);//设置短地址和PANid//WritetheshortaddressandthePANIDtotheCC2520RAMhalRfSetShortAddr(pConfig->myAddr);halRfSetPanId(pConfig->panId);//ifsecurityisenabled,writekeyandnonce#ifdefSECURITY_CCMbasicRfSecurityInit(pConfig);#endif/*//设置接收中断函数在hal_types.h中有中断函数的定义:#defineHAL_ISR_FUNC_DECLARATION(f,v)_PRAGMA(vector=v)__near_func__interruptvoidf(void)#defineHAL_ISR_FUNC_PROTOTYPE(f,v)_PRAGMA(vector=v)__near_func__interruptvoidf(void) #defineHAL_ISR_FUNCTION(f,v)HAL_ISR_FUNC_PROTOTYPE(f,v);HAL_ISR_FUNC_DECLARATION(f,v)可以看出HAL_ISR_FUNCTION(f,v)其实就定义了中断函数了。然后中断函数如下:HAL_ISR_FUNCTION(macMcuRfIsr,RF_VECTOR){uint8rfim;uint8x;HAL_INT_LOCK(x);rfim=RFIM;if((RFIF&IRQ_FIFOP)&rfim){(pfISR)();//ExecutethecustomISRS1CON=0;RFIF&=~IRQ_FIFOP;}HAL_INT_UNLOCK(x);}进入中断后会检查中断类型,然后执行pfISR指针指向的中断函数。typedefvoid(*ISR_FUNC_PTR)(void); //定义中断服务程序的函数指针staticISR_FUNC_PTRpfISR=NULL;voidhalRfRxInterruptConfig(ISR_FUNC_PTRpf){uint8x;HAL_INT_LOCK(x);pfISR=pf;HAL_INT_UNLOCK(x);//#defineHAL_INT_LOCK(x)st((x)=EA;EA=0;)//#defineHAL_INT_UNLOCK(x)st(EA=(x);)//中断锁。实际上就是在操作之前关闭总的中断,等操作完成后再打开中断,避免产生不必要的中断}*///Setupreceiveinterrupt(receiveddataoracknowlegment)halRfRxInterruptConfig(basicRfRxFrmDoneIsr);//开所有中断halIntOn();returnSUCCESS;} /************************************************************************************@fnbasicRfSendPacket**@briefSendpacket**@paramdestAddr-destinationshortaddress*pPayload-pointertopayloadbuffer.Thisbuffermustbe*allocatedbyhigherlayer.*length-lengthofpayload*txState-filescopevariablethatkeepstxstateinfo*mpdu-filescopevariable.Bufferfortheframetosend**@returnbasicRFStatus_t-SUCCESSorFAILED*//*发送函数uint8halRfTransmit(void){uint8status;ISTXON();//Sending //Waitingfortransmissiontofinishwhile(!(RFIF&IRQ_TXDONE));RFIF=~IRQ_TXDONE;status=SUCCESS;returnstatus;}*/uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length){uint8mpduLength;uint8status;/*打开接收#defineFLUSH_RX_FIFO()st(ISFLUSHRX();ISFLUSHRX();)voidhalRfReceiveOn(void){//发送CPS指令FLUSH_RX_FIFO(); ISRXON();}*///Turnonreceiverifitsnotonif(!txState.receiveOn){halRfReceiveOn();}//Checkpacketlengthlength=min(length,BASIC_RF_MAX_PAYLOAD_SIZE);/*等待传输完成voidhalRfWaitTransceiverReady(void){while(RFSTATUS&(1<<1)|(1<<4)));}*///WaituntilthetransceiverisidlehalRfWaitTransceiverReady();//TurnoffRXframedoneinterrupttoavoidinterferenceontheSPIinterfacehalRfDisableRxInterrupt(); mpduLength=basicRfBuildMpdu(destAddr,pPayload,length);#ifdefSECURITY_CCMhalRfWriteTxBufSecure(txMpdu,mpduLength,length,BASIC_RF_LEN_AUTH,BASIC_RF_SECURITY_M);txState.frameCounter++;//Incrementframecounterfield#elsehalRfWriteTxBuf(txMpdu,mpduLength);#endif//TurnonRXframedoneinterruptforACKreceptionhalRfEnableRxInterrupt();//SendframewithCCA.returnFAILEDifnotsuccessfulif(halRfTransmit()!=SUCCESS){status=FAILED;}//Waitfortheacknowledgetobereceived,ifanyif(pConfig->ackRequest){txState.ackReceived=FALSE; //We'llenterRXautomatically,sojustwaituntilwecanbesurethattheackreceptionshouldhavefinished//Thetimeoutconsistsofa12-symbolturnaroundtime,theackpacketduration,andasmallmargin//BASIC_RF_SYMBOL_DURATION为0.5us,因为2MChip/s的速度是固定的halMcuWaitUs((12*BASIC_RF_SYMBOL_DURATION)+(BASIC_RF_ACK_DURATION)+(2*BASIC_RF_SYMBOL_DURATION)+10);//Ifanacknowledgmenthasbeenreceived(byRxFrmDoneIsr),theackReceivedflagshouldbesetstatus=txState.ackReceived?SUCCESS:FAILED;}else{status=SUCCESS;}//Turnoffthereceiverifitshouldnotcontinuetobeenabledif(!txState.receiveOn){halRfReceiveOff();}if(status==SUCCESS){txState.txSeqNumber++;} #ifdefSECURITY_CCMhalRfIncNonceTx();//Incrementnoncevalue#endifreturnstatus;}/************************************************************************************@fnbasicRfPacketIsReady**@briefCheckifanewpacketisreadytobereadbynexthigherlayer**@paramnone**@returnuint8-TRUEifapacketisreadytobereadbyhigherlayer*///检查包是否已准备好被上层读取uint8basicRfPacketIsReady(void) {returnrxi.isReady;}/***********************************************************************************@fnbasicRfReceive**@briefCopiesthepayloadofthelastincomingpacketintoabuffer**@parampRxData-pointertodatabuffertofill.Thisbuffermustbe*allocatedbyhigherlayer.*len-Numberofbytestoreadintobuffer*rxi-filescopevariableholdingtheinformationofthelast*incomingpacket**@returnuint8-numberofbytesactuallycopiedintobuffer*/uint8basicRfReceive(uint8*pRxData,uint8len,int16*pRssi){//Accessingsharedvariables->thisisacriticalregion//Criticalregionstart halIntOff();memcpy(pRxData,rxi.pPayload,min(rxi.length,len));if(pRssi!=NULL){if(rxi.rssi<128){*pRssi=rxi.rssi-halRfGetRssiOffset();}else{*pRssi=(rxi.rssi-256)-halRfGetRssiOffset();}}rxi.isReady=FALSE;halIntOn();//Criticalregionendreturnmin(rxi.length,len);}/***********************************************************************************@fnbasicRfGetRssi **@briefCopiesthepayloadofthelastincomingpacketintoabuffer**@paramnone*@returnint8-RSSIvalue*/int8basicRfGetRssi(void){if(rxi.rssi<128){//CC2430的rssi便宜为45左右returnrxi.rssi-halRfGetRssiOffset();}else{return(rxi.rssi-256)-halRfGetRssiOffset();}}/************************************************************************************@fnbasicRfReceiveOn**@briefTurnsonreceiveronradio **@paramtxState-filescopevariable**@returnnone*/voidbasicRfReceiveOn(void){txState.receiveOn=TRUE;halRfReceiveOn();}/************************************************************************************@fnbasicRfReceiveOff**@briefTurnsoffreceiveronradio**@paramtxState-filescopevariable**@returnnone*/ voidbasicRfReceiveOff(void){txState.receiveOn=FALSE;halRfReceiveOff();}/***********************************************************************************Copyright2007TexasInstrumentsIncorporated.Allrightsreserved.*/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭