3,846
社区成员
发帖
与我相关
我的任务
分享
#include "ioCC2530.h"
#define led1 P1_0
#define led2 P1_4
#define uint8 unsigned char
#define uint16 unsigned int
#define RF_FCF_NOACK 0x8841 //不要求应答
#define RF_FCF_ACK 0x8861 //要求接收方发送应答帧
#define RF_NOACK_FLAGE 1 //不要求应答标志
#define dest_PanID 0x0001
#define dest_Addr 0x0001
#define src_PanID 0x0001
#define src_Addr 0x0002
static uint8 RfPktHdr_Length=12;
static uint8 buf[128];
uint8 len=0; //帧长度
static uint8 Len_Frame=0; //帧长度
static uint8 rxMpdu[128]; //帧数据
typedef struct {
uint8 packetLength; //包的长度
uint8 fcf0; // Frame control field LSB帧控制域低字节
uint8 fcf1; // Frame control field MSB帧控制域高字节
uint8 seqNumber; //序列号
uint16 destPanId; //目的PANID
uint16 destAddr; //目的地址
uint16 srcPanId; //源PANID
uint16 srcAddr; //源地址
} RfPktHdr_t;
void tx();
void delay(uint16 time)
{
uint16 i,j;
for(i=0;i<=time;i++)
{
for(j=0;j<=200;j++)
{}
}
}
void rf_init()//初始化
{
FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;
/* enable RXPKTDONE interrupt */
RFIRQM0 |= (1<<6);
/* enable general RF interrupts */
IEN2 |= (1<<0);
FREQCTRL = 0x0b; /* channel 11 */
SHORT_ADDR0 = 0x05;
SHORT_ADDR1 = 0x00;
PAN_ID0 = 0x22; /* MUST set, or even can't receive broadcast message */
PAN_ID1 = 0x00;
RFST = 0xed; /* ISFLUSHRX */ //
RFST=0xEC;
RFST = 0xe3; /* ISRXON */
delay(120);
FRMFILT0&=~(1<<0);//禁止帧过滤
RFST = 0xEC;//ISFLUSHRX()
RFST = 0xE3;//ISRXON()
}
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void) //节点2中的主要功能函数
{
unsigned char e, i;
e = EA;
EA = 0; /* disable global interrupt */
if (RFIRQF0 & (1<<6)) {
len = RFD;
len &= 0x7f;
for (i = 0; i < len; i++) {
buf[i] = RFD;
}
buf[i]='\0';
led1 =!led1;
}
RFIRQF0 &= ~0x40; /* clear RXPKTDONE interrupt */
S1CON &=~0x03; /* clear general RF interrupt flag */
// IEN2 &=~(1<<0);
RFST=0xEC;
EA = e; /* restore global interrupt state */
// tx();
}
uint8 MakeFrame(uint8 *data,uint8 length,uint8 seqNumber)//节点1发送前组帧
{
RfPktHdr_t *RfHead;//帧头
uint16 fcf;
uint8 i;
RfHead=(RfPktHdr_t*)rxMpdu;
Len_Frame=RfPktHdr_Length+length;//帧的长度
RfHead->packetLength=Len_Frame;
fcf=(RF_NOACK_FLAGE) ? RF_FCF_NOACK : RF_FCF_ACK;
RfHead->fcf0= fcf & 0xff;
RfHead->fcf1= (fcf>>8) & 0xff;
RfHead->seqNumber=seqNumber;
RfHead->destPanId=dest_PanID;
RfHead->destAddr=dest_Addr;
RfHead->srcPanId=src_PanID;
RfHead->srcAddr=src_Addr;
for(i=0;i<length;i++)
{
rxMpdu[RfPktHdr_Length+i]=data[i];//帧数据中接入实际数据
}
return Len_Frame;
}
void tx()//发送函数
{
unsigned char i;
RFST = 0xe3; /* ISRXON */
/* wait for SFD not active and TX_Active not active */
while (FSMSTAT1 & ((1<<1) | (1<<5))); /* TX_ACTIVE | SFD */
RFIRQM0 &= ~(1<<6); /* disable RXPKTDONE interrupt */
IEN2 &= ~(1<<0); /* disable general RF interrupts */
RFST = 0xee; /* ISFLUSHTX */
RFIRQF1 = ~(1<<1); /* clear TXDONE interrupt */
//RFD = 0xA7; /* the first byte to TX is the length of the frame */
for (i = 0; i < len; i++) {
RFD = rxMpdu[i];
}
/* trun on RX interrupt */
RFIRQM0 |= (1<<6);
IEN2 |= (1<<0);
RFST = 0xe9; /* ISTXON */
while (!(RFIRQF1 & (1<<1))); /* waiting for transmission to finish */
RFIRQF1 = ~(1<<1); /* clear TXDONE interrupt */
}
void main(void)
{
uint16 i=0;
uint16 j=0;
P1SEL &= ~(1<<0); //P1为普通 I/O 口
P2SEL &= ~(1<<0);
P1DIR |= 0x01; //P1.0 输出
led1=0;
EA = 0;
/* set main clock source to 32MHz */
SLEEPCMD &= ~0x04;
while(!(SLEEPSTA & 0x40));
CLKCONCMD &= ~0x47;
SLEEPCMD |= 0x04;
buf="123421321414141244";
rf_init();
len=MakeFrame(buf,18,0);
EA = 1; /* enable global interrupt */
while(1) {
/******************下面这些程序是发送节点1中的**************/
//led1=!led1;
tx();
for(i=0;i<10000;i++){
for(j=0;j<=100;j++)
{}
}
/******************上面这些程序是发送节点1中的**************/
}
}