?? hal_rf.c
字號:
/***********************************************************************************
Filename: hal_rf.c
Description: CC2520 radio interface.
***********************************************************************************/
/***********************************************************************************
* INCLUDES
*/
#include "hal_board.h"
#include "hal_mcu.h"
#include "hal_int.h"
#include "hal_rf.h"
#include "hal_cc2520.h"
#include "util.h"
#include "util_menu.h"
/***********************************************************************************
* CONSTANTS AND DEFINES
*/
#define RSSI_OFFSET 76
#define RSSI_OFFSET_LNA_HIGHGAIN ( RSSI_OFFSET + 8 )
#define RSSI_OFFSET_LNA_LOWGAIN ( RSSI_OFFSET - 5 )
// CC2590-CC2591 support
//
#ifdef INCLUDE_PA
/* Select CC2591 RX low gain mode */
#define HAL_PA_LNA_RX_LGM() st( CC2520_CFG_GPIO_OUT(3,CC2520_GPIO_LOW); )
/* Select CC2591 RX high gain mode */
#define HAL_PA_LNA_RX_HGM() st( CC2520_CFG_GPIO_OUT(3,CC2520_GPIO_HIGH); )
/* TX power lookup index */
#define HAL_RF_TXPOWER_5_DBM 1
#define HAL_RF_TXPOWER_10_DBM 2
#define HAL_RF_TXPOWER_13_DBM 3
#define HAL_RF_TXPOWER_15_DBM 4
#define HAL_RF_TXPOWER_17_DBM 5
/* TX power values */
#define CC2520_TXPOWER_5_DBM 0x49
#define CC2520_TXPOWER_10_DBM 0x79
#define CC2520_TXPOWER_13_DBM 0x6C
#define CC2520_TXPOWER_15_DBM 0xE0
#define CC2520_TXPOWER_17_DBM 0xF9
#else
/* dummy macros when not using CC2591 */
#define HAL_PA_LNA_RX_LGM()
#define HAL_PA_LNA_RX_HGM()
/* TX power constants */
#define HAL_RF_TXPOWER_MIN_4_DBM 0
#define HAL_RF_TXPOWER_0_DBM 1
#define HAL_RF_TXPOWER_4_DBM 2
#endif
/***********************************************************************************
* LOCAL DATA
*/
#ifdef INCLUDE_PA
static const menuItem_t pPowerSettings[] =
{
"5dBm", HAL_RF_TXPOWER_5_DBM,
"10dBm", HAL_RF_TXPOWER_10_DBM,
"13dBm", HAL_RF_TXPOWER_13_DBM,
"15dBm", HAL_RF_TXPOWER_15_DBM,
"17dBm", HAL_RF_TXPOWER_17_DBM,
};
#else
static const menuItem_t pPowerSettings[] =
{
"-4 dBm", HAL_RF_TXPOWER_MIN_4_DBM,
"0 dBm", HAL_RF_TXPOWER_0_DBM,
"4 dBm", HAL_RF_TXPOWER_4_DBM
};
#endif
/***********************************************************************************
* GLOBAL DATA
*/
const menu_t powerMenu =
{
pPowerSettings,
N_ITEMS(pPowerSettings)
};
/***********************************************************************************
* LOCAL DATA TYPES
*/
typedef struct {
uint8 reg;
uint8 val;
} regVal_t;
/***********************************************************************************
* LOCAL DATA
*/
// Recommended register settings which differ from the data sheet
static regVal_t regval[]= {
// Tuning settings
#ifdef INCLUDE_PA
CC2520_TXPOWER, 0xF9, // Max TX output power
#else
CC2520_TXPOWER, 0xF7, // Max TX output power
#endif
CC2520_CCACTRL0, 0xF8, // CCA treshold -80dBm
// Recommended RX settings
CC2520_MDMCTRL0, 0x85,
CC2520_MDMCTRL1, 0x14,
CC2520_RXCTRL, 0x3F,
CC2520_FSCTRL, 0x5A,
CC2520_FSCAL1, 0x03,
#ifdef INCLUDE_PA
CC2520_AGCCTRL1, 0x16,
#else
CC2520_AGCCTRL1, 0x11,
#endif
CC2520_ADCTEST0, 0x10,
CC2520_ADCTEST1, 0x0E,
CC2520_ADCTEST2, 0x03,
// Configuration for applications using halRfInit()
CC2520_FRMCTRL0, 0x60, // Auto-ack
CC2520_EXTCLOCK, 0x00,
CC2520_GPIOCTRL0, 1 + CC2520_EXC_RX_FRM_DONE,
CC2520_GPIOCTRL1, CC2520_GPIO_SAMPLED_CCA,
CC2520_GPIOCTRL2, CC2520_GPIO_RSSI_VALID,
#ifdef INCLUDE_PA
CC2520_GPIOCTRL3, CC2520_GPIO_HIGH, // CC2590 HGM
CC2520_GPIOCTRL4, 0x46, // EN set to lna_pd[1] inverted
CC2520_GPIOCTRL5, 0x47, // PAEN set to pa_pd inverted
CC2520_GPIOPOLARITY,0x0F, // Invert GPIO4 and GPIO5
#else
CC2520_GPIOCTRL3, CC2520_GPIO_SFD,
CC2520_GPIOCTRL4, CC2520_GPIO_SNIFFER_DATA,
CC2520_GPIOCTRL5, CC2520_GPIO_SNIFFER_CLK,
#endif
// Terminate array
0, 0x00
};
#ifdef INCLUDE_PA
static uint8 rssiOffset = RSSI_OFFSET_LNA_HIGHGAIN;
#else
static uint8 rssiOffset = RSSI_OFFSET;
#endif
/***********************************************************************************
* LOCAL FUNCTIONS
*/
static uint8 halRfWaitRadioReady(void);
static uint8 halRfGetStatusByte(void);
/***********************************************************************************
* GLOBAL FUNCTIONS
*/
/***********************************************************************************
* @fn halRfInit
*
* @brief Power up, sets default tuning settings, enables autoack and configures
* chip IO
*
* @param none
*
* @return SUCCESS if the radio has started, FAILURE otherwise
*/
uint8 halRfInit(void)
{
regVal_t* p;
// Avoid GPIO0 interrupts during reset
halDigioIntDisable(&pinRadio_GPIO0);
// Make sure to pull the CC2520 RESETn and VREG_EN pins low
CC2520_RESET_OPIN(0);
CC2520_SPI_END();
CC2520_VREG_EN_OPIN(0);
halMcuWaitUs(1100);
// Make sure MISO is configured as output.
CC2520_MISO_DIR_OUT();
// Enable the voltage regulator and wait for it (CC2520 power-up)
CC2520_VREG_EN_OPIN(1);
halMcuWaitUs(CC2520_VREG_MAX_STARTUP_TIME);
// Release reset
CC2520_RESET_OPIN(1);
// Wait for XOSC stable to be announced on the MISO pin
if (halRfWaitRadioReady()==FAILED)
return FAILED;
// Write non-default register values
p= regval;
while (p->reg!=0) {
CC2520_MEMWR8(p->reg,p->val);
p++;
}
return SUCCESS;
}
/***********************************************************************************
* @fn halRfGetChipId
*
* @brief Get chip id
*
* @param none
*
* @return uint8 - result
*/
uint8 halRfGetChipId(void)
{
return(CC2520_MEMRD8(CC2520_CHIPID));
}
/***********************************************************************************
* @fn halRfGetChipVer
*
* @brief Get chip version
*
* @param none
*
* @return uint8 - result
*/
uint8 halRfGetChipVer(void)
{
return(CC2520_MEMRD8(CC2520_VERSION));
}
/***********************************************************************************
* @fn halRfGetRandomByte
*
* @brief Return random byte
*
* @param none
*
* @return uint8 - random byte
*/
// Comment: has the random generator been initalised
uint8 halRfGetRandomByte(void)
{
return CC2520_RANDOM8();
}
/***********************************************************************************
* @fn halRfGetRssiOffset
*
* @brief Return RSSI Offset
*
* @param none
*
* @return uint8 - RSSI offset
*/
uint8 halRfGetRssiOffset(void)
{
return rssiOffset;
}
/***********************************************************************************
* @fn halRfSetChannel
*
* @brief Set RF channel in the 2.4GHz band. The Channel must be in the range 11-26,
* 11= 2005 MHz, channel spacing 5 MHz.
*
* @param channel - logical channel number
*
* @return none
*/
void halRfSetChannel(uint8 channel)
{
CC2520_REGWR8(CC2520_FREQCTRL, MIN_CHANNEL + ((channel - MIN_CHANNEL) * CHANNEL_SPACING));
}
/***********************************************************************************
* @fn halRfSetShortAddr
*
* @brief Write short address to chip
*
* @param none
*
* @return none
*/
void halRfSetShortAddr(uint16 shortAddr)
{
CC2520_MEMWR16(CC2520_RAM_SHORTADDR, shortAddr);
}
/***********************************************************************************
* @fn halRfSetPanId
*
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -