⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mrfi_cc2510.c

📁 SimpliciTI&#8482 -1.0.3.exe for CC11xx and CC25xx SimpliciTI is a simple low-power RF network proto
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************************
  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $
  Revision:       $Revision: 13579 $

  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.

  IMPORTANT: Your use of this Software is limited to those specific rights granted under
  the terms of a software license agreement between the user who downloaded the software,
  his/her employer (which must be your employer) and Texas Instruments Incorporated (the
  "License"). You may not use this Software unless you agree to abide by the terms of the
  License. The License limits your use, and you acknowledge, that the Software may not be
  modified, copied or distributed unless embedded on a Texas Instruments microcontroller
  or used solely and exclusively in conjunction with a Texas Instruments radio frequency
  transceiver, which is integrated into your product. Other than for the foregoing purpose,
  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,
  perform, display or sell this Software and/or its documentation for any purpose.

  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 揂S IS?  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY
  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE
  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY
  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST
  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY
  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.

  Should you have any questions regarding your right to use this Software,
  contact Texas Instruments Incorporated at www.TI.com.
**************************************************************************************************/

/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 *   MRFI (Minimal RF Interface)
 *   Radios: CC2510, CC2511, CC1110, CC1111
 *   Primary code file for supported radios.
 * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 */

/* ------------------------------------------------------------------------------------------------
 *                                          Includes
 * ------------------------------------------------------------------------------------------------
 */
#include <string.h>

#include "mrfi.h"
#include "bsp.h"
#include "bsp_macros.h"
#include "mrfi_CC2510_defs.h"

/* must include after inclusion of mrfi_CC2510_defs.h */
#include MRFI_SMARTRF_SETTINGS_H


/* ------------------------------------------------------------------------------------------------
 *                                          Defines
 * ------------------------------------------------------------------------------------------------
 */
#define MRFI_CCA_RETRIES                    4

#define MRFI_LENGTH_FIELD_OFS               __mrfi_LENGTH_FIELD_OFS__
#define MRFI_LENGTH_FIELD_SIZE              __mrfi_LENGTH_FIELD_SIZE__
#define MRFI_HEADER_SIZE                    __mrfi_HEADER_SIZE__
#define MRFI_FRAME_BODY_OFS                 __mrfi_DST_ADDR_OFS__


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *    Radio Definitions
 *   - - - - - - - - - -
 */

/* rx metrics definitions, known as appended "packet status bytes" in datasheet parlance */
#define MRFI_RX_METRICS_RSSI_OFS            0
#define MRFI_RX_METRICS_CRC_LQI_OFS         1
#define MRFI_RX_METRICS_CRC_OK_MASK         0x80
#define MRFI_RX_METRICS_LQI_MASK            0x7F

/* bit of PARTNUM register that signifies chip has USB capability */
#define MRFI_RADIO_PARTNUM_USB_BIT          0x10

/* register RFST - command strobes */
#define SFSTXON       0x00
#define SCAL          0x01
#define SRX           0x02
#define STX           0x03
#define SIDLE         0x04

/* register MARCSTATE - state values */
#define RXTX_SWITCH   0x15
#define RX            0x0D

/* register IEN2 - bit definitions */
#define RFIE          BV(0)

/* register S1CON - bit definitions */
#define RFIF_1        BV(1)
#define RFIF_0        BV(0)

/* register DMAARM - bit definitions */
#define ABORT         BV(7)

/* register CLKCON - bit definitions */
#define OSC           BV(6)

/* register RFIF - bit definitions */
#define IRQ_DONE      BV(4)

/* register RFIM - bit definitions */
#define IM_DONE       BV(4)


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *    Radio Register Settings
 *   - - - - - - - - - - - - -
 */

/* Main Radio Control State Machine control configuration - Calibrate when going from IDLE to RX or TX. */
#define MRFI_SETTING_MCSM0      0x14

