cc2530无线点对点通信,不用协议栈,直接操作寄存器实现。

时间:2021-08-25 11:03:17
各位仁兄,我想通过最底层的寄存器操作,在节点1上发送数据,在节点2上通过中断读取数据。(不使用协议栈)可是,现在的问题是,程序运行到  while (!(RFIRQF1 &(1<<1) ));  就不向下执行了,难道是没发送成功?各位有没有知道原因的,麻烦解释下,谢谢了~~ cc2530无线点对点通信,不用协议栈,直接操作寄存器实现。。附上节点1程序,节点2差不多,就多一个点亮LED的程序。
#include "ioCC2530.h"
char rf_rx_buf[128];

char serial_rxbuf[128];       // 串口接收缓冲区
int  serial_rxpos = 0;
int  serial_rxlen = 0;
char is_serial_receive = 0;

void uart0_init();
void uart0_sendbuf(char *pbuf , int len);
void uart0_flush_rxbuf();

void rf_send( char *pbuf , int len);
void rf_receive_isr();

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

    URX0IE = 1;                 // 使能接收中断 IEN0@BIT2
}
void uart0_flush_rxbuf()
{
    serial_rxpos = 0;
    serial_rxlen = 0;
}

void rf_init()
{   
    TXPOWER   = 0xD5;                 // 发射功率为1dBm
    //FRMCTRL0 |= (0x20 | 0x40); /* AUTO_ACK | AUTO_CRC */
    CCACTRL0  = 0xF8;                 // 推荐值 smartRF软件生成

    FRMFILT0 = 0x0c;                 // 静止接收过滤,即接收所有数据包

    FSCAL1 =    0x00;                 // 推荐值 smartRF软件生成
    TXFILTCFG = 0x09;
    AGCCTRL1 =  0x15;
   //AGCCTRL2 =  0xFE;

    //TXFILTCFG = 0x09;                 // 推荐值 smartRF软件生成

    FREQCTRL = 0x0B;                  // 选择通道11

    RFIRQM0 |= (1<<6);                // 使能RF数据包接收中断
    IEN2 |= (1<<0);                   // 使能RF中断

    RFST = 0xED;                      // 清除RF接收缓冲区 ISFLUSHRX
    RFST = 0xE3;                      // RF接收使能 ISRXON 
}

void rf_send( 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) ));      // 等待发送完成
    P0_0 = ~P0_0;
    RFIRQF1 = ~(1<<1);                // 清除发送完成标志位
   
    RFIRQM0 |= (1<<6);                // RX接收中断
    IEN2 |= (1<<0);
}

void rf_receive_isr()
{
    int rf_rx_len = 0;
    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 = 0xED;                                // 清除接收缓冲区
    if( crc_ok & 0x80 )
    {
        uart0_sendbuf( rf_rx_buf , rf_rx_len);    // 串口发送
        uart0_sendbuf(r,1);
    }
    else
    {
       uart0_sendbuf("CRC Error",9);
    }
}

void main(void)
{
    P0DIR |= 0x01;  //设置P0.0为输出方式;P0.4和P0.5为输入方式
    P2DIR |= 0x01;  //设置P2.0为输出方式
    P0_0 = 1; 
    P2_0 = 1;       //熄灭LED

   EA = 0;                                     // 暂时关闭全局中断
   SLEEPCMD &= ~0x04;          //选择32M晶振
   while(!(SLEEPSTA & 0x40));   //等待XSOC稳定
   CLKCONCMD &=~0x47;            //TICHSPD 128分频,CLKSPD 不分频!!!!!
   SLEEPCMD |= 0x04;            //关闭不用的RC 振荡器
 /*   if(!(CLKCONSTA &(1<<6)))
    {
     P0_0 =~P0_0;
    }  */                                         
    uart0_init();                               // 串口初始化 57600
    rf_init();                                  // RF初始化 无帧过滤

    EA = 1;                                     // 使能全局中断
    while(1)
    {
        if( is_serial_receive )                   // 接收到串口数据包
        {
            is_serial_receive = 0;                  // 清除标志位
            rf_send(serial_rxbuf , serial_rxlen);   // 直接转发串口数据
            uart0_flush_rxbuf();                    // 清除串口接收缓冲区
        }
    }
}

/* int putchar(int c)
{
    while( !UTX0IF );
    UTX0IF = 0;
    U0DBUF = c;
    return c;
} */

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

#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(void)
{
    URX0IF = 0;                                   // 清除接收中断标志
    serial_rxbuf[serial_rxpos] = U0DBUF;          // 填充缓冲区
    //serial_rxpos++;
    //serial_rxlen++;
    is_serial_receive = 1; 
    P2_0 =~P2_0;
}
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{
  unsigned char e;
  //P2_0 = ~P2_0;  // LED1翻转 提示作用
    e = EA;
    EA = 0;

    // 接收到一个完整的数据包
    if (RFIRQF0 & ( 1<<6 ))
    {
        rf_receive_isr();                           // 调用接收中断处理函数

        S1CON &=~0x03;                                 // 清除RF中断标志
        RFIRQF0 &= ~(1<<6);                         // 清除RF接收完成数据包中断
    }
    EA = e;
}

3 个解决方案

#1


没人 ?我已经解决了~~

#2


是怎么解决的?

#3


怎么解决的,版主怎么也不结贴呢,我试了一下也是卡在你说的那个位置

#1


没人 ?我已经解决了~~

#2


是怎么解决的?

#3


怎么解决的,版主怎么也不结贴呢,我试了一下也是卡在你说的那个位置