TI中文支持网
TI专业的中文技术问题搜集分享网站

求大侠帮我分析 CC2530无协议栈通信 接收异常

代码如下,我有两块板子,一个发送,一个接受,代码共用,一个mode=MODE_RX,一个mode=MODE_TX。

发送端一直在发送,指示灯有闪烁。

接收端只有在上电的时候,有进入中断一次,灯闪烁一次,串口输出“RX”,然后就没有动静了。

在发送端不掉电的情况下,让接收端复位或者重新上电,依然是有进入中断一次,灯闪烁一次,串口输出“RX”,然后就没有动静了。

之前有调用过rf_receive_isr()去读接收数据,接收的数据就是TX发送的。

为什么接收端指闪烁一次灯呢?求大侠指点。

#include <ioCC2530.h>

#define uint  unsigned int 
#define uchar unsigned char

//定义控制灯的端口
#define LED1 P0_0//定义LED1为P1.0口控制
#define LED2 P0_1//定义LED4为P0.1口控制
#define LED1_ON LED1=0
#define LED1_OFF  LED1=1
#define LED2_ON LED2=0
#define LED2_OFF  LED2=1
//函数声明
void Delay(uint);//延时函数
void InitIO(void);//初始化LED控制IO口函数
void uart0_init(void);
void uart0_sendbuf(unsigned char *pbuf , int len);
void rf_init(void);
void rf_send(unsigned char *pbuf , int len);
void rf_receive_isr(void);

unsigned char hellostr[]={'H','e','l','l','o'};
unsigned char startstr[]={'S','t','a','r','t'};
unsigned char overstr[]={'O','v','e','r'};
unsigned char rf_rx_buf[128];

char mode=0;
#define MODE_TX 0
#define MODE_RX 1

char isRecieve=0;


void main(void)
{Delay(50000);CLKCONCMD &=(~0x47);Delay(50000);mode=MODE_RX;InitIO();//初始化uart0_init();rf_init();if(mode==MODE_RX){EA=1;}while(1)//死循环让循环内的代码不断执行{if(mode==MODE_TX){LED1_ON;Delay(50000);LED1_OFF;Delay(50000);uart0_sendbuf(startstr,5);rf_send(hellostr,5);uart0_sendbuf(overstr,4);Delay(50000);Delay(50000);Delay(50000);Delay(50000);Delay(50000);}else{if(isRecieve==1){LED2_ON;Delay(50000);LED2_OFF;Delay(50000);uart0_sendbuf("RX",2);isRecieve=0;}Delay(50000);Delay(50000);Delay(50000);Delay(50000);Delay(50000);}}

}

void Delay(uint n)//延时函数
{uint i;//定义一个变量i;for(i = 0;i<n;i++);for(i = 0;i<n;i++);for(i = 0;i<n;i++);for(i = 0;i<n;i++);for(i = 0;i<n;i++);
}


void InitIO(void) //初始化IO口程序
{P0DIR |= 0x03;  //P0_1定义为输出LED1=1;LED2=1;
}

void uart0_init(void)
{PERCFG = 0x00;// UART0 选择位置0 TX@P0.3 RX@P0.2P0SEL |= 0x0C;// P0.3 P0.2选择外设功能U0GCR |= 10;// 查表获得 U0GCR 和 U0BAUDU0BAUD |= 59;// 38400U0CSR |= 0xC0;// UART模式 接收器使能
}

void uart0_sendbuf(unsigned char *pbuf , int len)
{for( int i = 0 ; i < len ; i++){U0DBUF = *pbuf++;while(UTX0IF == 0);UTX0IF = 0;}
}

//RF初始化
void rf_init(void)
{TXPOWER= 0xD5;FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */FRMFILT0 = 0x0C;// 禁止接收过滤,即接收所有数据包TXFILTCFG = 0x09;AGCCTRL1 = 0x15;FSCAL1 = 0x00;FREQCTRL = 0x0B; /* channel 11 */if(mode==MODE_TX){}else{RFIRQM0 |= (1<<6);// 使能RF数据包接收中断IEN2 |= (1<<0);// 使能RF中断}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(50000);FRMFILT0&=~(1<<0);//禁止帧过滤
}

void rf_send( unsigned char *pbuf , int len)
{RFST = 0xE3;// RF接收使能 ISRXONwhile( FSMSTAT1 & (( 1<<1 ) | ( 1<<5 )));// 等待发送状态不活跃 并且 没有接收到SFDRFIRQM0 &= ~(1<<6);// 禁止接收数据包中断IEN2 &= ~(1<<0);// 清除RF全局中断RFST = 0xEE;// 清除发送缓冲区 ISFLUSHTXRFIRQF1 = ~(1<<1);// 清除发送完成标志// 填充缓冲区 填充过程需要增加2字节,CRC校验自动填充RFD = len + 2;for (int i = 0; i < len; i++){RFD = *pbuf++;}RFST = 0xE9;// 发送数据包 ISTXONwhile (!(RFIRQF1 &(1<<1) ));// 等待发送完成RFIRQF1 = ~(1<<1);// 清除发送完成标志位
}

void rf_receive_isr()
{int rf_rx_len = 0;unsigned char r[1] = {0};char crc_ok = 0;rf_rx_len = RFD - 2;// 长度去除两字节附加结果rf_rx_len &= 0x7F;for (int i = 0; i < rf_rx_len; i++){rf_rx_buf[i] = RFD;// 连续读取接收缓冲区内容}r[0] = RFD - 73;// 读取RSSI结果crc_ok = RFD;// 读取CRC校验结果 BIT7RFST = 0xEC;// 清除接收缓冲区if( crc_ok & 0x80 ){uart0_sendbuf( rf_rx_buf , rf_rx_len);// 串口发送uart0_sendbuf(r,1);}else{uart0_sendbuf("CRC Error",9);}
}

#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{unsigned char temp;temp = EA;EA = 0;// 接收到一个完整的数据包if (RFIRQF0 & ( 1<<6 )){//rf_receive_isr();// 调用接收中断处理函数isRecieve=1;RFST = 0xEC;S1CON &=~0x03;// 清除RF中断标志RFIRQF0 &= ~(1<<6);// 清除RF接收完成数据包中断}EA = temp;
}

VV:

看下RF相关的配置是否有问题,你可以参考basic rf中关于RF的配置。

CC2530-Software Examples (Rev. B) 

赞(0)
未经允许不得转载:TI中文支持网 » 求大侠帮我分析 CC2530无协议栈通信 接收异常
分享到: 更多 (0)