/* Main Radio Control State Machine control configuration - Go to RX state after both RX and TX. */
#define MRFI_SETTING_MCSM1      0x3F

/*
 *  Packet Length - Setting for maximum allowed packet length.
 *  The PKTLEN setting does not include the length field but maximum frame size does.
 *  Subtract length filed from maximum frame size to get value for PKTLEN.
 */
#define MRFI_SETTING_PKTLEN     (MRFI_MAX_FRAME_SIZE - MRFI_LENGTH_FIELD_SIZE)

/* Packet automation control - Original value except WHITE_DATA is extracted from SmartRF setting. */
#define MRFI_SETTING_PKTCTRL0   (0x05 | (SMARTRF_SETTING_PKTCTRL0 & BV(6)))

/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled */
#define MRFI_SETTING_PKTCTRL1_BASE              BV(2)
#define MRFI_SETTING_PKTCTRL1_ADDR_FILTER_OFF   MRFI_SETTING_PKTCTRL1_BASE
#define MRFI_SETTING_PKTCTRL1_ADDR_FILTER_ON    (MRFI_SETTING_PKTCTRL1_BASE | 0x01)

/* early versions of SmartRF Studio did not export this value */
#ifndef SMARTRF_SETTING_FSCAL1
#define SMARTRF_SETTING_FSCAL1  0x80
#endif

/* TEST0 Various Test Settings - the VCO_SEL_CAL_EN bit must be zero */
#define MRFI_SETTING_TEST0      (SMARTRF_SETTING_TEST0 & ~(BV(1)))

/* if SmartRF setting for PA_TABLE0 is supplied, use that instead of built-in default */
#ifdef SMARTRF_SETTING_PA_TABLE0
#undef MRFI_SETTING_PA_TABLE0
#define MRFI_SETTING_PA_TABLE0   SMARTRF_SETTING_PA_TABLE0
#endif

/* channel is taken from the SmartRF settings unless an override is supplied */
#ifdef MRFI_CHAN
#define MRFI_SETTING_CHANNR   MRFI_CHAN
#else
#define MRFI_SETTING_CHANNR   SMARTRF_SETTING_CHANNR
#endif


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 *    DMA Configuration Values
 *   - - - - - - - - - - - - - -
 */

/* DMA channel number */
#define MRFI_DMA_CHAN               0

/* DMA configuration data structure size */
#define RXTX_DMA_STRUCT_SIZE        8

/* byte offset 4 (upper bits of LEN are never used so are always set to zero) */
#define RXTX_DMA_VLEN_XFER_BYTES_PLUS_1       ((/*  VLEN = */( 1 ))<<5)
#define RXTX_DMA_VLEN_XFER_BYTES_PLUS_3       ((/*  VLEN = */( 4 ))<<5)

/* byte offset 5 */
#define RXTX_DMA_LEN            (MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE)

/* byte offset 6 */
#define RXTX_DMA_WORDSIZE       (/*  WORDSIZE = */(  0 )  << 7)
#define RXTX_DMA_TMODE          (/*     TMODE = */(  0 )  << 5)
#define RXTX_DMA_TRIG           (/*      TRIG = */( 19 )  << 0)

/* byte offset 7 */
#define RXTX_DMA_SRCINC_PLUS_1  (/*    SRCINC = */( 1 )  << 6)
#define RXTX_DMA_SRCINC_NONE    (/*    SRCINC = */( 0 )  << 6)
#define RXTX_DMA_DESTINC_PLUS_1 (/*   DESTINC = */( 1 )  << 4)
#define RXTX_DMA_DESTINC_NONE   (/*   DESTINC = */( 0 )  << 4)
#define RXTX_DMA_IRQMASK        (/*   IRQMASK = */( 0 )  << 3)
#define RXTX_DMA_M8             (/*        M8 = */( 0 )  << 2)
#define RXTX_DMA_PRIORITY       (/*  PRIORITY = */( 1 )  << 0)


