微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 求大侠帮我分析 CC2530无协议栈通信 接收异常

求大侠帮我分析 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) 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top