微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC2500 无线模块中的CCA功能如何去调试?

CC2500 无线模块中的CCA功能如何去调试?

时间:12-23 整理:3721RD 点击:

我在使用CC2500模块的时候,在多对一的RF系统中,为了避免发送时的冲撞,发送端需要先判断信道是否为空。但是我在调试了2个礼拜之后发现CCA的值一直不变cca = TI_CC_GDO2_PxIN & TI_CC_GDO2_PIN ; cca的值一直检测到为0。 所以我怀疑我的调试方法有误,希望使用过CCA功能的朋友,能给我指点下调试方法。如能有事例程序,那更加感激不尽。在此先行谢过各位!

参考simpliciTI协议栈中的MRFI_Transmit()函数。

请问一下这个在哪里可以找到simpliciTI协议栈的程序啊,我照了半天了,能不能提供一个详细的连接地址,谢谢了!

http://www.ti.com/tool/simpliciti

能再具体一点吗?我上下翻了,没找到关于这个函数的文章,麻烦了,谢谢!谢谢!

下协议栈,直接看代码,里面有注释。想了解CCA,看数据手册。我附上这段代码吧。

这个函数支持非CCA直接发送和CCA判断再发送。

/**************************************************************************************************
 * @fn          MRFI_Transmit
 *
 * @brief       Transmit a packet using CCA algorithm.
 *
 * @param       pPacket - pointer to packet to transmit
 *              txType  - FORCED or CCA
 *
 * @return      Return code indicates success or failure of transmit:
 *                  MRFI_TX_RESULT_SUCCESS - transmit succeeded
 *                  MRFI_TX_RESULT_FAILED  - transmit failed because CCA failed
 **************************************************************************************************
 */
uint8_t MRFI_Transmit(mrfiPacket_t * pPacket, uint8_t txType)
{
#ifdef NWK_PLL
    bspIState_t s;
#endif
  uint8_t ccaRetries;
  uint8_t returnValue = MRFI_TX_RESULT_SUCCESS;

  /* radio must be awake to transmit */
  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );

  /* Turn off reciever. We can ignore/drop incoming packets during transmit. */
  Mrfi_RxModeOff();

  MRFI_PrepareToTx( pPacket );


  /* ------------------------------------------------------------------
   *    Immediate transmit
   *   ---------------------
   */
  if (txType == MRFI_TX_TYPE_FORCED)
  {
//#ifdef NWK_PLL
//    BSP_ENTER_CRITICAL_SECTION(s);
//#endif
//    MRFI_CompleteTxPrep( pPacket );
#ifdef NWK_PLL
    do
    {
    BSP_ENTER_CRITICAL_SECTION(s);
      if( stx_active == false ) // if the channel was changed
      {
        BSP_EXIT_CRITICAL_SECTION(s);
        Mrfi_RxModeOff();            // turn off the radio
        MRFI_PrepareToTx( pPacket ); // setup transmission again
        continue; // restart the loop
      }
    MRFI_CompleteTxPrep( pPacket );
    } while( 0 );
#endif

    /* Issue the TX strobe. */
    mrfiSpiCmdStrobe( STX );
#ifdef NWK_PLL
    BSP_EXIT_CRITICAL_SECTION(s);
#endif

    /* Wait for transmit to complete */
    Mrfi_DelayUsecLong( MRFI_MAX_TRANSMIT_TIME_us / 1000,
                        MRFI_MAX_TRANSMIT_TIME_us % 1000,
                        mrfi_TxImmediateDone );

    /* Clear the interrupt flag */
    MRFI_CLEAR_SYNC_PIN_INT_FLAG();
  }
  else
  {
    /* ------------------------------------------------------------------
     *    CCA transmit
     *   ---------------
     */

    MRFI_ASSERT( txType == MRFI_TX_TYPE_CCA );

    /* set number of CCA retries */
    ccaRetries = MRFI_CCA_RETRIES;

    /* For CCA algorithm, we need to know the transition from the RX state to
     * the TX state. There is no need for SYNC signal in this logic. So we
     * can re-configure the GDO_0 output from the radio to be PA_PD signal
     * instead of the SYNC signal.
     * Since both SYNC and PA_PD are used as falling edge interrupts, we
     * don't need to reconfigure the MCU input.
     */
    MRFI_CONFIG_GDO0_AS_PAPD_SIGNAL();

    /* ===============================================================================
     *    Main Loop
     *  =============
     */
    for (;;)
    {
      /* Radio must be in RX mode for CCA to happen.
       * Otherwise it will transmit without CCA happening.
       */

      /* Can not use the Mrfi_RxModeOn() function here since it turns on the
       * Rx interrupt, which we don't want in this case.
       */
      mrfiSpiCmdStrobe( SRX );

      /* wait for the rssi to be valid. */
#ifdef MRFI_TIMER_ALWAYS_ACTIVE
      MRFI_WaitTimeoutUsec(MRFI_RSSI_VALID_DELAY_US, Mrfi_ValidateRSSI);
#else // MRFI_TIMER_ALWAYS_ACTIVE
      MRFI_RSSI_VALID_WAIT();
#endif // MRFI_TIMER_ALWAYS_ACTIVE
#ifdef NWK_PLL
        BSP_ENTER_CRITICAL_SECTION(s);
        if( stx_active == false ) // if the channel was changed
        {
          BSP_EXIT_CRITICAL_SECTION(s);
          Mrfi_RxModeOff();            // turn off the radio
          MRFI_PrepareToTx( pPacket ); // setup transmission again
          continue; // restart the cca loop
        }

      MRFI_CompleteTxPrep( pPacket );
#endif

      /*
       *  Clear the PA_PD pin interrupt flag.  This flag, not the interrupt itself,
       *  is used to capture the transition that indicates a transmit was started.
       *  The pin level cannot be used to indicate transmit success as timing may
       *  prevent the transition from being detected.  The interrupt latch captures
       *  the event regardless of timing.
       */
      MRFI_CLEAR_PAPD_PIN_INT_FLAG();

      /* Issue the TX strobe. */
      mrfiSpiCmdStrobe( STX );

#ifdef NWK_PLL
      BSP_EXIT_CRITICAL_SECTION(s);
#endif

      /* Delay long enough for the PA_PD signal to indicate a
       * successful transmit. This is the 250 XOSC periods
       * (9.6 us for a 26 MHz crystal) See section 19.6 of 2500 datasheet.
       * Found out that we need a delay of atleast 20 us on CC2500 and
       * 25 us on CC1100 to see the PA_PD signal change.
       */
      Mrfi_DelayUsec(25);


      /* PA_PD signal goes from HIGH to LOW when going from RX state.
       * This transition is trapped as a falling edge interrupt flag
       * to indicate that CCA passed and the transmit has started.
       */
      if (MRFI_PAPD_INT_FLAG_IS_SET())
      {
        /* ------------------------------------------------------------------
        *    Clear Channel Assessment passed.
        *   ----------------------------------
        */

        /* Clear the PA_PD int flag */
        MRFI_CLEAR_PAPD_PIN_INT_FLAG();

        Mrfi_DelayUsecLong( MRFI_MAX_TRANSMIT_TIME_us / 1000,
                            MRFI_MAX_TRANSMIT_TIME_us % 1000,
                            mrfi_TxCCADone );

        /* transmit done, break */
        break;
      }
      else
      {
        /* ------------------------------------------------------------------
         *    Clear Channel Assessment failed.
         *   ----------------------------------
         */

        /* Turn off radio and save some power during backoff */

        /* NOTE: Can't use Mrfi_RxModeOff() - since it tries to update the
         * sync signal status which we are not using during the TX operation.
         */
        MRFI_STROBE_IDLE_AND_WAIT();

        /* flush the receive FIFO of any residual data */
        mrfiSpiCmdStrobe( SFRX );

        /* Retry ? */
        if (ccaRetries != 0)
        {
#ifdef MRFI_TIMER_ALWAYS_ACTIVE
          stx_active = false;
#endif
          /* delay for a random number of backoffs */
          Mrfi_RandomBackoffDelay();

          MRFI_PrepareToTx( pPacket ); // setup transmission again

          /* decrement CCA retries before loop continues */
          ccaRetries--;
        }
        else /* No CCA retries are left, abort */
        {
          /* set return value for failed transmit and break */
          returnValue = MRFI_TX_RESULT_FAILED;
          break;
        }
      } /* CCA Failed */
    } /* CCA loop */
  }/* txType is CCA */

  /* Done with TX. Clean up time... */

  /* Radio is already in IDLE state */

#ifdef NWK_PLL
  stx_active = false;
  // Packet transmitted, regardless of packet type, remove reference.
  sTxTimeStampAddr = NULL;
#endif
  /*
   * Flush the transmit FIFO.  It must be flushed so that
   * the next transmit can start with a clean slate.
   */
  mrfiSpiCmdStrobe( SFTX );

  /* Restore GDO_0 to be SYNC signal */
  MRFI_CONFIG_GDO0_AS_SYNC_SIGNAL();

  /* If the radio was in RX state when transmit was attempted,
   * put it back to Rx On state.
   */
  if(mrfiRadioState == MRFI_RADIO_STATE_RX)
  {
    Mrfi_RxModeOn();
  }

  return( returnValue );
}

能否详细说明一下源代码在那个标题下下载吗?

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

网站地图

Top