求大侠帮我分析 CC2530无协议栈通信 接收异常
时间:10-02
整理:3721RD
点击:
代码如下,我有两块板子,一个发送,一个接受,代码共用,一个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.2 P0SEL |= 0x0C; // P0.3 P0.2选择外设功能 U0GCR |= 10; // 查表获得 U0GCR 和 U0BAUD U0BAUD |= 59; // 38400 U0CSR |= 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接收使能 ISRXON while( FSMSTAT1 & (( 1<<1 ) | ( 1<<5 )));// 等待发送状态不活跃 并且 没有接收到SFD RFIRQM0 &= ~(1<<6); // 禁止接收数据包中断 IEN2 &= ~(1<<0); // 清除RF全局中断 RFST = 0xEE; // 清除发送缓冲区 ISFLUSHTX RFIRQF1 = ~(1<<1); // 清除发送完成标志 // 填充缓冲区 填充过程需要增加2字节,CRC校验自动填充 RFD = len + 2; for (int i = 0; i < len; i++) { RFD = *pbuf++; } RFST = 0xE9; // 发送数据包 ISTXON while (!(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校验结果 BIT7 RFST = 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; }
看下RF相关的配置是否有问题,你可以参考basic rf中关于RF的配置。
CC2530-Software Examples (Rev. B)