📄 mrfi_cc2510.c
字号:
/**************************************************************************************************
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 + -