CC2530无线中断接收问题
各位大虾,小弟初学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();
}
}
}