CC2530无线中断接收问题

aadyx2010 2013-07-04 10:27:55
各位大虾,小弟初学zigbee,现在做了一个无线串口,问题是每次都只能进一次RF的接收中断,数据是正确的,接收到数据之后,连串口接收中断都进不去,全局只用了RF接收和串口接收中断,代码如下(两个班子烧同样的代码):


#include "include.h"
#include "wav.h"
#include "cmd.h"
#include "adc.h"

#define T1Base (Fosc/128/1000) //1ms注意溢出
uint T1TIME=300; //间隔时间长度
uint T1COUNT=0;



#define uint unsigned int
#define uchar unsigned char

#define Fosc 32000000
//#define datalen 1//20440


#define UART_CMD_LEN 3


void Delay(uint temp);

void RF_Init(void);//RF初始化
//RF 发数 长度= UART_CMD_LEN
void RF_Send(char* CmdData);

bit sendEN=0;




char txbuff[UART_CMD_LEN]={0x00};
char rxbuff[UART_CMD_LEN]={0x00};

char flag=0;
/*UART0通信初始化
-------------------------------------------------------*/
void Uart0Init(void)
{
//设置P0.2与P0.3时用
// P0SEL |= 0x0C; //初始化UART0端口,设置P0.2与P0.3为外部设备IO口
// PERCFG&= ~0x01; //选择UART0为可选位置一,即RXD接P0.2,TXD接P0.3

P1SEL |= (1<<4)|(1<<5); //初始化UART0端口,设置P1.4与P1.5为外部设备IO口
PERCFG|= (1<<0); //选择UART0为可选位置2,即RXD接P1.4,TXD接P1.5

U0CSR = 0xC0; //设置为UART模式,并使能接受器

U0GCR = 11;
U0BAUD = 216; //设置UART0波特率为115200bps

URX0IE=1; //使能接受中断
EA=1;
}



/*UART0发送字符串
-------------------------------------------------------*/
void senduart0(unsigned char *Data,unsigned char len)
{
unsigned char j=0;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
//换行
UTX0IF = 0;
}

/*UART0接收中断
-------------------------------------------------------*/
void Uart0Receive_Interrupt(void) interrupt URX0_VECTOR
{

static i=0;
EA=0;
URX0IF=0;
txbuff[i++]=U0DBUF;
U0DBUF=txbuff[i-1];
flag=1;
EA=1;

}

void delay(unsigned char time)
{
unsigned char i,j;
for(i=0;i<=time;i++)
{
for(j=0;j<=200;j++)
{

}
}
}

//RF初始化
void RF_Init(void)
{
// Enable auto ack and auto crc
FRMCTRL0 |= (0x20 | 0x40);

// Recommended RX settings
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;

//FRMFILT0=1; //帧过滤开启
//RFIRQM1 |= (1<<1);//TXDONE发生中断使能
//IEN2 |= (1<<0);

// enable RXPKTDONE interrupt
RFIRQM0 |= (1<<6);
// enable general RF interrupts
IEN2 |= (1<<0);


SHORT_ADDR0=TX_ADDR;
SHORT_ADDR1=TX_ADDR>>8;
PAN_ID0=(PAN_ID);
PAN_ID1=(PAN_ID>>8);
EA=1;
// RFST = 0xEd;
RFST = 0xed; /* ISFLUSHRX */ //
//RFST=0xED;
RFST = 0xe3; /* ISRXON */
delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000); delay(12000);
FRMFILT0&=~(1<<0);//禁止帧过滤
RFST = 0xED;//ISFLUSHRX()
RFST = 0xE3;//ISRXON()


}


//RF 发数 长度= UART_CMD_LEN
void RF_Send1(char* CmdData)
{
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 */
RFD=UART_CMD_LEN+2;
for (i = 0; i < UART_CMD_LEN; i++)
{

RFD = CmdData[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 RF_Send(char* CmdData)
{
char i=0;
// Uart0Send(1);
RFST =0xEE; //清发送缓冲

RFD=UART_CMD_LEN+2; //<<<<-----******注意
for(i=0;i<UART_CMD_LEN;i++)
{
RFD=CmdData[i];
}

RFST=0xe9; //写发送命令


while( (RFIRQF1&(1<<1)) ==0 ); //等待发送结束

// P1=~P1;
RFIRQF1=0;


}



void RF_Int(void) interrupt RF_VECTOR
{
unsigned char i,len;
EA = 0; /* disable global interrupt */
if (RFIRQF0 & (1<<6)) {
len = RFD;
len &= 0x7f;
for (i = 0; i < len; i++)
{
rxbuff[i] = RFD;
}
}
RFIRQF0 &= ~0x40; /* clear RXPKTDONE interrupt */
S1CON &=~0x03; /* clear general RF interrupt flag */
// IEN2 &=~(1<<0);
RFST=0xED;
senduart0(rxbuff,len);
U0DBUF=0xaa;
}



//T1初始化
void T1_Init(void)
{
T1CC0H=(T1Base)>>8;
T1CC0L=T1Base; //和晶振分频有关
T1CCTL0|=(1<<2);
T1CTL=0x0e; //128分频计数到T1CC0
T1IE=0;
EA=1;
}
void T1_Interrupt(void) interrupt T1_VECTOR
{
if(T1STAT&(1<<5)!=0)
{
T1COUNT++;
if(T1COUNT>=T1TIME)
{
sendEN=1;
T1COUNT=0;
}
}
}

//////////////////////////
void main(void)
{

//CLKCONCMD=0x80;
EA=0;
SLEEPCMD &= ~0x04;
while(!(SLEEPSTA & 0x40));
CLKCONCMD &= ~0x47;
SLEEPCMD |= 0x04;
Uart0Init();
IEN2|=1<<4;


//T1_Init();
//T1IE=1;
sendEN=0;

RF_Init();
EA=1;

while(1)
{

if(flag==1)
{

RF_Send(txbuff); //启动一次发射
flag=0;
//RF_Init();

}


}

}
...全文
1211 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LonganWang1983 2014-07-10
  • 打赏
  • 举报
回复
你的定时器开启中断后能正常运行RF吗?
rejoice818 2013-08-16
  • 打赏
  • 举报
回复
你好我买了2个CC2540想做传透,不过没找到任何这方面的资料,因为之前没接触过蓝牙,希望能分享些资料,我email:anson_x@smartmcu.com
aadyx2010 2013-08-06
  • 打赏
  • 举报
回复
呵呵,一起学习。这个问题解决了,很低级的错误,RF的接收终端里面没有开全局的中断,打开就一切正常了。
lingdufeng123 2013-08-01
  • 打赏
  • 举报
回复
楼主好运,俺也在学习呢

3,849

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