代码如下,我有两块板子,一个发送,一个接受,代码共用,一个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)