佚名通过本文主要向大家介绍了cc2530中文数据手册,cc2530数据手册,cc2530英文数据手册,cc2530中文数据,cc2530无线收发程序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: CC2530 数据收发,中断只能实现一次。
描述:
描述:
CC2530RF中断 CC2530RF中断射频c
各位仁兄,我想通过最低层的寄存器操作,在节点1上发送数据,在节点2上通过中断读取数据。可是,现在的问题是,节点2只能发生一次中断,通过调试,可知这次中断中读到的数据是正确的,但之后再没有中断发生。请大侠帮我看看是什么地方的问题。节点1和节点2的程序如下,节点1发送,2接收。
#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];
}