/* ------------------------------------------------------------------------------------------------
 *                                           Macros
 * ------------------------------------------------------------------------------------------------
 */
#define MRFI_ASSERT(x)                  BSP_ASSERT(x)
#define MRFI_ASSERTS_ARE_ON             BSP_ASSERTS_ARE_ON

#define HIGH_BYTE_OF_WORD(x)            ((uint8_t) (((uint16_t)(x)) >> 8))
#define LOW_BYTE_OF_WORD(x)             ((uint8_t) (((uint16_t)(x)) & 0xFF))

/*
 *  This macro delays an amount of time given in arbitrary units.  Obviously the timing
 *  is dependent on compiler efficiency and clock speed.  This should be cleaned up.
 */
#define MRFI_DELAY(x)                   st( volatile uint16_t i = x; while(i--); )


/* ------------------------------------------------------------------------------------------------
 *                                       Local Prototypes
 * ------------------------------------------------------------------------------------------------
 */
static void MRFI_RxEnable(void);

/* ------------------------------------------------------------------------------------------------
 *                                       Local Variables
 * ------------------------------------------------------------------------------------------------
 */
static uint8_t mrfiRxActive;
static uint8_t mrfiTxActive;
static uint8_t mrfiRadioIsSleeping;
static uint8_t mrfiRxFilterEnabled;
static uint8_t mrfiRxFilterAddr[MRFI_ADDR_SIZE];
static mrfiPacket_t mrfiIncomingPacket;
#if (MRFI_DMA_CHAN == 0)
uint8_t XDATA mrfiDmaCfg[RXTX_DMA_STRUCT_SIZE];
#define MRFI_DMA_CFG_ADDRESS   &mrfiDmaCfg[0]
#endif


/**************************************************************************************************
 * @fn          MRFI_Init
 *
 * @brief       Initialize MRFI.
 *
 * @param       none
 *
 * @return      none
 **************************************************************************************************
 */
