This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cc430 接收数据问题(OPERR置位)

Other Parts Discussed in Thread: CC1101

大家好,接触cc430不久,rf相关的程序都是在demo程序的基础稍作修改的。我应用的方式是一块设备以一定的时间间隔发送一包数据(仅发送),另一块设备仅负责接收。现在遇到的问题是接收设备运行一段时间后就接收不到数据了,重新复位后又可以收到数据,如此反复。调试时发现OPERR位置位,跟踪发现在ReceiveOn()->Strobe()-> ReadSingleReg()->data_out = RF1ADOUT1B时(我用demo板的demo程序也出现这种情况)。

相关的代码如下:

接收设备:

#define  PATABLE_VAL        (0x05) 

void RF_Init(void)
{
SetVCore(2);

ResetRadioCore();
InitRadio();
ReceiveOn();

_EINT();

}

#pragma vector=CC1101_VECTOR
__interrupt void CC1101_ISR(void)
{
// ReceiveOff();
switch(__even_in_range(RF1AIV,32)) // Prioritizing Radio Core Interrupt
{
case 0: break; // No RF core interrupt pending
case 2: break; // RFIFG0
case 4: break; // RFIFG1
case 6: break; // RFIFG2
case 8: break; // RFIFG3
case 10: break; // RFIFG4
case 12: break; // RFIFG5
case 14: break; // RFIFG6
case 16: break; // RFIFG7
case 18: break; // RFIFG8
case 20: // RFIFG9
// Read the length byte from the FIFO
RxBufferLength = ReadSingleReg(RXBYTES);
if (RxBufferLength && (RxBufferLength <= sizeof(RxBuffer)))
{
ReadBurstReg(RF_RXFIFORD, RxBuffer, RxBufferLength);
}
else
{
RxBufferLength = 0;
}

// Stop here to see contents of RxBuffer
 __no_operation();

// Check the validity and CRC results
if (RF_IsValidData(RxBuffer, RxBufferLength))
&& (RxBuffer[CRC_LQI_IDX] & CRC_OK))
{
/* 保存数据 */
}

ReceiveOn();
break;
case 22: break; // RFIFG10
case 24: break; // RFIFG11
case 26: break; // RFIFG12
case 28: break; // RFIFG13
case 30: break; // RFIFG14
case 32: break; // RFIFG15
}

__bic_SR_register_on_exit(LPM3_bits); 

}

发射设备:

#define  PATABLE_VAL        (0xc4) 

void RF_Init(void)
{
SetVCore(2);

ResetRadioCore(); 
InitRadio();
ReceiveOn();

_EINT();

}

void RF_Send(void)
{
u8 *p_tmp = TxBuffer;

*p_tmp++ = 16;
*p_tmp++ = 'T';
*p_tmp++ = 'T';
memcpy((char *)p_tmp, (char *)g_rfData, 8);
p_tmp += 8;
*p_tmp++ = MMBYTE(g_rfState);
*p_tmp++ = MLBYTE(g_rfState);
*p_tmp++ = LMBYTE(g_rfState);
*p_tmp++ = LLBYTE(g_rfState);
*p_tmp++ = 'T';
*p_tmp++ = 'T';

Transmit( (unsigned char*)TxBuffer,sizeof(TxBuffer));
debug("Send data\r\n");
}

就是这个问题,困扰我很久了,请高手指点,不胜感激。

  • 没有人遇到这个问题吗,求指教啊。另外,我调试时两个设备距离很短的。

  • TI的人死了么?

  • 你好!

    接收不到数据是因为发射端没发了还是接收端挂了?

  • 1、发射端没有挂。

    2、接收端端没有死机,我用定时器没一秒打印一次信息,打印一直在进行。

    3、我调试了,是程序停在这里了:ReceiveOn()->Strobe()-> ReadSingleReg()-while (!(RF1AIFCTL1 & RFDOUTIFG) );

    4、复位程序就好了,然后运行一会儿,有变成那样了。

    5、以前就有人在你们这里留过言,但是你们一直无法解决,我深深的怀疑是片子的问题,请看如下链接:

    http://e2e.ti.com/support/low_power_rf/f/156/t/74381.aspx

    6、以下是部分接受代码:

    void main(void)
    {
     
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      _DINT();
     
      Init_System_Clk();
      Init_Uart_A0();
      Init_Timer0_A1();
      Init_ADC12_A0();                       //初始化的时候已经开启一次ADC转换。
     
      SetVCore(2);
      ResetRadioCore();                      //复位Radio
      InitRadio();                           //Radio 初始化
     
     
      receiving = 0;
      transmitting=0;
      _EINT();
        while(1)
        {
          ReceiveOn();
         receiving = 1;
       }
    }
     
    /*****************************************************************************
    #pragma vector=CC1101_VECTOR
    __interrupt void CC1101_ISR(void)
    {  
        LED_B_1;
       
        switch(__even_in_range(RF1AIV,32))      // Prioritizing Radio Core Interrupt
        {
        case 20:                                // RFIFG9
            if(receiving)                       // RX end of packet
            {
                ReadBurstReg(RXFIFO, RxBuffer, 6);
               
                for(uint8 i=0;i<6;i++)
                {
                    #ifdef DEBUG0
                    PrintShortInt(RxBuffer[i]);
                    Prints("\r\n");
                    Prints("\r\n");
                    #endif
                }
                Strobe( RF_SFRX );
                //Strobe( RF_SRX );   //接收使能
                receiving=0;          //receiving=0表示一次接收完成;
            }
            else
           if(transmitting)      // TX end of packet
            {
                transmitting = 0;
                ReceiveOn();
                receiving = 1;
            }
          
            else
                break;
        default:    break;
        }
        //__bic_SR_register_on_exit(LPM4_bits);
       
        LED_B_0;
       
    }
  • 您好 ,我也曾经遇到过这个问题,最后发现时LSD给的程序的问题(其实LSD也是参照TI官方DEMO修改的,里面有BUG)

    你可以将函数修改一下,在初始化时加一个指示灯闪烁,这样可以清楚看得见复位哦。

    // *****************************************************************************
    // @fn ReadSingleReg
    // @brief Read a single byte from the radio register
    // @param unsigned char addr Target radio register address
    // @return unsigned char data_out Value of byte that was read
    // *****************************************************************************
    unsigned char ReadSingleReg(unsigned char addr)
    {

    unsigned char x;
    unsigned int int_state;

    ENTER_CRITICAL_SECTION(int_state);

    RF1AINSTR1B = (addr | RF_REGRD);
    x = RF1ADOUT1B;

    EXIT_CRITICAL_SECTION(int_state);

    return x;

    }

    注:

    // *************************************************************************************************
    // Define section
    #define st(x) do { x } while (__LINE__ == -1)
    #define ENTER_CRITICAL_SECTION(x) st( x = __get_interrupt_state(); __disable_interrupt(); )
    #define EXIT_CRITICAL_SECTION(x) __set_interrupt_state(x)

    希望你早日成功!

  • 你好,可否留下联系方式,我的QQ:530659965

  • 这款芯片我也没有用到项目中,不过也好好的学习了下,可以给你推荐一下ti关于这个的ez-chronos手表的相关程序,它应该对你最有用。

  • hi:

       我也遇到了这个问题。是接收端收到包之后,会发一个包,结果再次接包的时候就接不到了。

      我的改动是在接收中断处理函数中加上

    ResetRadioCore();
    InitRadio();
    Strobe( RF_SRX );

    这样三句,现在可以收的到包了。

    希望能够对你有用