Quantcast
Channel: Zigbee 和 Thread
Viewing all articles
Browse latest Browse all 16962

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

$
0
0

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


Viewing all articles
Browse latest Browse all 16962

Trending Articles