void MRFI_Init(void)
{
  /* ------------------------------------------------------------------
   *    Run-time integrity checks
   *   ---------------------------
   */

  /* verify the correct radio is installed */
  MRFI_ASSERT( (PARTNUM == MRFI_RADIO_PARTNUM) || (PARTNUM == (MRFI_RADIO_PARTNUM | MRFI_RADIO_PARTNUM_USB_BIT)) );  /* incorrect radio installed */
 // MRFI_ASSERT( VERSION >= MRFI_RADIO_MIN_VERSION );  /* obsolete radio version */

  /* verify high speed crystal oscillator is selected, required for radio operation */
  MRFI_ASSERT( !(CLKCON & OSC) );


  /* ------------------------------------------------------------------
   *    Variable Initialization
   *   -------------------------
   */

  /* initialize radio state variables */
  mrfiRxFilterEnabled = 0;
  mrfiRadioIsSleeping = 0;
  mrfiTxActive = 0;
  mrfiRxActive = 0;


  /* ------------------------------------------------------------------
   *    DMA Initialization
   *   --------------------
   */
#if (MRFI_DMA_CHAN == 0)
  DMA0CFGH = HIGH_BYTE_OF_WORD( &mrfiDmaCfg[0] );
  DMA0CFGL = LOW_BYTE_OF_WORD ( &mrfiDmaCfg[0] );
#endif


  /* ------------------------------------------------------------------
   *    Configure radio
   *   -----------------
   */

  /* internal radio register configuration */
  MCSM1     = MRFI_SETTING_MCSM1;
  MCSM0     = MRFI_SETTING_MCSM0;
  PKTLEN    = MRFI_SETTING_PKTLEN;
  PKTCTRL0  = MRFI_SETTING_PKTCTRL0;
  PA_TABLE0 = MRFI_SETTING_PA_TABLE0;
  CHANNR    = MRFI_SETTING_CHANNR;
  TEST0     = MRFI_SETTING_TEST0;

  /* imported SmartRF radio register configuration */
  FSCTRL1  = SMARTRF_SETTING_FSCTRL1;
  FSCTRL0  = SMARTRF_SETTING_FSCTRL0;
  FREQ2    = SMARTRF_SETTING_FREQ2;
  FREQ1    = SMARTRF_SETTING_FREQ1;
  FREQ0    = SMARTRF_SETTING_FREQ0;
  MDMCFG4  = SMARTRF_SETTING_MDMCFG4;
  MDMCFG3  = SMARTRF_SETTING_MDMCFG3;
  MDMCFG2  = SMARTRF_SETTING_MDMCFG2;
  MDMCFG1  = SMARTRF_SETTING_MDMCFG1;
  MDMCFG0  = SMARTRF_SETTING_MDMCFG0;
  DEVIATN  = SMARTRF_SETTING_DEVIATN;
  FOCCFG   = SMARTRF_SETTING_FOCCFG;
  BSCFG    = SMARTRF_SETTING_BSCFG;
  AGCCTRL2 = SMARTRF_SETTING_AGCCTRL2;
  AGCCTRL1 = SMARTRF_SETTING_AGCCTRL1;
  AGCCTRL0 = SMARTRF_SETTING_AGCCTRL0;
  FREND1   = SMARTRF_SETTING_FREND1;
  FREND0   = SMARTRF_SETTING_FREND0;
  FSCAL3   = SMARTRF_SETTING_FSCAL3;
  FSCAL2   = SMARTRF_SETTING_FSCAL2;
  FSCAL1   = SMARTRF_SETTING_FSCAL1;
  FSCAL0   = SMARTRF_SETTING_FSCAL0;
  TEST2    = SMARTRF_SETTING_TEST2;
  TEST1    = SMARTRF_SETTING_TEST1;

  /* ------------------------------------------------------------------
   *    Configure interrupts
   *   ----------------------
   */

  /* enable general RF interrupts */
  IEN2 |= RFIE;

  /* enable global interrupts */
  BSP_ENABLE_INTERRUPTS();

  /* enable receiver */
  MRFI_RxEnable();
}


/**************************************************************************************************
 * @fn          MRFI_Transmit
 *
 * @brief       Transmit a packet using CCA algorithm.
 *
 * @param       pPacket - pointer to packet to transmit
 *
 * @return      Return code indicates success or failure of transmit:
 *                  MRFI_TRANSMIT_SUCCESS - transmit succeeded
 *                  MRFI_TRANSMIT_CCA_FAILED - transmit failed because of CCA check(s)
 *                  MRFI_TRANSMIT_RADIO_ASLEEP - transmit failed because radio was asleep
 **************************************************************************************************
 */
uint8_t MRFI_Transmit(mrfiPacket_t * pPacket)
{
  uint8_t ccaRetries;
  uint8_t returnValue;

  /* configure DMA channel for transmit */
  {
    uint8_t XDATA * pCfg;

    pCfg = MRFI_DMA_CFG_ADDRESS;
    *pCfg++ = /* offset 0 : */  HIGH_BYTE_OF_WORD( &(pPacket->frame[0]) );  /* SRCADDRH */
    *pCfg++ = /* offset 1 : */  LOW_BYTE_OF_WORD ( &(pPacket->frame[0]) );  /* SRCADDRL */
    *pCfg++ = /* offset 2 : */  HIGH_BYTE_OF_WORD( &X_RFD );  /* DSTADDRH */
    *pCfg++ = /* offset 3 : */  LOW_BYTE_OF_WORD ( &X_RFD );  /* DSTADDRL */
    *pCfg++ = /* offset 4 : */  RXTX_DMA_VLEN_XFER_BYTES_PLUS_1;
    *pCfg++ = /* offset 5 : */  RXTX_DMA_LEN;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -