HelloWorld_IDS01A4 mbed application for Spirit1 P2P demo.

Dependencies:   mbed

Fork of HelloWorld_IDS01A5_Program by rosarium pila

mbed 2.0 (a.k.a classic) HelloWorld example for Spirit1 to transfer data from one node to another.
To send the predefined data packet from the sender to the receiver, user needs to press User Button on the board. The LED on the receiver expansion board will toggle on reception of data successfully.
Data packets sent and received can be seen on USB serial terminal.

EVALUATION BOARDS RF FREQUENCY DESCRIPTION :
X-NUCLEO-IDS01A4 868 MHz 868 MHz RF expansion board based on SPIRIT1

Committer:
rosarium
Date:
Thu May 25 16:38:55 2017 +0000
Revision:
0:2ddc0583bcec
First draft version of HelloWorld_IDS01A5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:2ddc0583bcec 1 /**
rosarium 0:2ddc0583bcec 2 ******************************************************************************
rosarium 0:2ddc0583bcec 3 * @file SPIRIT_Radio.c
rosarium 0:2ddc0583bcec 4 * @author VMA division - AMS
rosarium 0:2ddc0583bcec 5 * @version 3.2.2
rosarium 0:2ddc0583bcec 6 * @date 08-July-2015
rosarium 0:2ddc0583bcec 7 * @brief This file provides all the low level API to manage Analog and Digital
rosarium 0:2ddc0583bcec 8 * radio part of SPIRIT.
rosarium 0:2ddc0583bcec 9 * @details
rosarium 0:2ddc0583bcec 10 *
rosarium 0:2ddc0583bcec 11 * @attention
rosarium 0:2ddc0583bcec 12 *
rosarium 0:2ddc0583bcec 13 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
rosarium 0:2ddc0583bcec 14 *
rosarium 0:2ddc0583bcec 15 * Redistribution and use in source and binary forms, with or without modification,
rosarium 0:2ddc0583bcec 16 * are permitted provided that the following conditions are met:
rosarium 0:2ddc0583bcec 17 * 1. Redistributions of source code must retain the above copyright notice,
rosarium 0:2ddc0583bcec 18 * this list of conditions and the following disclaimer.
rosarium 0:2ddc0583bcec 19 * 2. Redistributions in binary form must reproduce the above copyright notice,
rosarium 0:2ddc0583bcec 20 * this list of conditions and the following disclaimer in the documentation
rosarium 0:2ddc0583bcec 21 * and/or other materials provided with the distribution.
rosarium 0:2ddc0583bcec 22 * 3. Neither the name of STMicroelectronics nor the names of its contributors
rosarium 0:2ddc0583bcec 23 * may be used to endorse or promote products derived from this software
rosarium 0:2ddc0583bcec 24 * without specific prior written permission.
rosarium 0:2ddc0583bcec 25 *
rosarium 0:2ddc0583bcec 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
rosarium 0:2ddc0583bcec 27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
rosarium 0:2ddc0583bcec 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rosarium 0:2ddc0583bcec 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
rosarium 0:2ddc0583bcec 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
rosarium 0:2ddc0583bcec 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
rosarium 0:2ddc0583bcec 32 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
rosarium 0:2ddc0583bcec 33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
rosarium 0:2ddc0583bcec 34 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
rosarium 0:2ddc0583bcec 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rosarium 0:2ddc0583bcec 36 *
rosarium 0:2ddc0583bcec 37 ******************************************************************************
rosarium 0:2ddc0583bcec 38 */
rosarium 0:2ddc0583bcec 39
rosarium 0:2ddc0583bcec 40 /* Includes ------------------------------------------------------------------*/
rosarium 0:2ddc0583bcec 41 #include "SPIRIT_Radio.h"
rosarium 0:2ddc0583bcec 42 #include "MCU_Interface.h"
rosarium 0:2ddc0583bcec 43 #include <math.h>
rosarium 0:2ddc0583bcec 44
rosarium 0:2ddc0583bcec 45 /** @addtogroup SPIRIT_Libraries
rosarium 0:2ddc0583bcec 46 * @{
rosarium 0:2ddc0583bcec 47 */
rosarium 0:2ddc0583bcec 48
rosarium 0:2ddc0583bcec 49
rosarium 0:2ddc0583bcec 50 /** @addtogroup SPIRIT_Radio
rosarium 0:2ddc0583bcec 51 * @{
rosarium 0:2ddc0583bcec 52 */
rosarium 0:2ddc0583bcec 53
rosarium 0:2ddc0583bcec 54
rosarium 0:2ddc0583bcec 55 /** @defgroup Radio_Private_TypesDefinitions Radio Private Types Definitions
rosarium 0:2ddc0583bcec 56 * @{
rosarium 0:2ddc0583bcec 57 */
rosarium 0:2ddc0583bcec 58
rosarium 0:2ddc0583bcec 59
rosarium 0:2ddc0583bcec 60 /**
rosarium 0:2ddc0583bcec 61 * @}
rosarium 0:2ddc0583bcec 62 */
rosarium 0:2ddc0583bcec 63
rosarium 0:2ddc0583bcec 64
rosarium 0:2ddc0583bcec 65 /** @defgroup Radio_Private_Defines Radio Private Defines
rosarium 0:2ddc0583bcec 66 * @{
rosarium 0:2ddc0583bcec 67 */
rosarium 0:2ddc0583bcec 68
rosarium 0:2ddc0583bcec 69
rosarium 0:2ddc0583bcec 70
rosarium 0:2ddc0583bcec 71
rosarium 0:2ddc0583bcec 72 /**
rosarium 0:2ddc0583bcec 73 * @}
rosarium 0:2ddc0583bcec 74 */
rosarium 0:2ddc0583bcec 75
rosarium 0:2ddc0583bcec 76
rosarium 0:2ddc0583bcec 77 /** @defgroup Radio_Private_Macros Radio Private Macros
rosarium 0:2ddc0583bcec 78 * @{
rosarium 0:2ddc0583bcec 79 */
rosarium 0:2ddc0583bcec 80 #define XTAL_FLAG(xtalFrequency) (xtalFrequency>=25e6) ? XTAL_FLAG_26_MHz:XTAL_FLAG_24_MHz
rosarium 0:2ddc0583bcec 81
rosarium 0:2ddc0583bcec 82 #define ROUND(A) (((A-(uint32_t)A)> 0.5)? (uint32_t)A+1:(uint32_t)A)
rosarium 0:2ddc0583bcec 83 /**
rosarium 0:2ddc0583bcec 84 * @}
rosarium 0:2ddc0583bcec 85 */
rosarium 0:2ddc0583bcec 86
rosarium 0:2ddc0583bcec 87
rosarium 0:2ddc0583bcec 88 /** @defgroup Radio_Private_Variables Radio Private Variables
rosarium 0:2ddc0583bcec 89 * @{
rosarium 0:2ddc0583bcec 90 */
rosarium 0:2ddc0583bcec 91 /**
rosarium 0:2ddc0583bcec 92 * @brief The Xtal frequency. To be set by the user (see SetXtalFreq() function)
rosarium 0:2ddc0583bcec 93 */
rosarium 0:2ddc0583bcec 94 static uint32_t s_lXtalFrequency;
rosarium 0:2ddc0583bcec 95
rosarium 0:2ddc0583bcec 96 /**
rosarium 0:2ddc0583bcec 97 * @brief Factor is: B/2 used in the formula for SYNTH word calculation
rosarium 0:2ddc0583bcec 98 */
rosarium 0:2ddc0583bcec 99 static const uint8_t s_vectcBHalfFactor[4]={(HIGH_BAND_FACTOR/2), (MIDDLE_BAND_FACTOR/2), (LOW_BAND_FACTOR/2), (VERY_LOW_BAND_FACTOR/2)};
rosarium 0:2ddc0583bcec 100
rosarium 0:2ddc0583bcec 101 /**
rosarium 0:2ddc0583bcec 102 * @brief BS value to write in the SYNT0 register according to the selected band
rosarium 0:2ddc0583bcec 103 */
rosarium 0:2ddc0583bcec 104 static const uint8_t s_vectcBandRegValue[4]={SYNT0_BS_6, SYNT0_BS_12, SYNT0_BS_16, SYNT0_BS_32};
rosarium 0:2ddc0583bcec 105
rosarium 0:2ddc0583bcec 106
rosarium 0:2ddc0583bcec 107 /**
rosarium 0:2ddc0583bcec 108 * @brief It represents the available channel bandwidth times 10 for 26 Mhz xtal.
rosarium 0:2ddc0583bcec 109 * @note The channel bandwidth for others xtal frequencies can be computed since this table
rosarium 0:2ddc0583bcec 110 * multiplying the current table by a factor xtal_frequency/26e6.
rosarium 0:2ddc0583bcec 111 */
rosarium 0:2ddc0583bcec 112 static const uint16_t s_vectnBandwidth26M[90]=
rosarium 0:2ddc0583bcec 113 {
rosarium 0:2ddc0583bcec 114 8001, 7951, 7684, 7368, 7051, 6709, 6423, 5867, 5414, \
rosarium 0:2ddc0583bcec 115 4509, 4259, 4032, 3808, 3621, 3417, 3254, 2945, 2703, \
rosarium 0:2ddc0583bcec 116 2247, 2124, 2015, 1900, 1807, 1706, 1624, 1471, 1350, \
rosarium 0:2ddc0583bcec 117 1123, 1062, 1005, 950, 903, 853, 812, 735, 675, \
rosarium 0:2ddc0583bcec 118 561, 530, 502, 474, 451, 426, 406, 367, 337, \
rosarium 0:2ddc0583bcec 119 280, 265, 251, 237, 226, 213, 203, 184, 169, \
rosarium 0:2ddc0583bcec 120 140, 133, 126, 119, 113, 106, 101, 92, 84, \
rosarium 0:2ddc0583bcec 121 70, 66, 63, 59, 56, 53, 51, 46, 42, \
rosarium 0:2ddc0583bcec 122 35, 33, 31, 30, 28, 27, 25, 23, 21, \
rosarium 0:2ddc0583bcec 123 18, 17, 16, 15, 14, 13, 13, 12, 11
rosarium 0:2ddc0583bcec 124 };
rosarium 0:2ddc0583bcec 125
rosarium 0:2ddc0583bcec 126 /**
rosarium 0:2ddc0583bcec 127 * @brief It represents the available VCO frequencies
rosarium 0:2ddc0583bcec 128 */
rosarium 0:2ddc0583bcec 129 static const uint16_t s_vectnVCOFreq[16]=
rosarium 0:2ddc0583bcec 130 {
rosarium 0:2ddc0583bcec 131 4644, 4708, 4772, 4836, 4902, 4966, 5030, 5095, \
rosarium 0:2ddc0583bcec 132 5161, 5232, 5303, 5375, 5448, 5519, 5592, 5663
rosarium 0:2ddc0583bcec 133 };
rosarium 0:2ddc0583bcec 134
rosarium 0:2ddc0583bcec 135 /**
rosarium 0:2ddc0583bcec 136 * @brief This variable is used to enable or disable
rosarium 0:2ddc0583bcec 137 * the VCO calibration WA called at the end of the SpiritRadioSetFrequencyBase fcn.
rosarium 0:2ddc0583bcec 138 * Default is enabled.
rosarium 0:2ddc0583bcec 139 */
rosarium 0:2ddc0583bcec 140 static SpiritFunctionalState xDoVcoCalibrationWA=S_ENABLE;
rosarium 0:2ddc0583bcec 141
rosarium 0:2ddc0583bcec 142
rosarium 0:2ddc0583bcec 143 /**
rosarium 0:2ddc0583bcec 144 * @brief These values are used to interpolate the power curves.
rosarium 0:2ddc0583bcec 145 * Interpolation curves are linear in the following 3 regions:
rosarium 0:2ddc0583bcec 146 * - reg value: 1 to 13 (up region)
rosarium 0:2ddc0583bcec 147 * - reg value: 13 to 40 (mid region)
rosarium 0:2ddc0583bcec 148 * - reg value: 41 to 90 (low region)
rosarium 0:2ddc0583bcec 149 * power_reg = m*power_dBm + q
rosarium 0:2ddc0583bcec 150 * For each band the order is: {m-up, q-up, m-mid, q-mid, m-low, q-low}.
rosarium 0:2ddc0583bcec 151 * @note The power interpolation curves have been extracted
rosarium 0:2ddc0583bcec 152 * by measurements done on the divisional evaluation boards.
rosarium 0:2ddc0583bcec 153 */
rosarium 0:2ddc0583bcec 154 static const float fPowerFactors[5][6]={
rosarium 0:2ddc0583bcec 155 {-2.11,25.66,-2.11,25.66,-2.00,31.28}, /* 915 */
rosarium 0:2ddc0583bcec 156 {-2.04,23.45,-2.04,23.45,-1.95,27.66}, /* 868 */
rosarium 0:2ddc0583bcec 157 {-3.48,38.45,-1.89,27.66,-1.92,30.23}, /* 433 */
rosarium 0:2ddc0583bcec 158 {-3.27,35.43,-1.80,26.31,-1.89,29.61}, /* 315 */
rosarium 0:2ddc0583bcec 159 {-4.18,50.66,-1.80,30.04,-1.86,32.22}, /* 169 */
rosarium 0:2ddc0583bcec 160 };
rosarium 0:2ddc0583bcec 161
rosarium 0:2ddc0583bcec 162 /**
rosarium 0:2ddc0583bcec 163 * @}
rosarium 0:2ddc0583bcec 164 */
rosarium 0:2ddc0583bcec 165
rosarium 0:2ddc0583bcec 166
rosarium 0:2ddc0583bcec 167 /** @defgroup Radio_Private_FunctionPrototypes Radio Private Function Prototypes
rosarium 0:2ddc0583bcec 168 * @{
rosarium 0:2ddc0583bcec 169 */
rosarium 0:2ddc0583bcec 170
rosarium 0:2ddc0583bcec 171
rosarium 0:2ddc0583bcec 172 /**
rosarium 0:2ddc0583bcec 173 * @}
rosarium 0:2ddc0583bcec 174 */
rosarium 0:2ddc0583bcec 175
rosarium 0:2ddc0583bcec 176
rosarium 0:2ddc0583bcec 177 /** @defgroup Radio_Private_Functions Radio Private Functions
rosarium 0:2ddc0583bcec 178 * @{
rosarium 0:2ddc0583bcec 179 */
rosarium 0:2ddc0583bcec 180
rosarium 0:2ddc0583bcec 181 /**
rosarium 0:2ddc0583bcec 182 * @brief Initializes the SPIRIT analog and digital radio part according to the specified
rosarium 0:2ddc0583bcec 183 * parameters in the pxSRadioInitStruct.
rosarium 0:2ddc0583bcec 184 * @param pxSRadioInitStruct pointer to a SRadioInit structure that
rosarium 0:2ddc0583bcec 185 * contains the configuration information for the analog radio part of SPIRIT.
rosarium 0:2ddc0583bcec 186 * @retval Error code: 0=no error, 1=error during calibration of VCO.
rosarium 0:2ddc0583bcec 187 */
rosarium 0:2ddc0583bcec 188 uint8_t SpiritRadioInit(SRadioInit* pxSRadioInitStruct)
rosarium 0:2ddc0583bcec 189 {
rosarium 0:2ddc0583bcec 190 int32_t FOffsetTmp;
rosarium 0:2ddc0583bcec 191 uint8_t anaRadioRegArray[8], digRadioRegArray[4];
rosarium 0:2ddc0583bcec 192 int16_t xtalOffsetFactor;
rosarium 0:2ddc0583bcec 193 uint8_t drM, drE, FdevM, FdevE, bwM, bwE;
rosarium 0:2ddc0583bcec 194
rosarium 0:2ddc0583bcec 195 /* Workaround for Vtune */
rosarium 0:2ddc0583bcec 196 uint8_t value = 0xA0; SpiritSpiWriteRegisters(0x9F, 1, &value);
rosarium 0:2ddc0583bcec 197
rosarium 0:2ddc0583bcec 198 /* Calculates the offset respect to RF frequency and according to xtal_ppm parameter: (xtal_ppm*FBase)/10^6 */
rosarium 0:2ddc0583bcec 199 FOffsetTmp = (int32_t)(((float)pxSRadioInitStruct->nXtalOffsetPpm*pxSRadioInitStruct->lFrequencyBase)/PPM_FACTOR);
rosarium 0:2ddc0583bcec 200
rosarium 0:2ddc0583bcec 201 /* Check the parameters */
rosarium 0:2ddc0583bcec 202 s_assert_param(IS_FREQUENCY_BAND(pxSRadioInitStruct->lFrequencyBase));
rosarium 0:2ddc0583bcec 203 s_assert_param(IS_MODULATION_SELECTED(pxSRadioInitStruct->xModulationSelect));
rosarium 0:2ddc0583bcec 204 s_assert_param(IS_DATARATE(pxSRadioInitStruct->lDatarate));
rosarium 0:2ddc0583bcec 205 s_assert_param(IS_FREQUENCY_OFFSET(FOffsetTmp,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 206 s_assert_param(IS_CHANNEL_SPACE(pxSRadioInitStruct->nChannelSpace,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 207 s_assert_param(IS_F_DEV(pxSRadioInitStruct->lFreqDev,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 208
rosarium 0:2ddc0583bcec 209 /* Disable the digital, ADC, SMPS reference clock divider if fXO>24MHz or fXO<26MHz */
rosarium 0:2ddc0583bcec 210 SpiritSpiCommandStrobes(COMMAND_STANDBY);
rosarium 0:2ddc0583bcec 211 do{
rosarium 0:2ddc0583bcec 212 /* Delay for state transition */
rosarium 0:2ddc0583bcec 213 for(volatile uint8_t i=0; i!=0xFF; i++);
rosarium 0:2ddc0583bcec 214
rosarium 0:2ddc0583bcec 215 /* Reads the MC_STATUS register */
rosarium 0:2ddc0583bcec 216 SpiritRefreshStatus();
rosarium 0:2ddc0583bcec 217 }while(g_xStatus.MC_STATE!=MC_STATE_STANDBY);
rosarium 0:2ddc0583bcec 218
rosarium 0:2ddc0583bcec 219 if(s_lXtalFrequency<DOUBLE_XTAL_THR)
rosarium 0:2ddc0583bcec 220 {
rosarium 0:2ddc0583bcec 221 SpiritRadioSetDigDiv(S_DISABLE);
rosarium 0:2ddc0583bcec 222 s_assert_param(IS_CH_BW(pxSRadioInitStruct->lBandwidth,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 223 }
rosarium 0:2ddc0583bcec 224 else
rosarium 0:2ddc0583bcec 225 {
rosarium 0:2ddc0583bcec 226 SpiritRadioSetDigDiv(S_ENABLE);
rosarium 0:2ddc0583bcec 227 s_assert_param(IS_CH_BW(pxSRadioInitStruct->lBandwidth,(s_lXtalFrequency>>1)));
rosarium 0:2ddc0583bcec 228 }
rosarium 0:2ddc0583bcec 229
rosarium 0:2ddc0583bcec 230 /* Goes in READY state */
rosarium 0:2ddc0583bcec 231 SpiritSpiCommandStrobes(COMMAND_READY);
rosarium 0:2ddc0583bcec 232 do{
rosarium 0:2ddc0583bcec 233 /* Delay for state transition */
rosarium 0:2ddc0583bcec 234 for(volatile uint8_t i=0; i!=0xFF; i++);
rosarium 0:2ddc0583bcec 235
rosarium 0:2ddc0583bcec 236 /* Reads the MC_STATUS register */
rosarium 0:2ddc0583bcec 237 SpiritRefreshStatus();
rosarium 0:2ddc0583bcec 238 }while(g_xStatus.MC_STATE!=MC_STATE_READY);
rosarium 0:2ddc0583bcec 239
rosarium 0:2ddc0583bcec 240 /* Calculates the FC_OFFSET parameter and cast as signed int: FOffsetTmp = (Fxtal/2^18)*FC_OFFSET */
rosarium 0:2ddc0583bcec 241 xtalOffsetFactor = (int16_t)(((float)FOffsetTmp*FBASE_DIVIDER)/s_lXtalFrequency);
rosarium 0:2ddc0583bcec 242 anaRadioRegArray[2] = (uint8_t)((((uint16_t)xtalOffsetFactor)>>8)&0x0F);
rosarium 0:2ddc0583bcec 243 anaRadioRegArray[3] = (uint8_t)(xtalOffsetFactor);
rosarium 0:2ddc0583bcec 244
rosarium 0:2ddc0583bcec 245 /* Calculates the channel space factor */
rosarium 0:2ddc0583bcec 246 anaRadioRegArray[0] =((uint32_t)pxSRadioInitStruct->nChannelSpace<<9)/(s_lXtalFrequency>>6)+1;
rosarium 0:2ddc0583bcec 247
rosarium 0:2ddc0583bcec 248 SpiritManagementWaTRxFcMem(pxSRadioInitStruct->lFrequencyBase);
rosarium 0:2ddc0583bcec 249
rosarium 0:2ddc0583bcec 250 /* 2nd order DEM algorithm enabling */
rosarium 0:2ddc0583bcec 251 uint8_t tmpreg; SpiritSpiReadRegisters(0xA3, 1, &tmpreg);
rosarium 0:2ddc0583bcec 252 tmpreg &= ~0x02; SpiritSpiWriteRegisters(0xA3, 1, &tmpreg);
rosarium 0:2ddc0583bcec 253
rosarium 0:2ddc0583bcec 254 /* Check the channel center frequency is in one of the possible range */
rosarium 0:2ddc0583bcec 255 s_assert_param(IS_FREQUENCY_BAND((pxSRadioInitStruct->lFrequencyBase + ((xtalOffsetFactor*s_lXtalFrequency)/FBASE_DIVIDER) + pxSRadioInitStruct->nChannelSpace * pxSRadioInitStruct->cChannelNumber)));
rosarium 0:2ddc0583bcec 256
rosarium 0:2ddc0583bcec 257 /* Calculates the datarate mantissa and exponent */
rosarium 0:2ddc0583bcec 258 SpiritRadioSearchDatarateME(pxSRadioInitStruct->lDatarate, &drM, &drE);
rosarium 0:2ddc0583bcec 259 digRadioRegArray[0] = (uint8_t)(drM);
rosarium 0:2ddc0583bcec 260 digRadioRegArray[1] = (uint8_t)(0x00 | pxSRadioInitStruct->xModulationSelect |drE);
rosarium 0:2ddc0583bcec 261
rosarium 0:2ddc0583bcec 262 /* Read the fdev register to preserve the clock recovery algo bit */
rosarium 0:2ddc0583bcec 263 SpiritSpiReadRegisters(0x1C, 1, &tmpreg);
rosarium 0:2ddc0583bcec 264
rosarium 0:2ddc0583bcec 265 /* Calculates the frequency deviation mantissa and exponent */
rosarium 0:2ddc0583bcec 266 SpiritRadioSearchFreqDevME(pxSRadioInitStruct->lFreqDev, &FdevM, &FdevE);
rosarium 0:2ddc0583bcec 267 digRadioRegArray[2] = (uint8_t)((FdevE<<4) | (tmpreg&0x08) | FdevM);
rosarium 0:2ddc0583bcec 268
rosarium 0:2ddc0583bcec 269 /* Calculates the channel filter mantissa and exponent */
rosarium 0:2ddc0583bcec 270 SpiritRadioSearchChannelBwME(pxSRadioInitStruct->lBandwidth, &bwM, &bwE);
rosarium 0:2ddc0583bcec 271
rosarium 0:2ddc0583bcec 272 digRadioRegArray[3] = (uint8_t)((bwM<<4) | bwE);
rosarium 0:2ddc0583bcec 273
rosarium 0:2ddc0583bcec 274 float if_off=(3.0*480140)/(s_lXtalFrequency>>12)-64;
rosarium 0:2ddc0583bcec 275
rosarium 0:2ddc0583bcec 276 uint8_t ifOffsetAna = ROUND(if_off);
rosarium 0:2ddc0583bcec 277
rosarium 0:2ddc0583bcec 278 if(s_lXtalFrequency<DOUBLE_XTAL_THR)
rosarium 0:2ddc0583bcec 279 {
rosarium 0:2ddc0583bcec 280 /* if offset digital is the same in case of single xtal */
rosarium 0:2ddc0583bcec 281 anaRadioRegArray[1] = ifOffsetAna;
rosarium 0:2ddc0583bcec 282 }
rosarium 0:2ddc0583bcec 283 else
rosarium 0:2ddc0583bcec 284 {
rosarium 0:2ddc0583bcec 285 if_off=(3.0*480140)/(s_lXtalFrequency>>13)-64;
rosarium 0:2ddc0583bcec 286
rosarium 0:2ddc0583bcec 287 /* ... otherwise recompute it */
rosarium 0:2ddc0583bcec 288 anaRadioRegArray[1] = ROUND(if_off);
rosarium 0:2ddc0583bcec 289 }
rosarium 0:2ddc0583bcec 290 // if(s_lXtalFrequency==24000000) {
rosarium 0:2ddc0583bcec 291 // ifOffsetAna = 0xB6;
rosarium 0:2ddc0583bcec 292 // anaRadioRegArray[1] = 0xB6;
rosarium 0:2ddc0583bcec 293 // }
rosarium 0:2ddc0583bcec 294 // if(s_lXtalFrequency==25000000) {
rosarium 0:2ddc0583bcec 295 // ifOffsetAna = 0xAC;
rosarium 0:2ddc0583bcec 296 // anaRadioRegArray[1] = 0xAC;
rosarium 0:2ddc0583bcec 297 // }
rosarium 0:2ddc0583bcec 298 // if(s_lXtalFrequency==26000000) {
rosarium 0:2ddc0583bcec 299 // ifOffsetAna = 0xA3;
rosarium 0:2ddc0583bcec 300 // anaRadioRegArray[1] = 0xA3;
rosarium 0:2ddc0583bcec 301 // }
rosarium 0:2ddc0583bcec 302 // if(s_lXtalFrequency==48000000) {
rosarium 0:2ddc0583bcec 303 // ifOffsetAna = 0x3B;
rosarium 0:2ddc0583bcec 304 // anaRadioRegArray[1] = 0xB6;
rosarium 0:2ddc0583bcec 305 // }
rosarium 0:2ddc0583bcec 306 // if(s_lXtalFrequency==50000000) {
rosarium 0:2ddc0583bcec 307 // ifOffsetAna = 0x36;
rosarium 0:2ddc0583bcec 308 // anaRadioRegArray[1] = 0xAC;
rosarium 0:2ddc0583bcec 309 // }
rosarium 0:2ddc0583bcec 310 // if(s_lXtalFrequency==52000000) {
rosarium 0:2ddc0583bcec 311 // ifOffsetAna = 0x31;
rosarium 0:2ddc0583bcec 312 // anaRadioRegArray[1] = 0xA3;
rosarium 0:2ddc0583bcec 313 // }
rosarium 0:2ddc0583bcec 314
rosarium 0:2ddc0583bcec 315 g_xStatus = SpiritSpiWriteRegisters(IF_OFFSET_ANA_BASE, 1, &ifOffsetAna);
rosarium 0:2ddc0583bcec 316
rosarium 0:2ddc0583bcec 317
rosarium 0:2ddc0583bcec 318 /* Sets Xtal configuration */
rosarium 0:2ddc0583bcec 319 if(s_lXtalFrequency>DOUBLE_XTAL_THR)
rosarium 0:2ddc0583bcec 320 {
rosarium 0:2ddc0583bcec 321 SpiritRadioSetXtalFlag(XTAL_FLAG((s_lXtalFrequency/2)));
rosarium 0:2ddc0583bcec 322 }
rosarium 0:2ddc0583bcec 323 else
rosarium 0:2ddc0583bcec 324 {
rosarium 0:2ddc0583bcec 325 SpiritRadioSetXtalFlag(XTAL_FLAG(s_lXtalFrequency));
rosarium 0:2ddc0583bcec 326 }
rosarium 0:2ddc0583bcec 327
rosarium 0:2ddc0583bcec 328 /* Sets the channel number in the corresponding register */
rosarium 0:2ddc0583bcec 329 SpiritSpiWriteRegisters(CHNUM_BASE, 1, &pxSRadioInitStruct->cChannelNumber);
rosarium 0:2ddc0583bcec 330
rosarium 0:2ddc0583bcec 331 /* Configures the Analog Radio registers */
rosarium 0:2ddc0583bcec 332 SpiritSpiWriteRegisters(CHSPACE_BASE, 4, anaRadioRegArray);
rosarium 0:2ddc0583bcec 333
rosarium 0:2ddc0583bcec 334 /* Configures the Digital Radio registers */
rosarium 0:2ddc0583bcec 335 g_xStatus = SpiritSpiWriteRegisters(MOD1_BASE, 4, digRadioRegArray);
rosarium 0:2ddc0583bcec 336
rosarium 0:2ddc0583bcec 337 /* Enable the freeze option of the AFC on the SYNC word */
rosarium 0:2ddc0583bcec 338 SpiritRadioAFCFreezeOnSync(S_ENABLE);
rosarium 0:2ddc0583bcec 339
rosarium 0:2ddc0583bcec 340 /* Set the IQC correction optimal value */
rosarium 0:2ddc0583bcec 341 anaRadioRegArray[0]=0x80;
rosarium 0:2ddc0583bcec 342 anaRadioRegArray[1]=0xE3;
rosarium 0:2ddc0583bcec 343 g_xStatus = SpiritSpiWriteRegisters(0x99, 2, anaRadioRegArray);
rosarium 0:2ddc0583bcec 344
rosarium 0:2ddc0583bcec 345 return SpiritRadioSetFrequencyBase(pxSRadioInitStruct->lFrequencyBase);
rosarium 0:2ddc0583bcec 346
rosarium 0:2ddc0583bcec 347 }
rosarium 0:2ddc0583bcec 348
rosarium 0:2ddc0583bcec 349
rosarium 0:2ddc0583bcec 350 /**
rosarium 0:2ddc0583bcec 351 * @brief Returns the SPIRIT analog and digital radio structure according to the registers value.
rosarium 0:2ddc0583bcec 352 * @param pxSRadioInitStruct pointer to a SRadioInit structure that
rosarium 0:2ddc0583bcec 353 * contains the configuration information for the analog radio part of SPIRIT.
rosarium 0:2ddc0583bcec 354 * @retval None.
rosarium 0:2ddc0583bcec 355 */
rosarium 0:2ddc0583bcec 356 void SpiritRadioGetInfo(SRadioInit* pxSRadioInitStruct)
rosarium 0:2ddc0583bcec 357 {
rosarium 0:2ddc0583bcec 358 uint8_t anaRadioRegArray[8], digRadioRegArray[4];
rosarium 0:2ddc0583bcec 359 BandSelect band;
rosarium 0:2ddc0583bcec 360 int16_t xtalOffsetFactor;
rosarium 0:2ddc0583bcec 361
rosarium 0:2ddc0583bcec 362 /* Get the RF board version */
rosarium 0:2ddc0583bcec 363 //SpiritVersion xSpiritVersion = SpiritGeneralGetSpiritVersion();
rosarium 0:2ddc0583bcec 364
rosarium 0:2ddc0583bcec 365 /* Reads the Analog Radio registers */
rosarium 0:2ddc0583bcec 366 SpiritSpiReadRegisters(SYNT3_BASE, 8, anaRadioRegArray);
rosarium 0:2ddc0583bcec 367
rosarium 0:2ddc0583bcec 368 /* Reads the Digital Radio registers */
rosarium 0:2ddc0583bcec 369 g_xStatus = SpiritSpiReadRegisters(MOD1_BASE, 4, digRadioRegArray);
rosarium 0:2ddc0583bcec 370
rosarium 0:2ddc0583bcec 371 /* Reads the operating band masking the Band selected field */
rosarium 0:2ddc0583bcec 372 if((anaRadioRegArray[3] & 0x07) == SYNT0_BS_6)
rosarium 0:2ddc0583bcec 373 {
rosarium 0:2ddc0583bcec 374 band = HIGH_BAND;
rosarium 0:2ddc0583bcec 375 }
rosarium 0:2ddc0583bcec 376 else if ((anaRadioRegArray[3] & 0x07) == SYNT0_BS_12)
rosarium 0:2ddc0583bcec 377 {
rosarium 0:2ddc0583bcec 378 band = MIDDLE_BAND;
rosarium 0:2ddc0583bcec 379 }
rosarium 0:2ddc0583bcec 380 else if ((anaRadioRegArray[3] & 0x07) == SYNT0_BS_16)
rosarium 0:2ddc0583bcec 381 {
rosarium 0:2ddc0583bcec 382 band = LOW_BAND;
rosarium 0:2ddc0583bcec 383 }
rosarium 0:2ddc0583bcec 384 else if ((anaRadioRegArray[3] & 0x07) == SYNT0_BS_32)
rosarium 0:2ddc0583bcec 385 {
rosarium 0:2ddc0583bcec 386 band = VERY_LOW_BAND;
rosarium 0:2ddc0583bcec 387 }
rosarium 0:2ddc0583bcec 388 else
rosarium 0:2ddc0583bcec 389 {
rosarium 0:2ddc0583bcec 390 /* if it is another value, set it to a valid one in order to avoid access violation */
rosarium 0:2ddc0583bcec 391 uint8_t tmp=(anaRadioRegArray[3]&0xF8)|SYNT0_BS_6;
rosarium 0:2ddc0583bcec 392 SpiritSpiWriteRegisters(SYNT0_BASE,1,&tmp);
rosarium 0:2ddc0583bcec 393 band = HIGH_BAND;
rosarium 0:2ddc0583bcec 394 }
rosarium 0:2ddc0583bcec 395
rosarium 0:2ddc0583bcec 396 /* Computes the synth word */
rosarium 0:2ddc0583bcec 397 uint32_t synthWord = (uint32_t)((((uint32_t)(anaRadioRegArray[0]&0x1F))<<21)+(((uint32_t)(anaRadioRegArray[1]))<<13)+\
rosarium 0:2ddc0583bcec 398 (((uint32_t)(anaRadioRegArray[2]))<<5)+(((uint32_t)(anaRadioRegArray[3]))>>3));
rosarium 0:2ddc0583bcec 399
rosarium 0:2ddc0583bcec 400 /* Calculates the frequency base */
rosarium 0:2ddc0583bcec 401 uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1;
rosarium 0:2ddc0583bcec 402 pxSRadioInitStruct->lFrequencyBase = (uint32_t)round(synthWord*(((double)s_lXtalFrequency)/(FBASE_DIVIDER*cRefDiv*s_vectcBHalfFactor[band])));
rosarium 0:2ddc0583bcec 403
rosarium 0:2ddc0583bcec 404 /* Calculates the Offset Factor */
rosarium 0:2ddc0583bcec 405 uint16_t xtalOffTemp = ((((uint16_t)anaRadioRegArray[6])<<8)+((uint16_t)anaRadioRegArray[7]));
rosarium 0:2ddc0583bcec 406
rosarium 0:2ddc0583bcec 407 /* If a negative number then convert the 12 bit 2-complement in a 16 bit number */
rosarium 0:2ddc0583bcec 408 if(xtalOffTemp & 0x0800)
rosarium 0:2ddc0583bcec 409 {
rosarium 0:2ddc0583bcec 410 xtalOffTemp = xtalOffTemp | 0xF000;
rosarium 0:2ddc0583bcec 411 }
rosarium 0:2ddc0583bcec 412 else
rosarium 0:2ddc0583bcec 413 {
rosarium 0:2ddc0583bcec 414 xtalOffTemp = xtalOffTemp & 0x0FFF;
rosarium 0:2ddc0583bcec 415 }
rosarium 0:2ddc0583bcec 416
rosarium 0:2ddc0583bcec 417 xtalOffsetFactor = *((int16_t*)(&xtalOffTemp));
rosarium 0:2ddc0583bcec 418
rosarium 0:2ddc0583bcec 419 /* Calculates the frequency offset in ppm */
rosarium 0:2ddc0583bcec 420 pxSRadioInitStruct->nXtalOffsetPpm =(int16_t)((uint32_t)xtalOffsetFactor*s_lXtalFrequency*PPM_FACTOR)/((uint32_t)FBASE_DIVIDER*pxSRadioInitStruct->lFrequencyBase);
rosarium 0:2ddc0583bcec 421
rosarium 0:2ddc0583bcec 422 /* Channel space */
rosarium 0:2ddc0583bcec 423 pxSRadioInitStruct->nChannelSpace = anaRadioRegArray[4]*(s_lXtalFrequency>>15);
rosarium 0:2ddc0583bcec 424
rosarium 0:2ddc0583bcec 425 /* Channel number */
rosarium 0:2ddc0583bcec 426 pxSRadioInitStruct->cChannelNumber = SpiritRadioGetChannel();
rosarium 0:2ddc0583bcec 427
rosarium 0:2ddc0583bcec 428 /* Modulation select */
rosarium 0:2ddc0583bcec 429 pxSRadioInitStruct->xModulationSelect = (ModulationSelect)(digRadioRegArray[1] & 0x70);
rosarium 0:2ddc0583bcec 430
rosarium 0:2ddc0583bcec 431 /* Reads the frequency deviation for mantissa and exponent */
rosarium 0:2ddc0583bcec 432 uint8_t FDevM = digRadioRegArray[2]&0x07;
rosarium 0:2ddc0583bcec 433 uint8_t FDevE = (digRadioRegArray[2]&0xF0)>>4;
rosarium 0:2ddc0583bcec 434
rosarium 0:2ddc0583bcec 435 /* Reads the channel filter register for mantissa and exponent */
rosarium 0:2ddc0583bcec 436 uint8_t bwM = (digRadioRegArray[3]&0xF0)>>4;
rosarium 0:2ddc0583bcec 437 uint8_t bwE = digRadioRegArray[3]&0x0F;
rosarium 0:2ddc0583bcec 438
rosarium 0:2ddc0583bcec 439 uint8_t cDivider = 0;
rosarium 0:2ddc0583bcec 440 cDivider = SpiritRadioGetDigDiv();
rosarium 0:2ddc0583bcec 441
rosarium 0:2ddc0583bcec 442 /* Calculates the datarate */
rosarium 0:2ddc0583bcec 443 pxSRadioInitStruct->lDatarate = ((s_lXtalFrequency>>(5+cDivider))*(256+digRadioRegArray[0]))>>(23-(digRadioRegArray[1]&0x0F));
rosarium 0:2ddc0583bcec 444
rosarium 0:2ddc0583bcec 445 /* Calculates the frequency deviation */
rosarium 0:2ddc0583bcec 446 // (((s_lXtalFrequency>>6)*(8+FDevM))>>(12-FDevE+cCorrection));
rosarium 0:2ddc0583bcec 447 pxSRadioInitStruct->lFreqDev =(uint32_t)((float)s_lXtalFrequency/(((uint32_t)1)<<18)*(uint32_t)((8.0+FDevM)/2*(1<<FDevE)));
rosarium 0:2ddc0583bcec 448
rosarium 0:2ddc0583bcec 449 /* Reads the channel filter bandwidth from the look-up table and return it */
rosarium 0:2ddc0583bcec 450 pxSRadioInitStruct->lBandwidth = (uint32_t)(100.0*s_vectnBandwidth26M[bwM+(bwE*9)]*((s_lXtalFrequency>>cDivider)/26e6));
rosarium 0:2ddc0583bcec 451
rosarium 0:2ddc0583bcec 452 }
rosarium 0:2ddc0583bcec 453
rosarium 0:2ddc0583bcec 454
rosarium 0:2ddc0583bcec 455 /**
rosarium 0:2ddc0583bcec 456 * @brief Sets the Xtal configuration in the ANA_FUNC_CONF0 register.
rosarium 0:2ddc0583bcec 457 * @param xXtal one of the possible value of the enum type XtalFrequency.
rosarium 0:2ddc0583bcec 458 * @arg XTAL_FLAG_24_MHz: in case of 24 MHz crystal
rosarium 0:2ddc0583bcec 459 * @arg XTAL_FLAG_26_MHz: in case of 26 MHz crystal
rosarium 0:2ddc0583bcec 460 * @retval None.
rosarium 0:2ddc0583bcec 461 */
rosarium 0:2ddc0583bcec 462 void SpiritRadioSetXtalFlag(XtalFlag xXtal)
rosarium 0:2ddc0583bcec 463 {
rosarium 0:2ddc0583bcec 464 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 465
rosarium 0:2ddc0583bcec 466 /* Check the parameters */
rosarium 0:2ddc0583bcec 467 s_assert_param(IS_XTAL_FLAG(xXtal));
rosarium 0:2ddc0583bcec 468
rosarium 0:2ddc0583bcec 469 /* Reads the ANA_FUNC_CONF_0 register */
rosarium 0:2ddc0583bcec 470 g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 471 if(xXtal == XTAL_FLAG_26_MHz)
rosarium 0:2ddc0583bcec 472 {
rosarium 0:2ddc0583bcec 473 tempRegValue|=SELECT_24_26_MHZ_MASK;
rosarium 0:2ddc0583bcec 474 }
rosarium 0:2ddc0583bcec 475 else
rosarium 0:2ddc0583bcec 476 {
rosarium 0:2ddc0583bcec 477 tempRegValue &= (~SELECT_24_26_MHZ_MASK);
rosarium 0:2ddc0583bcec 478 }
rosarium 0:2ddc0583bcec 479
rosarium 0:2ddc0583bcec 480 /* Sets the 24_26MHz_SELECT field in the ANA_FUNC_CONF_0 register */
rosarium 0:2ddc0583bcec 481 g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 482
rosarium 0:2ddc0583bcec 483 }
rosarium 0:2ddc0583bcec 484
rosarium 0:2ddc0583bcec 485
rosarium 0:2ddc0583bcec 486 /**
rosarium 0:2ddc0583bcec 487 * @brief Returns the Xtal configuration in the ANA_FUNC_CONF0 register.
rosarium 0:2ddc0583bcec 488 * @param None.
rosarium 0:2ddc0583bcec 489 * @retval XtalFrequency Settled Xtal configuration.
rosarium 0:2ddc0583bcec 490 */
rosarium 0:2ddc0583bcec 491 XtalFlag SpiritRadioGetXtalFlag(void)
rosarium 0:2ddc0583bcec 492 {
rosarium 0:2ddc0583bcec 493 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 494
rosarium 0:2ddc0583bcec 495 /* Reads the Xtal configuration in the ANA_FUNC_CONF_0 register and return the value */
rosarium 0:2ddc0583bcec 496 g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 497
rosarium 0:2ddc0583bcec 498 return (XtalFlag)((tempRegValue & 0x40)>>6);
rosarium 0:2ddc0583bcec 499
rosarium 0:2ddc0583bcec 500 }
rosarium 0:2ddc0583bcec 501
rosarium 0:2ddc0583bcec 502
rosarium 0:2ddc0583bcec 503 /**
rosarium 0:2ddc0583bcec 504 * @brief Returns the charge pump word for a given VCO frequency.
rosarium 0:2ddc0583bcec 505 * @param lFc channel center frequency expressed in Hz.
rosarium 0:2ddc0583bcec 506 * This parameter can be a value in one of the following ranges:<ul>
rosarium 0:2ddc0583bcec 507 * <li> High_Band: from 779 MHz to 915 MHz </li>
rosarium 0:2ddc0583bcec 508 * <li> Middle Band: from 387 MHz to 470 MHz </li>
rosarium 0:2ddc0583bcec 509 * <li> Low Band: from 300 MHz to 348 MHz </li>
rosarium 0:2ddc0583bcec 510 * <li> Very low Band: from 150 MHz to 174 MHz </li> </ul>
rosarium 0:2ddc0583bcec 511 * @retval uint8_t Charge pump word.
rosarium 0:2ddc0583bcec 512 */
rosarium 0:2ddc0583bcec 513 uint8_t SpiritRadioSearchWCP(uint32_t lFc)
rosarium 0:2ddc0583bcec 514 {
rosarium 0:2ddc0583bcec 515 int8_t i;
rosarium 0:2ddc0583bcec 516 uint32_t vcofreq;
rosarium 0:2ddc0583bcec 517 uint8_t BFactor;
rosarium 0:2ddc0583bcec 518
rosarium 0:2ddc0583bcec 519 /* Check the channel center frequency is in one of the possible range */
rosarium 0:2ddc0583bcec 520 s_assert_param(IS_FREQUENCY_BAND(lFc));
rosarium 0:2ddc0583bcec 521
rosarium 0:2ddc0583bcec 522 /* Search the operating band */
rosarium 0:2ddc0583bcec 523 if(IS_FREQUENCY_BAND_HIGH(lFc))
rosarium 0:2ddc0583bcec 524 {
rosarium 0:2ddc0583bcec 525 BFactor = HIGH_BAND_FACTOR;
rosarium 0:2ddc0583bcec 526 }
rosarium 0:2ddc0583bcec 527 else if(IS_FREQUENCY_BAND_MIDDLE(lFc))
rosarium 0:2ddc0583bcec 528 {
rosarium 0:2ddc0583bcec 529 BFactor = MIDDLE_BAND_FACTOR;
rosarium 0:2ddc0583bcec 530 }
rosarium 0:2ddc0583bcec 531 else if(IS_FREQUENCY_BAND_LOW(lFc))
rosarium 0:2ddc0583bcec 532 {
rosarium 0:2ddc0583bcec 533 BFactor = LOW_BAND_FACTOR;
rosarium 0:2ddc0583bcec 534 }
rosarium 0:2ddc0583bcec 535 else
rosarium 0:2ddc0583bcec 536 {
rosarium 0:2ddc0583bcec 537 BFactor = VERY_LOW_BAND_FACTOR;
rosarium 0:2ddc0583bcec 538 }
rosarium 0:2ddc0583bcec 539
rosarium 0:2ddc0583bcec 540 /* Calculates the VCO frequency VCOFreq = lFc*B */
rosarium 0:2ddc0583bcec 541 vcofreq = (lFc/1000000)*BFactor;
rosarium 0:2ddc0583bcec 542
rosarium 0:2ddc0583bcec 543 /* Search in the vco frequency array the charge pump word */
rosarium 0:2ddc0583bcec 544 if(vcofreq>=s_vectnVCOFreq[15])
rosarium 0:2ddc0583bcec 545 {
rosarium 0:2ddc0583bcec 546 i=15;
rosarium 0:2ddc0583bcec 547 }
rosarium 0:2ddc0583bcec 548 else
rosarium 0:2ddc0583bcec 549 {
rosarium 0:2ddc0583bcec 550 /* Search the value */
rosarium 0:2ddc0583bcec 551 for(i=0 ; i<15 && vcofreq>s_vectnVCOFreq[i] ; i++);
rosarium 0:2ddc0583bcec 552
rosarium 0:2ddc0583bcec 553 /* Be sure that it is the best approssimation */
rosarium 0:2ddc0583bcec 554 if (i!=0 && s_vectnVCOFreq[i]-vcofreq>vcofreq-s_vectnVCOFreq[i-1])
rosarium 0:2ddc0583bcec 555 i--;
rosarium 0:2ddc0583bcec 556 }
rosarium 0:2ddc0583bcec 557
rosarium 0:2ddc0583bcec 558 /* Return index */
rosarium 0:2ddc0583bcec 559 return (i%8);
rosarium 0:2ddc0583bcec 560
rosarium 0:2ddc0583bcec 561 }
rosarium 0:2ddc0583bcec 562
rosarium 0:2ddc0583bcec 563 /**
rosarium 0:2ddc0583bcec 564 * @brief Returns the synth word.
rosarium 0:2ddc0583bcec 565 * @param None.
rosarium 0:2ddc0583bcec 566 * @retval uint32_t Synth word.
rosarium 0:2ddc0583bcec 567 */
rosarium 0:2ddc0583bcec 568 uint32_t SpiritRadioGetSynthWord(void)
rosarium 0:2ddc0583bcec 569 {
rosarium 0:2ddc0583bcec 570 uint8_t regArray[4];
rosarium 0:2ddc0583bcec 571
rosarium 0:2ddc0583bcec 572 /* Reads the SYNTH registers, build the synth word and return it */
rosarium 0:2ddc0583bcec 573 g_xStatus = SpiritSpiReadRegisters(SYNT3_BASE, 4, regArray);
rosarium 0:2ddc0583bcec 574 return ((((uint32_t)(regArray[0]&0x1F))<<21)+(((uint32_t)(regArray[1]))<<13)+\
rosarium 0:2ddc0583bcec 575 (((uint32_t)(regArray[2]))<<5)+(((uint32_t)(regArray[3]))>>3));
rosarium 0:2ddc0583bcec 576
rosarium 0:2ddc0583bcec 577 }
rosarium 0:2ddc0583bcec 578
rosarium 0:2ddc0583bcec 579
rosarium 0:2ddc0583bcec 580 /**
rosarium 0:2ddc0583bcec 581 * @brief Sets the SYNTH registers.
rosarium 0:2ddc0583bcec 582 * @param lSynthWord the synth word to write in the SYNTH[3:0] registers.
rosarium 0:2ddc0583bcec 583 * @retval None.
rosarium 0:2ddc0583bcec 584 */
rosarium 0:2ddc0583bcec 585 void SpiritRadioSetSynthWord(uint32_t lSynthWord)
rosarium 0:2ddc0583bcec 586 {
rosarium 0:2ddc0583bcec 587 uint8_t tempArray[4];
rosarium 0:2ddc0583bcec 588 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 589
rosarium 0:2ddc0583bcec 590 /* Reads the SYNT0 register */
rosarium 0:2ddc0583bcec 591 g_xStatus = SpiritSpiReadRegisters(SYNT0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 592
rosarium 0:2ddc0583bcec 593 /* Mask the Band selected field */
rosarium 0:2ddc0583bcec 594 tempRegValue &= 0x07;
rosarium 0:2ddc0583bcec 595
rosarium 0:2ddc0583bcec 596 /* Build the array for SYNTH registers */
rosarium 0:2ddc0583bcec 597 tempArray[0] = (uint8_t)((lSynthWord>>21)&(0x0000001F));
rosarium 0:2ddc0583bcec 598 tempArray[1] = (uint8_t)((lSynthWord>>13)&(0x000000FF));
rosarium 0:2ddc0583bcec 599 tempArray[2] = (uint8_t)((lSynthWord>>5)&(0x000000FF));
rosarium 0:2ddc0583bcec 600 tempArray[3] = (uint8_t)(((lSynthWord&0x0000001F)<<3)| tempRegValue);
rosarium 0:2ddc0583bcec 601
rosarium 0:2ddc0583bcec 602 /* Writes the synth word in the SYNTH registers */
rosarium 0:2ddc0583bcec 603 g_xStatus = SpiritSpiWriteRegisters(SYNT3_BASE, 4, tempArray);
rosarium 0:2ddc0583bcec 604
rosarium 0:2ddc0583bcec 605 }
rosarium 0:2ddc0583bcec 606
rosarium 0:2ddc0583bcec 607
rosarium 0:2ddc0583bcec 608 /**
rosarium 0:2ddc0583bcec 609 * @brief Sets the operating band.
rosarium 0:2ddc0583bcec 610 * @param xBand the band to set.
rosarium 0:2ddc0583bcec 611 * This parameter can be one of following parameters:
rosarium 0:2ddc0583bcec 612 * @arg HIGH_BAND High_Band selected: from 779 MHz to 915 MHz
rosarium 0:2ddc0583bcec 613 * @arg MIDDLE_BAND: Middle Band selected: from 387 MHz to 470 MHz
rosarium 0:2ddc0583bcec 614 * @arg LOW_BAND: Low Band selected: from 300 MHz to 348 MHz
rosarium 0:2ddc0583bcec 615 * @arg VERY_LOW_BAND: Very low Band selected: from 150 MHz to 174 MHz
rosarium 0:2ddc0583bcec 616 * @retval None.
rosarium 0:2ddc0583bcec 617 */
rosarium 0:2ddc0583bcec 618 void SpiritRadioSetBand(BandSelect xBand)
rosarium 0:2ddc0583bcec 619 {
rosarium 0:2ddc0583bcec 620 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 621
rosarium 0:2ddc0583bcec 622 /* Check the parameters */
rosarium 0:2ddc0583bcec 623 s_assert_param(IS_BAND_SELECTED(xBand));
rosarium 0:2ddc0583bcec 624
rosarium 0:2ddc0583bcec 625 /* Reads the SYNT0 register*/
rosarium 0:2ddc0583bcec 626 g_xStatus = SpiritSpiReadRegisters(SYNT0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 627
rosarium 0:2ddc0583bcec 628 /* Mask the SYNTH[4;0] field and write the BS value */
rosarium 0:2ddc0583bcec 629 tempRegValue &= 0xF8;
rosarium 0:2ddc0583bcec 630 tempRegValue |= s_vectcBandRegValue[xBand];
rosarium 0:2ddc0583bcec 631
rosarium 0:2ddc0583bcec 632 /* Configures the SYNT0 register setting the operating band */
rosarium 0:2ddc0583bcec 633 g_xStatus = SpiritSpiWriteRegisters(SYNT0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 634
rosarium 0:2ddc0583bcec 635 }
rosarium 0:2ddc0583bcec 636
rosarium 0:2ddc0583bcec 637
rosarium 0:2ddc0583bcec 638 /**
rosarium 0:2ddc0583bcec 639 * @brief Returns the operating band.
rosarium 0:2ddc0583bcec 640 * @param None.
rosarium 0:2ddc0583bcec 641 * @retval BandSelect Settled band.
rosarium 0:2ddc0583bcec 642 * This returned value can be one of the following parameters:
rosarium 0:2ddc0583bcec 643 * @arg HIGH_BAND High_Band selected: from 779 MHz to 915 MHz
rosarium 0:2ddc0583bcec 644 * @arg MIDDLE_BAND: Middle Band selected: from 387 MHz to 470 MHz
rosarium 0:2ddc0583bcec 645 * @arg LOW_BAND: Low Band selected: from 300 MHz to 348 MHz
rosarium 0:2ddc0583bcec 646 * @arg VERY_LOW_BAND: Very low Band selected: from 150 MHz to 174 MHz
rosarium 0:2ddc0583bcec 647 */
rosarium 0:2ddc0583bcec 648 BandSelect SpiritRadioGetBand(void)
rosarium 0:2ddc0583bcec 649 {
rosarium 0:2ddc0583bcec 650 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 651
rosarium 0:2ddc0583bcec 652 /* Reads the SYNT0 register */
rosarium 0:2ddc0583bcec 653 g_xStatus = SpiritSpiReadRegisters(SYNT0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 654
rosarium 0:2ddc0583bcec 655 /* Mask the Band selected field */
rosarium 0:2ddc0583bcec 656 if((tempRegValue & 0x07) == SYNT0_BS_6)
rosarium 0:2ddc0583bcec 657 {
rosarium 0:2ddc0583bcec 658 return HIGH_BAND;
rosarium 0:2ddc0583bcec 659 }
rosarium 0:2ddc0583bcec 660 else if ((tempRegValue & 0x07) == SYNT0_BS_12)
rosarium 0:2ddc0583bcec 661 {
rosarium 0:2ddc0583bcec 662 return MIDDLE_BAND;
rosarium 0:2ddc0583bcec 663 }
rosarium 0:2ddc0583bcec 664 else if ((tempRegValue & 0x07) == SYNT0_BS_16)
rosarium 0:2ddc0583bcec 665 {
rosarium 0:2ddc0583bcec 666 return LOW_BAND;
rosarium 0:2ddc0583bcec 667 }
rosarium 0:2ddc0583bcec 668 else
rosarium 0:2ddc0583bcec 669 {
rosarium 0:2ddc0583bcec 670 return VERY_LOW_BAND;
rosarium 0:2ddc0583bcec 671 }
rosarium 0:2ddc0583bcec 672
rosarium 0:2ddc0583bcec 673 }
rosarium 0:2ddc0583bcec 674
rosarium 0:2ddc0583bcec 675
rosarium 0:2ddc0583bcec 676 /**
rosarium 0:2ddc0583bcec 677 * @brief Sets the channel number.
rosarium 0:2ddc0583bcec 678 * @param cChannel the channel number.
rosarium 0:2ddc0583bcec 679 * @retval None.
rosarium 0:2ddc0583bcec 680 */
rosarium 0:2ddc0583bcec 681 void SpiritRadioSetChannel(uint8_t cChannel)
rosarium 0:2ddc0583bcec 682 {
rosarium 0:2ddc0583bcec 683 /* Writes the CHNUM register */
rosarium 0:2ddc0583bcec 684 g_xStatus = SpiritSpiWriteRegisters(CHNUM_BASE, 1, &cChannel);
rosarium 0:2ddc0583bcec 685
rosarium 0:2ddc0583bcec 686 }
rosarium 0:2ddc0583bcec 687
rosarium 0:2ddc0583bcec 688
rosarium 0:2ddc0583bcec 689 /**
rosarium 0:2ddc0583bcec 690 * @brief Returns the actual channel number.
rosarium 0:2ddc0583bcec 691 * @param None.
rosarium 0:2ddc0583bcec 692 * @retval uint8_t Actual channel number.
rosarium 0:2ddc0583bcec 693 */
rosarium 0:2ddc0583bcec 694 uint8_t SpiritRadioGetChannel(void)
rosarium 0:2ddc0583bcec 695 {
rosarium 0:2ddc0583bcec 696 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 697
rosarium 0:2ddc0583bcec 698 /* Reads the CHNUM register and return the value */
rosarium 0:2ddc0583bcec 699 g_xStatus = SpiritSpiReadRegisters(CHNUM_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 700
rosarium 0:2ddc0583bcec 701 return tempRegValue;
rosarium 0:2ddc0583bcec 702
rosarium 0:2ddc0583bcec 703 }
rosarium 0:2ddc0583bcec 704
rosarium 0:2ddc0583bcec 705
rosarium 0:2ddc0583bcec 706 /**
rosarium 0:2ddc0583bcec 707 * @brief Sets the channel space factor in channel space register.
rosarium 0:2ddc0583bcec 708 * The channel spacing step is computed as F_Xo/32768.
rosarium 0:2ddc0583bcec 709 * @param fChannelSpace the channel space expressed in Hz.
rosarium 0:2ddc0583bcec 710 * @retval None.
rosarium 0:2ddc0583bcec 711 */
rosarium 0:2ddc0583bcec 712 void SpiritRadioSetChannelSpace(uint32_t fChannelSpace)
rosarium 0:2ddc0583bcec 713 {
rosarium 0:2ddc0583bcec 714 uint8_t cChannelSpaceFactor;
rosarium 0:2ddc0583bcec 715
rosarium 0:2ddc0583bcec 716 /* Round to the nearest integer */
rosarium 0:2ddc0583bcec 717 cChannelSpaceFactor = ((uint32_t)fChannelSpace*CHSPACE_DIVIDER)/s_lXtalFrequency;
rosarium 0:2ddc0583bcec 718
rosarium 0:2ddc0583bcec 719 /* Write value into the register */
rosarium 0:2ddc0583bcec 720 g_xStatus = SpiritSpiWriteRegisters(CHSPACE_BASE, 1, &cChannelSpaceFactor);
rosarium 0:2ddc0583bcec 721
rosarium 0:2ddc0583bcec 722 }
rosarium 0:2ddc0583bcec 723
rosarium 0:2ddc0583bcec 724
rosarium 0:2ddc0583bcec 725 /**
rosarium 0:2ddc0583bcec 726 * @brief Returns the channel space register.
rosarium 0:2ddc0583bcec 727 * @param None.
rosarium 0:2ddc0583bcec 728 * @retval uint32_t Channel space. The channel space is: CS = channel_space_factor x XtalFrequency/2^15
rosarium 0:2ddc0583bcec 729 * where channel_space_factor is the CHSPACE register value.
rosarium 0:2ddc0583bcec 730 */
rosarium 0:2ddc0583bcec 731 uint32_t SpiritRadioGetChannelSpace(void)
rosarium 0:2ddc0583bcec 732 {
rosarium 0:2ddc0583bcec 733 uint8_t channelSpaceFactor;
rosarium 0:2ddc0583bcec 734
rosarium 0:2ddc0583bcec 735 /* Reads the CHSPACE register, calculate the channel space and return it */
rosarium 0:2ddc0583bcec 736 g_xStatus = SpiritSpiReadRegisters(CHSPACE_BASE, 1, &channelSpaceFactor);
rosarium 0:2ddc0583bcec 737
rosarium 0:2ddc0583bcec 738 /* Compute the Hertz value and return it */
rosarium 0:2ddc0583bcec 739 return ((channelSpaceFactor*s_lXtalFrequency)/CHSPACE_DIVIDER);
rosarium 0:2ddc0583bcec 740
rosarium 0:2ddc0583bcec 741 }
rosarium 0:2ddc0583bcec 742
rosarium 0:2ddc0583bcec 743
rosarium 0:2ddc0583bcec 744 /**
rosarium 0:2ddc0583bcec 745 * @brief Sets the FC OFFSET register starting from xtal ppm value.
rosarium 0:2ddc0583bcec 746 * @param nXtalPpm the xtal offset expressed in ppm.
rosarium 0:2ddc0583bcec 747 * @retval None.
rosarium 0:2ddc0583bcec 748 */
rosarium 0:2ddc0583bcec 749 void SpiritRadioSetFrequencyOffsetPpm(int16_t nXtalPpm)
rosarium 0:2ddc0583bcec 750 {
rosarium 0:2ddc0583bcec 751 uint8_t tempArray[2];
rosarium 0:2ddc0583bcec 752 int16_t xtalOffsetFactor;
rosarium 0:2ddc0583bcec 753 uint32_t synthWord, fBase;
rosarium 0:2ddc0583bcec 754 int32_t FOffsetTmp;
rosarium 0:2ddc0583bcec 755 BandSelect band;
rosarium 0:2ddc0583bcec 756
rosarium 0:2ddc0583bcec 757 /* Reads the synth word */
rosarium 0:2ddc0583bcec 758 synthWord = SpiritRadioGetSynthWord();
rosarium 0:2ddc0583bcec 759
rosarium 0:2ddc0583bcec 760 /* Reads the operating band */
rosarium 0:2ddc0583bcec 761 band = SpiritRadioGetBand();
rosarium 0:2ddc0583bcec 762
rosarium 0:2ddc0583bcec 763 /* Calculates the frequency base */
rosarium 0:2ddc0583bcec 764 uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1;
rosarium 0:2ddc0583bcec 765 fBase = synthWord*(s_lXtalFrequency/(s_vectcBHalfFactor[band]*cRefDiv)/FBASE_DIVIDER);
rosarium 0:2ddc0583bcec 766
rosarium 0:2ddc0583bcec 767 /* Calculates the offset respect to RF frequency and according to xtal_ppm parameter */
rosarium 0:2ddc0583bcec 768 FOffsetTmp = (int32_t)(((float)nXtalPpm*fBase)/PPM_FACTOR);
rosarium 0:2ddc0583bcec 769
rosarium 0:2ddc0583bcec 770 /* Check the Offset is in the correct range */
rosarium 0:2ddc0583bcec 771 s_assert_param(IS_FREQUENCY_OFFSET(FOffsetTmp,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 772
rosarium 0:2ddc0583bcec 773 /* Calculates the FC_OFFSET value to write in the corresponding register */
rosarium 0:2ddc0583bcec 774 xtalOffsetFactor = (int16_t)(((float)FOffsetTmp*FBASE_DIVIDER)/s_lXtalFrequency);
rosarium 0:2ddc0583bcec 775
rosarium 0:2ddc0583bcec 776 /* Build the array related to the FC_OFFSET_1 and FC_OFFSET_0 register */
rosarium 0:2ddc0583bcec 777 tempArray[0]=(uint8_t)((((uint16_t)xtalOffsetFactor)>>8)&0x0F);
rosarium 0:2ddc0583bcec 778 tempArray[1]=(uint8_t)(xtalOffsetFactor);
rosarium 0:2ddc0583bcec 779
rosarium 0:2ddc0583bcec 780 /* Writes the FC_OFFSET registers */
rosarium 0:2ddc0583bcec 781 g_xStatus = SpiritSpiWriteRegisters(FC_OFFSET1_BASE, 2, tempArray);
rosarium 0:2ddc0583bcec 782
rosarium 0:2ddc0583bcec 783 }
rosarium 0:2ddc0583bcec 784
rosarium 0:2ddc0583bcec 785
rosarium 0:2ddc0583bcec 786 /**
rosarium 0:2ddc0583bcec 787 * @brief Sets the FC OFFSET register starting from frequency offset expressed in Hz.
rosarium 0:2ddc0583bcec 788 * @param lFOffset frequency offset expressed in Hz as signed word.
rosarium 0:2ddc0583bcec 789 * @retval None.
rosarium 0:2ddc0583bcec 790 */
rosarium 0:2ddc0583bcec 791 void SpiritRadioSetFrequencyOffset(int32_t lFOffset)
rosarium 0:2ddc0583bcec 792 {
rosarium 0:2ddc0583bcec 793 uint8_t tempArray[2];
rosarium 0:2ddc0583bcec 794 int16_t offset;
rosarium 0:2ddc0583bcec 795
rosarium 0:2ddc0583bcec 796 /* Check that the Offset is in the correct range */
rosarium 0:2ddc0583bcec 797 s_assert_param(IS_FREQUENCY_OFFSET(lFOffset,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 798
rosarium 0:2ddc0583bcec 799 /* Calculates the offset value to write in the FC_OFFSET register */
rosarium 0:2ddc0583bcec 800 offset = (int16_t)(((float)lFOffset*FBASE_DIVIDER)/s_lXtalFrequency);
rosarium 0:2ddc0583bcec 801
rosarium 0:2ddc0583bcec 802 /* Build the array related to the FC_OFFSET_1 and FC_OFFSET_0 register */
rosarium 0:2ddc0583bcec 803 tempArray[0]=(uint8_t)((((uint16_t)offset)>>8)&0x0F);
rosarium 0:2ddc0583bcec 804 tempArray[1]=(uint8_t)(offset);
rosarium 0:2ddc0583bcec 805
rosarium 0:2ddc0583bcec 806 /* Writes the FC_OFFSET registers */
rosarium 0:2ddc0583bcec 807 g_xStatus = SpiritSpiWriteRegisters(FC_OFFSET1_BASE, 2, tempArray);
rosarium 0:2ddc0583bcec 808
rosarium 0:2ddc0583bcec 809 }
rosarium 0:2ddc0583bcec 810
rosarium 0:2ddc0583bcec 811
rosarium 0:2ddc0583bcec 812 /**
rosarium 0:2ddc0583bcec 813 * @brief Returns the actual frequency offset.
rosarium 0:2ddc0583bcec 814 * @param None.
rosarium 0:2ddc0583bcec 815 * @retval int32_t Frequency offset expressed in Hz as signed word.
rosarium 0:2ddc0583bcec 816 */
rosarium 0:2ddc0583bcec 817 int32_t SpiritRadioGetFrequencyOffset(void)
rosarium 0:2ddc0583bcec 818 {
rosarium 0:2ddc0583bcec 819 uint8_t tempArray[2];
rosarium 0:2ddc0583bcec 820 int16_t xtalOffsetFactor;
rosarium 0:2ddc0583bcec 821
rosarium 0:2ddc0583bcec 822 /* Reads the FC_OFFSET registers */
rosarium 0:2ddc0583bcec 823 g_xStatus = SpiritSpiReadRegisters(FC_OFFSET1_BASE, 2, tempArray);
rosarium 0:2ddc0583bcec 824
rosarium 0:2ddc0583bcec 825 /* Calculates the Offset Factor */
rosarium 0:2ddc0583bcec 826 uint16_t xtalOffTemp = ((((uint16_t)tempArray[0])<<8)+((uint16_t)tempArray[1]));
rosarium 0:2ddc0583bcec 827
rosarium 0:2ddc0583bcec 828 if(xtalOffTemp & 0x0800)
rosarium 0:2ddc0583bcec 829 {
rosarium 0:2ddc0583bcec 830 xtalOffTemp = xtalOffTemp | 0xF000;
rosarium 0:2ddc0583bcec 831 }
rosarium 0:2ddc0583bcec 832 else
rosarium 0:2ddc0583bcec 833 {
rosarium 0:2ddc0583bcec 834 xtalOffTemp = xtalOffTemp & 0x0FFF;
rosarium 0:2ddc0583bcec 835 }
rosarium 0:2ddc0583bcec 836
rosarium 0:2ddc0583bcec 837 xtalOffsetFactor = *((int16_t*)(&xtalOffTemp));
rosarium 0:2ddc0583bcec 838
rosarium 0:2ddc0583bcec 839 /* Calculates the frequency offset and return it */
rosarium 0:2ddc0583bcec 840 return ((int32_t)(xtalOffsetFactor*s_lXtalFrequency)/FBASE_DIVIDER);
rosarium 0:2ddc0583bcec 841
rosarium 0:2ddc0583bcec 842 }
rosarium 0:2ddc0583bcec 843
rosarium 0:2ddc0583bcec 844
rosarium 0:2ddc0583bcec 845
rosarium 0:2ddc0583bcec 846 /**
rosarium 0:2ddc0583bcec 847 * @brief Sets the Synth word and the Band Select register according to desired base carrier frequency.
rosarium 0:2ddc0583bcec 848 * In this API the Xtal configuration is read out from
rosarium 0:2ddc0583bcec 849 * the corresponding register. The user shall fix it before call this API.
rosarium 0:2ddc0583bcec 850 * @param lFBase the base carrier frequency expressed in Hz as unsigned word.
rosarium 0:2ddc0583bcec 851 * @retval Error code: 0=no error, 1=error during calibration of VCO.
rosarium 0:2ddc0583bcec 852 */
rosarium 0:2ddc0583bcec 853 uint8_t SpiritRadioSetFrequencyBase(uint32_t lFBase)
rosarium 0:2ddc0583bcec 854 {
rosarium 0:2ddc0583bcec 855 uint32_t synthWord, Fc;
rosarium 0:2ddc0583bcec 856 uint8_t band, anaRadioRegArray[4], wcp;
rosarium 0:2ddc0583bcec 857
rosarium 0:2ddc0583bcec 858 /* Check the parameter */
rosarium 0:2ddc0583bcec 859 s_assert_param(IS_FREQUENCY_BAND(lFBase));
rosarium 0:2ddc0583bcec 860
rosarium 0:2ddc0583bcec 861 /* Search the operating band */
rosarium 0:2ddc0583bcec 862 if(IS_FREQUENCY_BAND_HIGH(lFBase))
rosarium 0:2ddc0583bcec 863 {
rosarium 0:2ddc0583bcec 864 band = HIGH_BAND;
rosarium 0:2ddc0583bcec 865 }
rosarium 0:2ddc0583bcec 866 else if(IS_FREQUENCY_BAND_MIDDLE(lFBase))
rosarium 0:2ddc0583bcec 867 {
rosarium 0:2ddc0583bcec 868 band = MIDDLE_BAND;
rosarium 0:2ddc0583bcec 869 }
rosarium 0:2ddc0583bcec 870 else if(IS_FREQUENCY_BAND_LOW(lFBase))
rosarium 0:2ddc0583bcec 871 {
rosarium 0:2ddc0583bcec 872 band = LOW_BAND;
rosarium 0:2ddc0583bcec 873 }
rosarium 0:2ddc0583bcec 874 else
rosarium 0:2ddc0583bcec 875 {
rosarium 0:2ddc0583bcec 876 band = VERY_LOW_BAND;
rosarium 0:2ddc0583bcec 877 }
rosarium 0:2ddc0583bcec 878
rosarium 0:2ddc0583bcec 879 int32_t FOffset = SpiritRadioGetFrequencyOffset();
rosarium 0:2ddc0583bcec 880 uint32_t lChannelSpace = SpiritRadioGetChannelSpace();
rosarium 0:2ddc0583bcec 881 uint8_t cChannelNum = SpiritRadioGetChannel();
rosarium 0:2ddc0583bcec 882
rosarium 0:2ddc0583bcec 883 /* Calculates the channel center frequency */
rosarium 0:2ddc0583bcec 884 Fc = lFBase + FOffset + lChannelSpace*cChannelNum;
rosarium 0:2ddc0583bcec 885
rosarium 0:2ddc0583bcec 886 /* Reads the reference divider */
rosarium 0:2ddc0583bcec 887 uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1;
rosarium 0:2ddc0583bcec 888
rosarium 0:2ddc0583bcec 889 /* Selects the VCO */
rosarium 0:2ddc0583bcec 890 switch(band)
rosarium 0:2ddc0583bcec 891 {
rosarium 0:2ddc0583bcec 892 case VERY_LOW_BAND:
rosarium 0:2ddc0583bcec 893 if(Fc<161281250)
rosarium 0:2ddc0583bcec 894 {
rosarium 0:2ddc0583bcec 895 SpiritCalibrationSelectVco(VCO_L);
rosarium 0:2ddc0583bcec 896 }
rosarium 0:2ddc0583bcec 897 else
rosarium 0:2ddc0583bcec 898 {
rosarium 0:2ddc0583bcec 899 SpiritCalibrationSelectVco(VCO_H);
rosarium 0:2ddc0583bcec 900 }
rosarium 0:2ddc0583bcec 901 break;
rosarium 0:2ddc0583bcec 902
rosarium 0:2ddc0583bcec 903 case LOW_BAND:
rosarium 0:2ddc0583bcec 904 if(Fc<322562500)
rosarium 0:2ddc0583bcec 905 {
rosarium 0:2ddc0583bcec 906 SpiritCalibrationSelectVco(VCO_L);
rosarium 0:2ddc0583bcec 907 }
rosarium 0:2ddc0583bcec 908 else
rosarium 0:2ddc0583bcec 909 {
rosarium 0:2ddc0583bcec 910 SpiritCalibrationSelectVco(VCO_H);
rosarium 0:2ddc0583bcec 911 }
rosarium 0:2ddc0583bcec 912 break;
rosarium 0:2ddc0583bcec 913
rosarium 0:2ddc0583bcec 914 case MIDDLE_BAND:
rosarium 0:2ddc0583bcec 915 if(Fc<430083334)
rosarium 0:2ddc0583bcec 916 {
rosarium 0:2ddc0583bcec 917 SpiritCalibrationSelectVco(VCO_L);
rosarium 0:2ddc0583bcec 918 }
rosarium 0:2ddc0583bcec 919 else
rosarium 0:2ddc0583bcec 920 {
rosarium 0:2ddc0583bcec 921 SpiritCalibrationSelectVco(VCO_H);
rosarium 0:2ddc0583bcec 922 }
rosarium 0:2ddc0583bcec 923 break;
rosarium 0:2ddc0583bcec 924
rosarium 0:2ddc0583bcec 925 case HIGH_BAND:
rosarium 0:2ddc0583bcec 926 if(Fc<860166667)
rosarium 0:2ddc0583bcec 927 {
rosarium 0:2ddc0583bcec 928 SpiritCalibrationSelectVco(VCO_L);
rosarium 0:2ddc0583bcec 929 }
rosarium 0:2ddc0583bcec 930 else
rosarium 0:2ddc0583bcec 931 {
rosarium 0:2ddc0583bcec 932 SpiritCalibrationSelectVco(VCO_H);
rosarium 0:2ddc0583bcec 933 }
rosarium 0:2ddc0583bcec 934 }
rosarium 0:2ddc0583bcec 935
rosarium 0:2ddc0583bcec 936 /* Search the VCO charge pump word and set the corresponding register */
rosarium 0:2ddc0583bcec 937 wcp = SpiritRadioSearchWCP(Fc);
rosarium 0:2ddc0583bcec 938
rosarium 0:2ddc0583bcec 939 synthWord = (uint32_t)(lFBase*s_vectcBHalfFactor[band]*(((double)(FBASE_DIVIDER*cRefDiv))/s_lXtalFrequency));
rosarium 0:2ddc0583bcec 940
rosarium 0:2ddc0583bcec 941 /* Build the array of registers values for the analog part */
rosarium 0:2ddc0583bcec 942 anaRadioRegArray[0] = (uint8_t)(((synthWord>>21)&(0x0000001F))|(wcp<<5));
rosarium 0:2ddc0583bcec 943 anaRadioRegArray[1] = (uint8_t)((synthWord>>13)&(0x000000FF));
rosarium 0:2ddc0583bcec 944 anaRadioRegArray[2] = (uint8_t)((synthWord>>5)&(0x000000FF));
rosarium 0:2ddc0583bcec 945 anaRadioRegArray[3] = (uint8_t)(((synthWord&0x0000001F)<<3)| s_vectcBandRegValue[band]);
rosarium 0:2ddc0583bcec 946
rosarium 0:2ddc0583bcec 947 /* Configures the needed Analog Radio registers */
rosarium 0:2ddc0583bcec 948 g_xStatus = SpiritSpiWriteRegisters(SYNT3_BASE, 4, anaRadioRegArray);
rosarium 0:2ddc0583bcec 949
rosarium 0:2ddc0583bcec 950 if(xDoVcoCalibrationWA==S_ENABLE)
rosarium 0:2ddc0583bcec 951 return SpiritManagementWaVcoCalibration();
rosarium 0:2ddc0583bcec 952
rosarium 0:2ddc0583bcec 953 return 0;
rosarium 0:2ddc0583bcec 954 }
rosarium 0:2ddc0583bcec 955
rosarium 0:2ddc0583bcec 956 /**
rosarium 0:2ddc0583bcec 957 * @brief To say to the set frequency base if do or not the VCO calibration WA.
rosarium 0:2ddc0583bcec 958 * @param S_ENABLE or S_DISABLE the WA procedure.
rosarium 0:2ddc0583bcec 959 * @retval None.
rosarium 0:2ddc0583bcec 960 */
rosarium 0:2ddc0583bcec 961 void SpiritRadioVcoCalibrationWAFB(SpiritFunctionalState xNewstate)
rosarium 0:2ddc0583bcec 962 {
rosarium 0:2ddc0583bcec 963 xDoVcoCalibrationWA=xNewstate;
rosarium 0:2ddc0583bcec 964 }
rosarium 0:2ddc0583bcec 965
rosarium 0:2ddc0583bcec 966 /**
rosarium 0:2ddc0583bcec 967 * @brief Returns the base carrier frequency.
rosarium 0:2ddc0583bcec 968 * @param None.
rosarium 0:2ddc0583bcec 969 * @retval uint32_t Base carrier frequency expressed in Hz as unsigned word.
rosarium 0:2ddc0583bcec 970 */
rosarium 0:2ddc0583bcec 971 uint32_t SpiritRadioGetFrequencyBase(void)
rosarium 0:2ddc0583bcec 972 {
rosarium 0:2ddc0583bcec 973 uint32_t synthWord;
rosarium 0:2ddc0583bcec 974 BandSelect band;
rosarium 0:2ddc0583bcec 975
rosarium 0:2ddc0583bcec 976 /* Reads the synth word */
rosarium 0:2ddc0583bcec 977 synthWord = SpiritRadioGetSynthWord();
rosarium 0:2ddc0583bcec 978
rosarium 0:2ddc0583bcec 979 /* Reads the operating band */
rosarium 0:2ddc0583bcec 980 band = SpiritRadioGetBand();
rosarium 0:2ddc0583bcec 981
rosarium 0:2ddc0583bcec 982 uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv() + 1;
rosarium 0:2ddc0583bcec 983
rosarium 0:2ddc0583bcec 984 /* Calculates the frequency base and return it */
rosarium 0:2ddc0583bcec 985 return (uint32_t)round(synthWord*(((double)s_lXtalFrequency)/(FBASE_DIVIDER*cRefDiv*s_vectcBHalfFactor[band])));
rosarium 0:2ddc0583bcec 986 }
rosarium 0:2ddc0583bcec 987
rosarium 0:2ddc0583bcec 988
rosarium 0:2ddc0583bcec 989 /**
rosarium 0:2ddc0583bcec 990 * @brief Returns the actual channel center frequency.
rosarium 0:2ddc0583bcec 991 * @param None.
rosarium 0:2ddc0583bcec 992 * @retval uint32_t Actual channel center frequency expressed in Hz.
rosarium 0:2ddc0583bcec 993 */
rosarium 0:2ddc0583bcec 994 uint32_t SpiritRadioGetCenterFrequency(void)
rosarium 0:2ddc0583bcec 995 {
rosarium 0:2ddc0583bcec 996 int32_t offset;
rosarium 0:2ddc0583bcec 997 uint8_t channel;
rosarium 0:2ddc0583bcec 998 uint32_t fBase;
rosarium 0:2ddc0583bcec 999 uint32_t channelSpace;
rosarium 0:2ddc0583bcec 1000
rosarium 0:2ddc0583bcec 1001 /* Reads the frequency base */
rosarium 0:2ddc0583bcec 1002 fBase = SpiritRadioGetFrequencyBase();
rosarium 0:2ddc0583bcec 1003
rosarium 0:2ddc0583bcec 1004 /* Reads the frequency offset */
rosarium 0:2ddc0583bcec 1005 offset = SpiritRadioGetFrequencyOffset();
rosarium 0:2ddc0583bcec 1006
rosarium 0:2ddc0583bcec 1007 /* Reads the channel space */
rosarium 0:2ddc0583bcec 1008 channelSpace = SpiritRadioGetChannelSpace();
rosarium 0:2ddc0583bcec 1009
rosarium 0:2ddc0583bcec 1010 /* Reads the channel number */
rosarium 0:2ddc0583bcec 1011 channel = SpiritRadioGetChannel();
rosarium 0:2ddc0583bcec 1012
rosarium 0:2ddc0583bcec 1013 /* Calculates the channel center frequency and return it */
rosarium 0:2ddc0583bcec 1014 return (uint32_t)(fBase + offset + (uint32_t)(channelSpace*channel));
rosarium 0:2ddc0583bcec 1015
rosarium 0:2ddc0583bcec 1016 }
rosarium 0:2ddc0583bcec 1017
rosarium 0:2ddc0583bcec 1018
rosarium 0:2ddc0583bcec 1019 /**
rosarium 0:2ddc0583bcec 1020 * @brief Returns the mantissa and exponent, whose value used in the datarate formula
rosarium 0:2ddc0583bcec 1021 * will give the datarate value closer to the given datarate.
rosarium 0:2ddc0583bcec 1022 * @param fDatarate datarate expressed in bps. This parameter ranging between 100 and 500000.
rosarium 0:2ddc0583bcec 1023 * @param pcM pointer to the returned mantissa value.
rosarium 0:2ddc0583bcec 1024 * @param pcE pointer to the returned exponent value.
rosarium 0:2ddc0583bcec 1025 * @retval None.
rosarium 0:2ddc0583bcec 1026 */
rosarium 0:2ddc0583bcec 1027 void SpiritRadioSearchDatarateME(uint32_t lDatarate, uint8_t* pcM, uint8_t* pcE)
rosarium 0:2ddc0583bcec 1028 {
rosarium 0:2ddc0583bcec 1029 volatile SpiritBool find = S_FALSE;
rosarium 0:2ddc0583bcec 1030 int8_t i=15;
rosarium 0:2ddc0583bcec 1031 uint8_t cMantissaTmp;
rosarium 0:2ddc0583bcec 1032 uint8_t cDivider = 0;
rosarium 0:2ddc0583bcec 1033
rosarium 0:2ddc0583bcec 1034 /* Check the parameters */
rosarium 0:2ddc0583bcec 1035 s_assert_param(IS_DATARATE(lDatarate));
rosarium 0:2ddc0583bcec 1036
rosarium 0:2ddc0583bcec 1037 cDivider = (uint8_t)SpiritRadioGetDigDiv();
rosarium 0:2ddc0583bcec 1038
rosarium 0:2ddc0583bcec 1039 /* Search in the datarate array the exponent value */
rosarium 0:2ddc0583bcec 1040 while(!find && i>=0)
rosarium 0:2ddc0583bcec 1041 {
rosarium 0:2ddc0583bcec 1042 if(lDatarate>=(s_lXtalFrequency>>(20-i+cDivider)))
rosarium 0:2ddc0583bcec 1043 {
rosarium 0:2ddc0583bcec 1044 find = S_TRUE;
rosarium 0:2ddc0583bcec 1045 }
rosarium 0:2ddc0583bcec 1046 else
rosarium 0:2ddc0583bcec 1047 {
rosarium 0:2ddc0583bcec 1048 i--;
rosarium 0:2ddc0583bcec 1049 }
rosarium 0:2ddc0583bcec 1050 }
rosarium 0:2ddc0583bcec 1051 i<0 ? i=0 : i;
rosarium 0:2ddc0583bcec 1052 *pcE = i;
rosarium 0:2ddc0583bcec 1053
rosarium 0:2ddc0583bcec 1054 /* Calculates the mantissa value according to the datarate formula */
rosarium 0:2ddc0583bcec 1055 cMantissaTmp = (lDatarate*((uint32_t)1<<(23-i)))/(s_lXtalFrequency>>(5+cDivider))-256;
rosarium 0:2ddc0583bcec 1056
rosarium 0:2ddc0583bcec 1057 /* Finds the mantissa value with less approximation */
rosarium 0:2ddc0583bcec 1058 int16_t mantissaCalculation[3];
rosarium 0:2ddc0583bcec 1059 for(uint8_t j=0;j<3;j++)
rosarium 0:2ddc0583bcec 1060 {
rosarium 0:2ddc0583bcec 1061 if((cMantissaTmp+j-1))
rosarium 0:2ddc0583bcec 1062 {
rosarium 0:2ddc0583bcec 1063 mantissaCalculation[j]=lDatarate-(((256+cMantissaTmp+j-1)*(s_lXtalFrequency>>(5+cDivider)))>>(23-i));
rosarium 0:2ddc0583bcec 1064 }
rosarium 0:2ddc0583bcec 1065 else
rosarium 0:2ddc0583bcec 1066 {
rosarium 0:2ddc0583bcec 1067 mantissaCalculation[j]=0x7FFF;
rosarium 0:2ddc0583bcec 1068 }
rosarium 0:2ddc0583bcec 1069 }
rosarium 0:2ddc0583bcec 1070 uint16_t mantissaCalculationDelta = 0xFFFF;
rosarium 0:2ddc0583bcec 1071 for(uint8_t j=0;j<3;j++)
rosarium 0:2ddc0583bcec 1072 {
rosarium 0:2ddc0583bcec 1073 if(S_ABS(mantissaCalculation[j])<mantissaCalculationDelta)
rosarium 0:2ddc0583bcec 1074 {
rosarium 0:2ddc0583bcec 1075 mantissaCalculationDelta = S_ABS(mantissaCalculation[j]);
rosarium 0:2ddc0583bcec 1076 *pcM = cMantissaTmp+j-1;
rosarium 0:2ddc0583bcec 1077 }
rosarium 0:2ddc0583bcec 1078 }
rosarium 0:2ddc0583bcec 1079
rosarium 0:2ddc0583bcec 1080 }
rosarium 0:2ddc0583bcec 1081
rosarium 0:2ddc0583bcec 1082
rosarium 0:2ddc0583bcec 1083 /**
rosarium 0:2ddc0583bcec 1084 * @brief Returns the mantissa and exponent for a given bandwidth.
rosarium 0:2ddc0583bcec 1085 * Even if it is possible to pass as parameter any value in the below mentioned range,
rosarium 0:2ddc0583bcec 1086 * the API will search the closer value according to a fixed table of channel
rosarium 0:2ddc0583bcec 1087 * bandwidth values (@ref s_vectnBandwidth), as defined in the datasheet, returning the corresponding mantissa
rosarium 0:2ddc0583bcec 1088 * and exponent value.
rosarium 0:2ddc0583bcec 1089 * @param lBandwidth bandwidth expressed in Hz. This parameter ranging between 1100 and 800100.
rosarium 0:2ddc0583bcec 1090 * @param pcM pointer to the returned mantissa value.
rosarium 0:2ddc0583bcec 1091 * @param pcE pointer to the returned exponent value.
rosarium 0:2ddc0583bcec 1092 * @retval None.
rosarium 0:2ddc0583bcec 1093 */
rosarium 0:2ddc0583bcec 1094 void SpiritRadioSearchChannelBwME(uint32_t lBandwidth, uint8_t* pcM, uint8_t* pcE)
rosarium 0:2ddc0583bcec 1095 {
rosarium 0:2ddc0583bcec 1096 int8_t i, i_tmp;
rosarium 0:2ddc0583bcec 1097 uint8_t cDivider = 1;
rosarium 0:2ddc0583bcec 1098
rosarium 0:2ddc0583bcec 1099 /* Search in the channel filter bandwidth table the exponent value */
rosarium 0:2ddc0583bcec 1100 if(SpiritRadioGetDigDiv())
rosarium 0:2ddc0583bcec 1101 {
rosarium 0:2ddc0583bcec 1102 cDivider = 2;
rosarium 0:2ddc0583bcec 1103 }
rosarium 0:2ddc0583bcec 1104 else
rosarium 0:2ddc0583bcec 1105 {
rosarium 0:2ddc0583bcec 1106 cDivider = 1;
rosarium 0:2ddc0583bcec 1107 }
rosarium 0:2ddc0583bcec 1108
rosarium 0:2ddc0583bcec 1109 s_assert_param(IS_CH_BW(lBandwidth,s_lXtalFrequency/cDivider));
rosarium 0:2ddc0583bcec 1110
rosarium 0:2ddc0583bcec 1111 uint32_t lChfltFactor = (s_lXtalFrequency/cDivider)/100;
rosarium 0:2ddc0583bcec 1112
rosarium 0:2ddc0583bcec 1113 for(i=0;i<90 && (lBandwidth<(uint32_t)((s_vectnBandwidth26M[i]*lChfltFactor)/2600));i++);
rosarium 0:2ddc0583bcec 1114
rosarium 0:2ddc0583bcec 1115 if(i!=0)
rosarium 0:2ddc0583bcec 1116 {
rosarium 0:2ddc0583bcec 1117 /* Finds the mantissa value with less approximation */
rosarium 0:2ddc0583bcec 1118 i_tmp=i;
rosarium 0:2ddc0583bcec 1119 int16_t chfltCalculation[3];
rosarium 0:2ddc0583bcec 1120 for(uint8_t j=0;j<3;j++)
rosarium 0:2ddc0583bcec 1121 {
rosarium 0:2ddc0583bcec 1122 if(((i_tmp+j-1)>=0) || ((i_tmp+j-1)<=89))
rosarium 0:2ddc0583bcec 1123 {
rosarium 0:2ddc0583bcec 1124 chfltCalculation[j] = lBandwidth - (uint32_t)((s_vectnBandwidth26M[i_tmp+j-1]*lChfltFactor)/2600);
rosarium 0:2ddc0583bcec 1125 }
rosarium 0:2ddc0583bcec 1126 else
rosarium 0:2ddc0583bcec 1127 {
rosarium 0:2ddc0583bcec 1128 chfltCalculation[j] = 0x7FFF;
rosarium 0:2ddc0583bcec 1129 }
rosarium 0:2ddc0583bcec 1130 }
rosarium 0:2ddc0583bcec 1131 uint16_t chfltDelta = 0xFFFF;
rosarium 0:2ddc0583bcec 1132
rosarium 0:2ddc0583bcec 1133 for(uint8_t j=0;j<3;j++)
rosarium 0:2ddc0583bcec 1134 {
rosarium 0:2ddc0583bcec 1135 if(S_ABS(chfltCalculation[j])<chfltDelta)
rosarium 0:2ddc0583bcec 1136 {
rosarium 0:2ddc0583bcec 1137 chfltDelta = S_ABS(chfltCalculation[j]);
rosarium 0:2ddc0583bcec 1138 i=i_tmp+j-1;
rosarium 0:2ddc0583bcec 1139 }
rosarium 0:2ddc0583bcec 1140 }
rosarium 0:2ddc0583bcec 1141 }
rosarium 0:2ddc0583bcec 1142 (*pcE) = (uint8_t)(i/9);
rosarium 0:2ddc0583bcec 1143 (*pcM) = (uint8_t)(i%9);
rosarium 0:2ddc0583bcec 1144
rosarium 0:2ddc0583bcec 1145 }
rosarium 0:2ddc0583bcec 1146
rosarium 0:2ddc0583bcec 1147 /**
rosarium 0:2ddc0583bcec 1148 * @brief Returns the mantissa and exponent, whose value used in the frequency deviation formula
rosarium 0:2ddc0583bcec 1149 * will give a frequency deviation value most closer to the given frequency deviation.
rosarium 0:2ddc0583bcec 1150 * @param fFDev frequency deviation expressed in Hz. This parameter can be a value in the range [F_Xo*8/2^18, F_Xo*7680/2^18].
rosarium 0:2ddc0583bcec 1151 * @param pcM pointer to the returned mantissa value.
rosarium 0:2ddc0583bcec 1152 * @param pcE pointer to the returned exponent value.
rosarium 0:2ddc0583bcec 1153 * @retval None.
rosarium 0:2ddc0583bcec 1154 */
rosarium 0:2ddc0583bcec 1155 void SpiritRadioSearchFreqDevME(uint32_t lFDev, uint8_t* pcM, uint8_t* pcE)
rosarium 0:2ddc0583bcec 1156 {
rosarium 0:2ddc0583bcec 1157 uint8_t i;
rosarium 0:2ddc0583bcec 1158 uint32_t a,bp,b=0;
rosarium 0:2ddc0583bcec 1159 float xtalDivtmp=(float)s_lXtalFrequency/(((uint32_t)1)<<18);
rosarium 0:2ddc0583bcec 1160
rosarium 0:2ddc0583bcec 1161 /* Check the parameters */
rosarium 0:2ddc0583bcec 1162 s_assert_param(IS_F_DEV(lFDev,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 1163
rosarium 0:2ddc0583bcec 1164 for(i=0;i<10;i++)
rosarium 0:2ddc0583bcec 1165 {
rosarium 0:2ddc0583bcec 1166 a=(uint32_t)(xtalDivtmp*(uint32_t)(7.5*(1<<i)));
rosarium 0:2ddc0583bcec 1167 if(lFDev<a)
rosarium 0:2ddc0583bcec 1168 break;
rosarium 0:2ddc0583bcec 1169 }
rosarium 0:2ddc0583bcec 1170 (*pcE) = i;
rosarium 0:2ddc0583bcec 1171
rosarium 0:2ddc0583bcec 1172 for(i=0;i<8;i++)
rosarium 0:2ddc0583bcec 1173 {
rosarium 0:2ddc0583bcec 1174 bp=b;
rosarium 0:2ddc0583bcec 1175 b=(uint32_t)(xtalDivtmp*(uint32_t)((8.0+i)/2*(1<<(*pcE))));
rosarium 0:2ddc0583bcec 1176 if(lFDev<b)
rosarium 0:2ddc0583bcec 1177 break;
rosarium 0:2ddc0583bcec 1178 }
rosarium 0:2ddc0583bcec 1179
rosarium 0:2ddc0583bcec 1180 (*pcM)=i;
rosarium 0:2ddc0583bcec 1181 if((lFDev-bp)<(b-lFDev))
rosarium 0:2ddc0583bcec 1182 (*pcM)--;
rosarium 0:2ddc0583bcec 1183
rosarium 0:2ddc0583bcec 1184 }
rosarium 0:2ddc0583bcec 1185
rosarium 0:2ddc0583bcec 1186
rosarium 0:2ddc0583bcec 1187 /**
rosarium 0:2ddc0583bcec 1188 * @brief Sets the datarate.
rosarium 0:2ddc0583bcec 1189 * @param fDatarate datarate expressed in bps. This value shall be in the range
rosarium 0:2ddc0583bcec 1190 * [100 500000].
rosarium 0:2ddc0583bcec 1191 * @retval None.
rosarium 0:2ddc0583bcec 1192 */
rosarium 0:2ddc0583bcec 1193 void SpiritRadioSetDatarate(uint32_t lDatarate)
rosarium 0:2ddc0583bcec 1194 {
rosarium 0:2ddc0583bcec 1195 uint8_t drE, tempRegValue[2];
rosarium 0:2ddc0583bcec 1196
rosarium 0:2ddc0583bcec 1197 /* Check the parameters */
rosarium 0:2ddc0583bcec 1198 s_assert_param(IS_DATARATE(lDatarate));
rosarium 0:2ddc0583bcec 1199
rosarium 0:2ddc0583bcec 1200 /* Calculates the datarate mantissa and exponent */
rosarium 0:2ddc0583bcec 1201 SpiritRadioSearchDatarateME(lDatarate, &tempRegValue[0], &drE);
rosarium 0:2ddc0583bcec 1202
rosarium 0:2ddc0583bcec 1203 /* Reads the MOD_O register*/
rosarium 0:2ddc0583bcec 1204 SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue[1]);
rosarium 0:2ddc0583bcec 1205
rosarium 0:2ddc0583bcec 1206 /* Mask the other fields and set the datarate exponent */
rosarium 0:2ddc0583bcec 1207 tempRegValue[1] &= 0xF0;
rosarium 0:2ddc0583bcec 1208 tempRegValue[1] |= drE;
rosarium 0:2ddc0583bcec 1209
rosarium 0:2ddc0583bcec 1210 /* Writes the Datarate registers */
rosarium 0:2ddc0583bcec 1211 g_xStatus = SpiritSpiWriteRegisters(MOD1_BASE, 2, tempRegValue);
rosarium 0:2ddc0583bcec 1212
rosarium 0:2ddc0583bcec 1213 }
rosarium 0:2ddc0583bcec 1214
rosarium 0:2ddc0583bcec 1215
rosarium 0:2ddc0583bcec 1216 /**
rosarium 0:2ddc0583bcec 1217 * @brief Returns the datarate.
rosarium 0:2ddc0583bcec 1218 * @param None.
rosarium 0:2ddc0583bcec 1219 * @retval uint32_t Settled datarate expressed in bps.
rosarium 0:2ddc0583bcec 1220 */
rosarium 0:2ddc0583bcec 1221 uint32_t SpiritRadioGetDatarate(void)
rosarium 0:2ddc0583bcec 1222 {
rosarium 0:2ddc0583bcec 1223 uint8_t tempRegValue[2];
rosarium 0:2ddc0583bcec 1224 uint8_t cDivider=0;
rosarium 0:2ddc0583bcec 1225
rosarium 0:2ddc0583bcec 1226 /* Reads the datarate registers for mantissa and exponent */
rosarium 0:2ddc0583bcec 1227 g_xStatus = SpiritSpiReadRegisters(MOD1_BASE, 2, tempRegValue);
rosarium 0:2ddc0583bcec 1228
rosarium 0:2ddc0583bcec 1229 /* Calculates the datarate */
rosarium 0:2ddc0583bcec 1230 cDivider = (uint8_t)SpiritRadioGetDigDiv();
rosarium 0:2ddc0583bcec 1231
rosarium 0:2ddc0583bcec 1232 return (((s_lXtalFrequency>>(5+cDivider))*(256+tempRegValue[0]))>>(23-(tempRegValue[1]&0x0F)));
rosarium 0:2ddc0583bcec 1233 }
rosarium 0:2ddc0583bcec 1234
rosarium 0:2ddc0583bcec 1235
rosarium 0:2ddc0583bcec 1236 /**
rosarium 0:2ddc0583bcec 1237 * @brief Sets the frequency deviation.
rosarium 0:2ddc0583bcec 1238 * @param fFDev frequency deviation expressed in Hz. Be sure that this value
rosarium 0:2ddc0583bcec 1239 * is in the correct range [F_Xo*8/2^18, F_Xo*7680/2^18] Hz.
rosarium 0:2ddc0583bcec 1240 * @retval None.
rosarium 0:2ddc0583bcec 1241 */
rosarium 0:2ddc0583bcec 1242 void SpiritRadioSetFrequencyDev(uint32_t lFDev)
rosarium 0:2ddc0583bcec 1243 {
rosarium 0:2ddc0583bcec 1244 uint8_t FDevM, FDevE, tempRegValue;
rosarium 0:2ddc0583bcec 1245
rosarium 0:2ddc0583bcec 1246 /* Check the parameters */
rosarium 0:2ddc0583bcec 1247 s_assert_param(IS_F_DEV(lFDev, s_lXtalFrequency));
rosarium 0:2ddc0583bcec 1248
rosarium 0:2ddc0583bcec 1249 /* Calculates the frequency deviation mantissa and exponent */
rosarium 0:2ddc0583bcec 1250 SpiritRadioSearchFreqDevME(lFDev, &FDevM, &FDevE);
rosarium 0:2ddc0583bcec 1251
rosarium 0:2ddc0583bcec 1252 /* Reads the FDEV0 register */
rosarium 0:2ddc0583bcec 1253 SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1254
rosarium 0:2ddc0583bcec 1255 /* Mask the other fields and set the frequency deviation mantissa and exponent */
rosarium 0:2ddc0583bcec 1256 tempRegValue &= 0x08;
rosarium 0:2ddc0583bcec 1257 tempRegValue |= ((FDevE<<4)|(FDevM));
rosarium 0:2ddc0583bcec 1258
rosarium 0:2ddc0583bcec 1259 /* Writes the Frequency deviation register */
rosarium 0:2ddc0583bcec 1260 g_xStatus = SpiritSpiWriteRegisters(FDEV0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1261
rosarium 0:2ddc0583bcec 1262 }
rosarium 0:2ddc0583bcec 1263
rosarium 0:2ddc0583bcec 1264
rosarium 0:2ddc0583bcec 1265 /**
rosarium 0:2ddc0583bcec 1266 * @brief Returns the frequency deviation.
rosarium 0:2ddc0583bcec 1267 * @param None.
rosarium 0:2ddc0583bcec 1268 * @retval uint32_t Frequency deviation value expressed in Hz.
rosarium 0:2ddc0583bcec 1269 * This value will be in the range [F_Xo*8/2^18, F_Xo*7680/2^18] Hz.
rosarium 0:2ddc0583bcec 1270 */
rosarium 0:2ddc0583bcec 1271 uint32_t SpiritRadioGetFrequencyDev(void)
rosarium 0:2ddc0583bcec 1272 {
rosarium 0:2ddc0583bcec 1273 uint8_t tempRegValue, FDevM, FDevE;
rosarium 0:2ddc0583bcec 1274
rosarium 0:2ddc0583bcec 1275
rosarium 0:2ddc0583bcec 1276 /* Reads the frequency deviation register for mantissa and exponent */
rosarium 0:2ddc0583bcec 1277 g_xStatus = SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1278 FDevM = tempRegValue&0x07;
rosarium 0:2ddc0583bcec 1279 FDevE = (tempRegValue&0xF0)>>4;
rosarium 0:2ddc0583bcec 1280
rosarium 0:2ddc0583bcec 1281 /* Calculates the frequency deviation and return it */
rosarium 0:2ddc0583bcec 1282 //return (((s_lXtalFrequency>>6)*(8+FDevM))>>(13-FDevE));
rosarium 0:2ddc0583bcec 1283
rosarium 0:2ddc0583bcec 1284 return (uint32_t)((float)s_lXtalFrequency/(((uint32_t)1)<<18)*(uint32_t)((8.0+FDevM)/2*(1<<FDevE)));
rosarium 0:2ddc0583bcec 1285
rosarium 0:2ddc0583bcec 1286 }
rosarium 0:2ddc0583bcec 1287
rosarium 0:2ddc0583bcec 1288
rosarium 0:2ddc0583bcec 1289 /**
rosarium 0:2ddc0583bcec 1290 * @brief Sets the channel filter bandwidth.
rosarium 0:2ddc0583bcec 1291 * @param lBandwidth channel filter bandwidth expressed in Hz. This parameter shall be in the range [1100 800100]
rosarium 0:2ddc0583bcec 1292 * Even if it is possible to pass as parameter any value in the above mentioned range,
rosarium 0:2ddc0583bcec 1293 * the API will search the most closer value according to a fixed table of channel
rosarium 0:2ddc0583bcec 1294 * bandwidth values (@ref s_vectnBandwidth), as defined in the datasheet. To verify the settled channel bandwidth
rosarium 0:2ddc0583bcec 1295 * it is possible to use the SpiritRadioGetChannelBW() API.
rosarium 0:2ddc0583bcec 1296 * @retval None.
rosarium 0:2ddc0583bcec 1297 */
rosarium 0:2ddc0583bcec 1298 void SpiritRadioSetChannelBW(uint32_t lBandwidth)
rosarium 0:2ddc0583bcec 1299 {
rosarium 0:2ddc0583bcec 1300 uint8_t bwM, bwE, tempRegValue;
rosarium 0:2ddc0583bcec 1301
rosarium 0:2ddc0583bcec 1302 /* Search in the channel filter bandwidth table the exponent value */
rosarium 0:2ddc0583bcec 1303 if(SpiritRadioGetDigDiv())
rosarium 0:2ddc0583bcec 1304 {
rosarium 0:2ddc0583bcec 1305 s_assert_param(IS_CH_BW(lBandwidth,(s_lXtalFrequency/2)));
rosarium 0:2ddc0583bcec 1306 }
rosarium 0:2ddc0583bcec 1307 else
rosarium 0:2ddc0583bcec 1308 {
rosarium 0:2ddc0583bcec 1309 s_assert_param(IS_CH_BW(lBandwidth,(s_lXtalFrequency)));
rosarium 0:2ddc0583bcec 1310 }
rosarium 0:2ddc0583bcec 1311
rosarium 0:2ddc0583bcec 1312 /* Calculates the channel bandwidth mantissa and exponent */
rosarium 0:2ddc0583bcec 1313 SpiritRadioSearchChannelBwME(lBandwidth, &bwM, &bwE);
rosarium 0:2ddc0583bcec 1314 tempRegValue = (bwM<<4)|(bwE);
rosarium 0:2ddc0583bcec 1315
rosarium 0:2ddc0583bcec 1316 /* Writes the Channel filter register */
rosarium 0:2ddc0583bcec 1317 g_xStatus = SpiritSpiWriteRegisters(CHFLT_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1318
rosarium 0:2ddc0583bcec 1319 }
rosarium 0:2ddc0583bcec 1320
rosarium 0:2ddc0583bcec 1321 /**
rosarium 0:2ddc0583bcec 1322 * @brief Returns the channel filter bandwidth.
rosarium 0:2ddc0583bcec 1323 * @param None.
rosarium 0:2ddc0583bcec 1324 * @retval uint32_t Channel filter bandwidth expressed in Hz.
rosarium 0:2ddc0583bcec 1325 */
rosarium 0:2ddc0583bcec 1326 uint32_t SpiritRadioGetChannelBW(void)
rosarium 0:2ddc0583bcec 1327 {
rosarium 0:2ddc0583bcec 1328 uint8_t tempRegValue, bwM, bwE;
rosarium 0:2ddc0583bcec 1329
rosarium 0:2ddc0583bcec 1330 /* Reads the channel filter register for mantissa and exponent */
rosarium 0:2ddc0583bcec 1331 g_xStatus = SpiritSpiReadRegisters(CHFLT_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1332 bwM = (tempRegValue&0xF0)>>4;
rosarium 0:2ddc0583bcec 1333 bwE = tempRegValue&0x0F;
rosarium 0:2ddc0583bcec 1334
rosarium 0:2ddc0583bcec 1335 /* Reads the channel filter bandwidth from the look-up table and return it */
rosarium 0:2ddc0583bcec 1336 return (uint32_t)(100.0*s_vectnBandwidth26M[bwM+(bwE*9)]*s_lXtalFrequency/26e6);
rosarium 0:2ddc0583bcec 1337
rosarium 0:2ddc0583bcec 1338 }
rosarium 0:2ddc0583bcec 1339
rosarium 0:2ddc0583bcec 1340
rosarium 0:2ddc0583bcec 1341 /**
rosarium 0:2ddc0583bcec 1342 * @brief Sets the modulation type.
rosarium 0:2ddc0583bcec 1343 * @param xModulation modulation to set.
rosarium 0:2ddc0583bcec 1344 * This parameter shall be of type @ref ModulationSelect .
rosarium 0:2ddc0583bcec 1345 * @retval None.
rosarium 0:2ddc0583bcec 1346 */
rosarium 0:2ddc0583bcec 1347 void SpiritRadioSetModulation(ModulationSelect xModulation)
rosarium 0:2ddc0583bcec 1348 {
rosarium 0:2ddc0583bcec 1349 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1350
rosarium 0:2ddc0583bcec 1351 /* Check the parameters */
rosarium 0:2ddc0583bcec 1352 s_assert_param(IS_MODULATION_SELECTED(xModulation));
rosarium 0:2ddc0583bcec 1353
rosarium 0:2ddc0583bcec 1354 /* Reads the modulation register */
rosarium 0:2ddc0583bcec 1355 SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1356
rosarium 0:2ddc0583bcec 1357 /* Mask the other fields and set the modulation type */
rosarium 0:2ddc0583bcec 1358 tempRegValue &=0x8F;
rosarium 0:2ddc0583bcec 1359 tempRegValue |= xModulation;
rosarium 0:2ddc0583bcec 1360
rosarium 0:2ddc0583bcec 1361 /* Writes the modulation register */
rosarium 0:2ddc0583bcec 1362 g_xStatus = SpiritSpiWriteRegisters(MOD0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1363
rosarium 0:2ddc0583bcec 1364 }
rosarium 0:2ddc0583bcec 1365
rosarium 0:2ddc0583bcec 1366
rosarium 0:2ddc0583bcec 1367 /**
rosarium 0:2ddc0583bcec 1368 * @brief Returns the modulation type used.
rosarium 0:2ddc0583bcec 1369 * @param None.
rosarium 0:2ddc0583bcec 1370 * @retval ModulationSelect Settled modulation type.
rosarium 0:2ddc0583bcec 1371 */
rosarium 0:2ddc0583bcec 1372 ModulationSelect SpiritRadioGetModulation(void)
rosarium 0:2ddc0583bcec 1373 {
rosarium 0:2ddc0583bcec 1374 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1375
rosarium 0:2ddc0583bcec 1376 /* Reads the modulation register MOD0*/
rosarium 0:2ddc0583bcec 1377 g_xStatus = SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1378
rosarium 0:2ddc0583bcec 1379 /* Return the modulation type */
rosarium 0:2ddc0583bcec 1380 return (ModulationSelect)(tempRegValue&0x70);
rosarium 0:2ddc0583bcec 1381
rosarium 0:2ddc0583bcec 1382 }
rosarium 0:2ddc0583bcec 1383
rosarium 0:2ddc0583bcec 1384
rosarium 0:2ddc0583bcec 1385 /**
rosarium 0:2ddc0583bcec 1386 * @brief Enables or Disables the Continuous Wave transmit mode.
rosarium 0:2ddc0583bcec 1387 * @param xNewState new state for power ramping.
rosarium 0:2ddc0583bcec 1388 * This parameter can be: S_ENABLE or S_DISABLE .
rosarium 0:2ddc0583bcec 1389 * @retval None.
rosarium 0:2ddc0583bcec 1390 */
rosarium 0:2ddc0583bcec 1391 void SpiritRadioCWTransmitMode(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 1392 {
rosarium 0:2ddc0583bcec 1393 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1394
rosarium 0:2ddc0583bcec 1395 /* Check the parameters */
rosarium 0:2ddc0583bcec 1396 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 1397
rosarium 0:2ddc0583bcec 1398 /* Reads the modulation register MOD0 and mask the CW field */
rosarium 0:2ddc0583bcec 1399 SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1400 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 1401 {
rosarium 0:2ddc0583bcec 1402 tempRegValue |=MOD0_CW;
rosarium 0:2ddc0583bcec 1403 }
rosarium 0:2ddc0583bcec 1404 else
rosarium 0:2ddc0583bcec 1405 {
rosarium 0:2ddc0583bcec 1406 tempRegValue &= (~MOD0_CW);
rosarium 0:2ddc0583bcec 1407 }
rosarium 0:2ddc0583bcec 1408
rosarium 0:2ddc0583bcec 1409 /* Writes the new value in the MOD0 register */
rosarium 0:2ddc0583bcec 1410 g_xStatus = SpiritSpiWriteRegisters(MOD0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1411
rosarium 0:2ddc0583bcec 1412 }
rosarium 0:2ddc0583bcec 1413
rosarium 0:2ddc0583bcec 1414
rosarium 0:2ddc0583bcec 1415 /**
rosarium 0:2ddc0583bcec 1416 * @brief Sets the OOK Peak Decay.
rosarium 0:2ddc0583bcec 1417 * @param xOokDecay Peak decay control for OOK.
rosarium 0:2ddc0583bcec 1418 * This parameter shall be of type @ref OokPeakDecay .
rosarium 0:2ddc0583bcec 1419 * @retval None.
rosarium 0:2ddc0583bcec 1420 */
rosarium 0:2ddc0583bcec 1421 void SpiritRadioSetOokPeakDecay(OokPeakDecay xOokDecay)
rosarium 0:2ddc0583bcec 1422 {
rosarium 0:2ddc0583bcec 1423 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1424
rosarium 0:2ddc0583bcec 1425 /* Check the parameters */
rosarium 0:2ddc0583bcec 1426 s_assert_param(IS_OOK_PEAK_DECAY(xOokDecay));
rosarium 0:2ddc0583bcec 1427
rosarium 0:2ddc0583bcec 1428 /* Reads the RSSI_FLT register */
rosarium 0:2ddc0583bcec 1429 SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1430
rosarium 0:2ddc0583bcec 1431 /* Mask the other fields and set OOK Peak Decay */
rosarium 0:2ddc0583bcec 1432 tempRegValue &= 0xFC;
rosarium 0:2ddc0583bcec 1433 tempRegValue |= xOokDecay;
rosarium 0:2ddc0583bcec 1434
rosarium 0:2ddc0583bcec 1435 /* Writes the RSSI_FLT register to set the new OOK peak dacay value */
rosarium 0:2ddc0583bcec 1436 g_xStatus = SpiritSpiWriteRegisters(RSSI_FLT_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1437
rosarium 0:2ddc0583bcec 1438 }
rosarium 0:2ddc0583bcec 1439
rosarium 0:2ddc0583bcec 1440
rosarium 0:2ddc0583bcec 1441 /**
rosarium 0:2ddc0583bcec 1442 * @brief Returns the OOK Peak Decay.
rosarium 0:2ddc0583bcec 1443 * @param None
rosarium 0:2ddc0583bcec 1444 * @retval OokPeakDecay Ook peak decay value.
rosarium 0:2ddc0583bcec 1445 */
rosarium 0:2ddc0583bcec 1446 OokPeakDecay SpiritRadioGetOokPeakDecay(void)
rosarium 0:2ddc0583bcec 1447 {
rosarium 0:2ddc0583bcec 1448 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1449
rosarium 0:2ddc0583bcec 1450 /* Reads the OOK peak decay register RSSI_FLT_BASE*/
rosarium 0:2ddc0583bcec 1451 g_xStatus = SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1452
rosarium 0:2ddc0583bcec 1453 /* Returns the OOK peak decay */
rosarium 0:2ddc0583bcec 1454 return (OokPeakDecay) (tempRegValue & 0x03);
rosarium 0:2ddc0583bcec 1455
rosarium 0:2ddc0583bcec 1456 }
rosarium 0:2ddc0583bcec 1457
rosarium 0:2ddc0583bcec 1458 /**
rosarium 0:2ddc0583bcec 1459 * @brief Returns the PA register value that corresponds to the passed dBm power.
rosarium 0:2ddc0583bcec 1460 * @param lFbase Frequency base expressed in Hz.
rosarium 0:2ddc0583bcec 1461 * @param fPowerdBm Desired power in dBm.
rosarium 0:2ddc0583bcec 1462 * @retval Register value as byte.
rosarium 0:2ddc0583bcec 1463 * @note The power interpolation curves used by this function have been extracted
rosarium 0:2ddc0583bcec 1464 * by measurements done on the divisional evaluation boards.
rosarium 0:2ddc0583bcec 1465 */
rosarium 0:2ddc0583bcec 1466 uint8_t SpiritRadioGetdBm2Reg(uint32_t lFBase, float fPowerdBm)
rosarium 0:2ddc0583bcec 1467 {
rosarium 0:2ddc0583bcec 1468 uint8_t i=0;
rosarium 0:2ddc0583bcec 1469 uint8_t j=0;
rosarium 0:2ddc0583bcec 1470 float fReg;
rosarium 0:2ddc0583bcec 1471
rosarium 0:2ddc0583bcec 1472 if(IS_FREQUENCY_BAND_HIGH(lFBase))
rosarium 0:2ddc0583bcec 1473 {
rosarium 0:2ddc0583bcec 1474 i=0;
rosarium 0:2ddc0583bcec 1475 if(lFBase<900000000) i=1;// 868
rosarium 0:2ddc0583bcec 1476 }
rosarium 0:2ddc0583bcec 1477 else if(IS_FREQUENCY_BAND_MIDDLE(lFBase))
rosarium 0:2ddc0583bcec 1478 {
rosarium 0:2ddc0583bcec 1479 i=2;
rosarium 0:2ddc0583bcec 1480 }
rosarium 0:2ddc0583bcec 1481 else if(IS_FREQUENCY_BAND_LOW(lFBase))
rosarium 0:2ddc0583bcec 1482 {
rosarium 0:2ddc0583bcec 1483 i=3;
rosarium 0:2ddc0583bcec 1484 }
rosarium 0:2ddc0583bcec 1485 else if(IS_FREQUENCY_BAND_VERY_LOW(lFBase))
rosarium 0:2ddc0583bcec 1486 {
rosarium 0:2ddc0583bcec 1487 i=4;
rosarium 0:2ddc0583bcec 1488 }
rosarium 0:2ddc0583bcec 1489
rosarium 0:2ddc0583bcec 1490 j=1;
rosarium 0:2ddc0583bcec 1491 if(fPowerdBm>0 && 13.0/fPowerFactors[i][2]-fPowerFactors[i][3]/fPowerFactors[i][2]<fPowerdBm)
rosarium 0:2ddc0583bcec 1492 j=0;
rosarium 0:2ddc0583bcec 1493 else if(fPowerdBm<=0 && 40.0/fPowerFactors[i][2]-fPowerFactors[i][3]/fPowerFactors[i][2]>fPowerdBm)
rosarium 0:2ddc0583bcec 1494 j=2;
rosarium 0:2ddc0583bcec 1495
rosarium 0:2ddc0583bcec 1496 fReg=fPowerFactors[i][2*j]*fPowerdBm+fPowerFactors[i][2*j+1];
rosarium 0:2ddc0583bcec 1497
rosarium 0:2ddc0583bcec 1498 if(fReg<1)
rosarium 0:2ddc0583bcec 1499 fReg=1;
rosarium 0:2ddc0583bcec 1500 else if(fReg>90)
rosarium 0:2ddc0583bcec 1501 fReg=90;
rosarium 0:2ddc0583bcec 1502
rosarium 0:2ddc0583bcec 1503 return ((uint8_t)fReg);
rosarium 0:2ddc0583bcec 1504 }
rosarium 0:2ddc0583bcec 1505
rosarium 0:2ddc0583bcec 1506
rosarium 0:2ddc0583bcec 1507 /**
rosarium 0:2ddc0583bcec 1508 * @brief Returns the dBm power that corresponds to the value of PA register.
rosarium 0:2ddc0583bcec 1509 * @param lFbase Frequency base expressed in Hz.
rosarium 0:2ddc0583bcec 1510 * @param cPowerReg Register value of the PA.
rosarium 0:2ddc0583bcec 1511 * @retval Power in dBm as float.
rosarium 0:2ddc0583bcec 1512 * @note The power interpolation curves used by this function have been extracted
rosarium 0:2ddc0583bcec 1513 * by measurements done on the divisional evaluation boards.
rosarium 0:2ddc0583bcec 1514 */
rosarium 0:2ddc0583bcec 1515 float SpiritRadioGetReg2dBm(uint32_t lFBase, uint8_t cPowerReg)
rosarium 0:2ddc0583bcec 1516 {
rosarium 0:2ddc0583bcec 1517 uint8_t i=0;
rosarium 0:2ddc0583bcec 1518 uint8_t j=0;
rosarium 0:2ddc0583bcec 1519 float fPower;
rosarium 0:2ddc0583bcec 1520
rosarium 0:2ddc0583bcec 1521 if(cPowerReg==0 || cPowerReg>90)
rosarium 0:2ddc0583bcec 1522 return (-130.0);
rosarium 0:2ddc0583bcec 1523
rosarium 0:2ddc0583bcec 1524 if(IS_FREQUENCY_BAND_HIGH(lFBase))
rosarium 0:2ddc0583bcec 1525 {
rosarium 0:2ddc0583bcec 1526 i=0;
rosarium 0:2ddc0583bcec 1527 if(lFBase<900000000) i=1;// 868
rosarium 0:2ddc0583bcec 1528 }
rosarium 0:2ddc0583bcec 1529 else if(IS_FREQUENCY_BAND_MIDDLE(lFBase))
rosarium 0:2ddc0583bcec 1530 {
rosarium 0:2ddc0583bcec 1531 i=2;
rosarium 0:2ddc0583bcec 1532 }
rosarium 0:2ddc0583bcec 1533 else if(IS_FREQUENCY_BAND_LOW(lFBase))
rosarium 0:2ddc0583bcec 1534 {
rosarium 0:2ddc0583bcec 1535 i=3;
rosarium 0:2ddc0583bcec 1536 }
rosarium 0:2ddc0583bcec 1537 else if(IS_FREQUENCY_BAND_VERY_LOW(lFBase))
rosarium 0:2ddc0583bcec 1538 {
rosarium 0:2ddc0583bcec 1539 i=4;
rosarium 0:2ddc0583bcec 1540 }
rosarium 0:2ddc0583bcec 1541
rosarium 0:2ddc0583bcec 1542 j=1;
rosarium 0:2ddc0583bcec 1543 if(cPowerReg<13) j=0;
rosarium 0:2ddc0583bcec 1544 else if(cPowerReg>40) j=2;
rosarium 0:2ddc0583bcec 1545
rosarium 0:2ddc0583bcec 1546 fPower=(((float)cPowerReg)/fPowerFactors[i][2*j]-fPowerFactors[i][2*j+1]/fPowerFactors[i][2*j]);
rosarium 0:2ddc0583bcec 1547
rosarium 0:2ddc0583bcec 1548 return fPower;
rosarium 0:2ddc0583bcec 1549 }
rosarium 0:2ddc0583bcec 1550
rosarium 0:2ddc0583bcec 1551 /**
rosarium 0:2ddc0583bcec 1552 * @brief Configures the Power Amplifier Table and registers with value expressed in dBm.
rosarium 0:2ddc0583bcec 1553 * @param cPALevelMaxIndex number of levels to set. This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1554 * @param cWidth step width expressed in terms of bit period units Tb/8.
rosarium 0:2ddc0583bcec 1555 * This parameter shall be in the range [1:4].
rosarium 0:2ddc0583bcec 1556 * @param xCLoad one of the possible value of the enum type PALoadCapacitor.
rosarium 0:2ddc0583bcec 1557 * @arg LOAD_0_PF No additional PA load capacitor
rosarium 0:2ddc0583bcec 1558 * @arg LOAD_1_2_PF 1.2pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1559 * @arg LOAD_2_4_PF 2.4pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1560 * @arg LOAD_3_6_PF 3.6pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1561 * @param pfPAtabledBm pointer to an array of PA values in dbm between [-PA_LOWER_LIMIT: PA_UPPER_LIMIT] dbm.
rosarium 0:2ddc0583bcec 1562 * The first element shall be the lower level (PA_LEVEL[0]) value and the last element
rosarium 0:2ddc0583bcec 1563 * the higher level one (PA_LEVEL[paLevelMaxIndex]).
rosarium 0:2ddc0583bcec 1564 * @retval None.
rosarium 0:2ddc0583bcec 1565 */
rosarium 0:2ddc0583bcec 1566 void SpiritRadioSetPATabledBm(uint8_t cPALevelMaxIndex, uint8_t cWidth, PALoadCapacitor xCLoad, float* pfPAtabledBm)
rosarium 0:2ddc0583bcec 1567 {
rosarium 0:2ddc0583bcec 1568 uint8_t palevel[9], address, paLevelValue;
rosarium 0:2ddc0583bcec 1569 uint32_t lFBase=SpiritRadioGetFrequencyBase();
rosarium 0:2ddc0583bcec 1570
rosarium 0:2ddc0583bcec 1571 /* Check the parameters */
rosarium 0:2ddc0583bcec 1572 s_assert_param(IS_PA_MAX_INDEX(cPALevelMaxIndex));
rosarium 0:2ddc0583bcec 1573 s_assert_param(IS_PA_STEP_WIDTH(cWidth));
rosarium 0:2ddc0583bcec 1574 s_assert_param(IS_PA_LOAD_CAP(xCLoad));
rosarium 0:2ddc0583bcec 1575
rosarium 0:2ddc0583bcec 1576 /* Check the PA level in dBm is in the range and calculate the PA_LEVEL value
rosarium 0:2ddc0583bcec 1577 to write in the corresponding register using the linearization formula */
rosarium 0:2ddc0583bcec 1578 for(int i=0; i<=cPALevelMaxIndex; i++)
rosarium 0:2ddc0583bcec 1579 {
rosarium 0:2ddc0583bcec 1580 s_assert_param(IS_PAPOWER_DBM(*pfPAtabledBm));
rosarium 0:2ddc0583bcec 1581 paLevelValue=SpiritRadioGetdBm2Reg(lFBase,(*pfPAtabledBm));
rosarium 0:2ddc0583bcec 1582 palevel[cPALevelMaxIndex-i]=paLevelValue;
rosarium 0:2ddc0583bcec 1583 pfPAtabledBm++;
rosarium 0:2ddc0583bcec 1584 }
rosarium 0:2ddc0583bcec 1585
rosarium 0:2ddc0583bcec 1586 /* Sets the PA_POWER[0] register */
rosarium 0:2ddc0583bcec 1587 palevel[cPALevelMaxIndex+1]=xCLoad|(cWidth-1)<<3|cPALevelMaxIndex;
rosarium 0:2ddc0583bcec 1588
rosarium 0:2ddc0583bcec 1589 /* Sets the base address */
rosarium 0:2ddc0583bcec 1590 address=PA_POWER8_BASE+7-cPALevelMaxIndex;
rosarium 0:2ddc0583bcec 1591
rosarium 0:2ddc0583bcec 1592 /* Configures the PA_POWER registers */
rosarium 0:2ddc0583bcec 1593 g_xStatus = SpiritSpiWriteRegisters(address, cPALevelMaxIndex+2, palevel);
rosarium 0:2ddc0583bcec 1594
rosarium 0:2ddc0583bcec 1595 }
rosarium 0:2ddc0583bcec 1596
rosarium 0:2ddc0583bcec 1597
rosarium 0:2ddc0583bcec 1598 /**
rosarium 0:2ddc0583bcec 1599 * @brief Returns the Power Amplifier Table and registers, returning values in dBm.
rosarium 0:2ddc0583bcec 1600 * @param pcPALevelMaxIndex pointer to the number of levels settled.
rosarium 0:2ddc0583bcec 1601 * This parameter will be in the range [0:7].
rosarium 0:2ddc0583bcec 1602 * @param pfPAtabledBm pointer to an array of 8 elements containing the PA value in dbm.
rosarium 0:2ddc0583bcec 1603 * The first element will be the PA_LEVEL_0 and the last element
rosarium 0:2ddc0583bcec 1604 * will be PA_LEVEL_7. Any value higher than PA_UPPER_LIMIT implies no output
rosarium 0:2ddc0583bcec 1605 * power (output stage is in high impedance).
rosarium 0:2ddc0583bcec 1606 * @retval None.
rosarium 0:2ddc0583bcec 1607 */
rosarium 0:2ddc0583bcec 1608 void SpiritRadioGetPATabledBm(uint8_t* pcPALevelMaxIndex, float* pfPAtabledBm)
rosarium 0:2ddc0583bcec 1609 {
rosarium 0:2ddc0583bcec 1610 uint8_t palevelvect[9];
rosarium 0:2ddc0583bcec 1611 uint32_t lFBase=SpiritRadioGetFrequencyBase();
rosarium 0:2ddc0583bcec 1612
rosarium 0:2ddc0583bcec 1613 /* Reads the PA_LEVEL_x registers and the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1614 g_xStatus = SpiritSpiReadRegisters(PA_POWER8_BASE, 9, palevelvect);
rosarium 0:2ddc0583bcec 1615
rosarium 0:2ddc0583bcec 1616 /* Fill the PAtable */
rosarium 0:2ddc0583bcec 1617 for(int i=7; i>=0; i--)
rosarium 0:2ddc0583bcec 1618 {
rosarium 0:2ddc0583bcec 1619 (*pfPAtabledBm)=SpiritRadioGetReg2dBm(lFBase,palevelvect[i]);
rosarium 0:2ddc0583bcec 1620 pfPAtabledBm++;
rosarium 0:2ddc0583bcec 1621 }
rosarium 0:2ddc0583bcec 1622
rosarium 0:2ddc0583bcec 1623 /* Return the settled index */
rosarium 0:2ddc0583bcec 1624 *pcPALevelMaxIndex = palevelvect[8]&0x07;
rosarium 0:2ddc0583bcec 1625
rosarium 0:2ddc0583bcec 1626 }
rosarium 0:2ddc0583bcec 1627
rosarium 0:2ddc0583bcec 1628
rosarium 0:2ddc0583bcec 1629
rosarium 0:2ddc0583bcec 1630
rosarium 0:2ddc0583bcec 1631
rosarium 0:2ddc0583bcec 1632
rosarium 0:2ddc0583bcec 1633 /**
rosarium 0:2ddc0583bcec 1634 * @brief Sets a specific PA_LEVEL register, with a value given in dBm.
rosarium 0:2ddc0583bcec 1635 * @param cIndex PA_LEVEL to set. This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1636 * @param fPowerdBm PA value to write expressed in dBm . Be sure that this values is in the
rosarium 0:2ddc0583bcec 1637 * correct range [-PA_LOWER_LIMIT: PA_UPPER_LIMIT] dBm.
rosarium 0:2ddc0583bcec 1638 * @retval None.
rosarium 0:2ddc0583bcec 1639 * @note This function makes use of the @ref SpiritRadioGetdBm2Reg fcn to interpolate the
rosarium 0:2ddc0583bcec 1640 * power value.
rosarium 0:2ddc0583bcec 1641 */
rosarium 0:2ddc0583bcec 1642 void SpiritRadioSetPALeveldBm(uint8_t cIndex, float fPowerdBm)
rosarium 0:2ddc0583bcec 1643 {
rosarium 0:2ddc0583bcec 1644 uint8_t address, paLevelValue;
rosarium 0:2ddc0583bcec 1645
rosarium 0:2ddc0583bcec 1646 /* Check the parameters */
rosarium 0:2ddc0583bcec 1647 s_assert_param(IS_PA_MAX_INDEX(cIndex));
rosarium 0:2ddc0583bcec 1648 s_assert_param(IS_PAPOWER_DBM(fPowerdBm));
rosarium 0:2ddc0583bcec 1649
rosarium 0:2ddc0583bcec 1650 /* interpolate the power level */
rosarium 0:2ddc0583bcec 1651 paLevelValue=SpiritRadioGetdBm2Reg(SpiritRadioGetFrequencyBase(),fPowerdBm);
rosarium 0:2ddc0583bcec 1652
rosarium 0:2ddc0583bcec 1653 /* Sets the base address */
rosarium 0:2ddc0583bcec 1654 address=PA_POWER8_BASE+7-cIndex;
rosarium 0:2ddc0583bcec 1655
rosarium 0:2ddc0583bcec 1656 /* Configures the PA_LEVEL register */
rosarium 0:2ddc0583bcec 1657 g_xStatus = SpiritSpiWriteRegisters(address, 1, &paLevelValue);
rosarium 0:2ddc0583bcec 1658
rosarium 0:2ddc0583bcec 1659 }
rosarium 0:2ddc0583bcec 1660
rosarium 0:2ddc0583bcec 1661
rosarium 0:2ddc0583bcec 1662 /**
rosarium 0:2ddc0583bcec 1663 * @brief Returns a specific PA_LEVEL register, returning a value in dBm.
rosarium 0:2ddc0583bcec 1664 * @param cIndex PA_LEVEL to read. This parameter shall be in the range [0:7]
rosarium 0:2ddc0583bcec 1665 * @retval float Settled power level expressed in dBm. A value
rosarium 0:2ddc0583bcec 1666 * higher than PA_UPPER_LIMIT dBm implies no output power
rosarium 0:2ddc0583bcec 1667 * (output stage is in high impedance).
rosarium 0:2ddc0583bcec 1668 * @note This function makes use of the @ref SpiritRadioGetReg2dBm fcn to interpolate the
rosarium 0:2ddc0583bcec 1669 * power value.
rosarium 0:2ddc0583bcec 1670 */
rosarium 0:2ddc0583bcec 1671 float SpiritRadioGetPALeveldBm(uint8_t cIndex)
rosarium 0:2ddc0583bcec 1672 {
rosarium 0:2ddc0583bcec 1673 uint8_t address, paLevelValue;
rosarium 0:2ddc0583bcec 1674
rosarium 0:2ddc0583bcec 1675 /* Check the parameters */
rosarium 0:2ddc0583bcec 1676 s_assert_param(IS_PA_MAX_INDEX(cIndex));
rosarium 0:2ddc0583bcec 1677
rosarium 0:2ddc0583bcec 1678 /* Sets the base address */
rosarium 0:2ddc0583bcec 1679 address=PA_POWER8_BASE+7-cIndex;
rosarium 0:2ddc0583bcec 1680
rosarium 0:2ddc0583bcec 1681 /* Reads the PA_LEVEL[cIndex] register */
rosarium 0:2ddc0583bcec 1682 g_xStatus = SpiritSpiReadRegisters(address, 1, &paLevelValue);
rosarium 0:2ddc0583bcec 1683
rosarium 0:2ddc0583bcec 1684 return SpiritRadioGetReg2dBm(SpiritRadioGetFrequencyBase(),paLevelValue);
rosarium 0:2ddc0583bcec 1685 }
rosarium 0:2ddc0583bcec 1686
rosarium 0:2ddc0583bcec 1687
rosarium 0:2ddc0583bcec 1688 /**
rosarium 0:2ddc0583bcec 1689 * @brief Configures the Power Amplifier Table and registers.
rosarium 0:2ddc0583bcec 1690 * @param cPALevelMaxIndex number of levels to set. This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1691 * @param cWidth step width expressed in terms of bit period units Tb/8.
rosarium 0:2ddc0583bcec 1692 * This parameter shall be in the range [1:4].
rosarium 0:2ddc0583bcec 1693 * @param xCLoad one of the possible value of the enum type PALoadCapacitor.
rosarium 0:2ddc0583bcec 1694 * @arg LOAD_0_PF No additional PA load capacitor
rosarium 0:2ddc0583bcec 1695 * @arg LOAD_1_2_PF 1.2pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1696 * @arg LOAD_2_4_PF 2.4pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1697 * @arg LOAD_3_6_PF 3.6pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1698 * @param pcPAtable pointer to an array of PA values in the range [0: 90], where 0 implies no
rosarium 0:2ddc0583bcec 1699 * output power, 1 will be the maximum level and 90 the minimum one
rosarium 0:2ddc0583bcec 1700 * The first element shall be the lower level (PA_LEVEL[0]) value and the last element
rosarium 0:2ddc0583bcec 1701 * the higher level one (PA_LEVEL[paLevelMaxIndex]).
rosarium 0:2ddc0583bcec 1702 * @retval None.
rosarium 0:2ddc0583bcec 1703 */
rosarium 0:2ddc0583bcec 1704 void SpiritRadioSetPATable(uint8_t cPALevelMaxIndex, uint8_t cWidth, PALoadCapacitor xCLoad, uint8_t* pcPAtable)
rosarium 0:2ddc0583bcec 1705 {
rosarium 0:2ddc0583bcec 1706 uint8_t palevel[9], address;
rosarium 0:2ddc0583bcec 1707
rosarium 0:2ddc0583bcec 1708 /* Check the parameters */
rosarium 0:2ddc0583bcec 1709 s_assert_param(IS_PA_MAX_INDEX(cPALevelMaxIndex));
rosarium 0:2ddc0583bcec 1710 s_assert_param(IS_PA_STEP_WIDTH(cWidth));
rosarium 0:2ddc0583bcec 1711 s_assert_param(IS_PA_LOAD_CAP(xCLoad));
rosarium 0:2ddc0583bcec 1712
rosarium 0:2ddc0583bcec 1713 /* Check the PA levels are in the range */
rosarium 0:2ddc0583bcec 1714 for(int i=0; i<=cPALevelMaxIndex; i++)
rosarium 0:2ddc0583bcec 1715 {
rosarium 0:2ddc0583bcec 1716 s_assert_param(IS_PAPOWER(*pcPAtable));
rosarium 0:2ddc0583bcec 1717 palevel[cPALevelMaxIndex-i]=*pcPAtable;
rosarium 0:2ddc0583bcec 1718 pcPAtable++;
rosarium 0:2ddc0583bcec 1719 }
rosarium 0:2ddc0583bcec 1720
rosarium 0:2ddc0583bcec 1721 /* Sets the PA_POWER[0] register */
rosarium 0:2ddc0583bcec 1722 palevel[cPALevelMaxIndex+1]=xCLoad|((cWidth-1)<<3)|cPALevelMaxIndex;
rosarium 0:2ddc0583bcec 1723
rosarium 0:2ddc0583bcec 1724 /* Sets the base address */
rosarium 0:2ddc0583bcec 1725 address=PA_POWER8_BASE+7-cPALevelMaxIndex;
rosarium 0:2ddc0583bcec 1726
rosarium 0:2ddc0583bcec 1727 /* Configures the PA_POWER registers */
rosarium 0:2ddc0583bcec 1728 g_xStatus = SpiritSpiWriteRegisters(address, cPALevelMaxIndex+2, palevel);
rosarium 0:2ddc0583bcec 1729
rosarium 0:2ddc0583bcec 1730 }
rosarium 0:2ddc0583bcec 1731
rosarium 0:2ddc0583bcec 1732
rosarium 0:2ddc0583bcec 1733 /**
rosarium 0:2ddc0583bcec 1734 * @brief Returns the Power Amplifier Table and registers.
rosarium 0:2ddc0583bcec 1735 * @param pcPALevelMaxIndex pointer to the number of levels settled.
rosarium 0:2ddc0583bcec 1736 * This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1737 * @param pcPAtable pointer to an array of 8 elements containing the PA value.
rosarium 0:2ddc0583bcec 1738 * The first element will be the PA_LEVEL_0 and the last element
rosarium 0:2ddc0583bcec 1739 * will be PA_LEVEL_7. Any value equals to 0 implies that level has
rosarium 0:2ddc0583bcec 1740 * no output power (output stage is in high impedance).
rosarium 0:2ddc0583bcec 1741 * @retval None
rosarium 0:2ddc0583bcec 1742 */
rosarium 0:2ddc0583bcec 1743 void SpiritRadioGetPATable(uint8_t* pcPALevelMaxIndex, uint8_t* pcPAtable)
rosarium 0:2ddc0583bcec 1744 {
rosarium 0:2ddc0583bcec 1745 uint8_t palevelvect[9];
rosarium 0:2ddc0583bcec 1746
rosarium 0:2ddc0583bcec 1747 /* Reads the PA_LEVEL_x registers and the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1748 g_xStatus = SpiritSpiReadRegisters(PA_POWER8_BASE, 9, palevelvect);
rosarium 0:2ddc0583bcec 1749
rosarium 0:2ddc0583bcec 1750 /* Fill the PAtable */
rosarium 0:2ddc0583bcec 1751 for(int i=7; i>=0; i--)
rosarium 0:2ddc0583bcec 1752 {
rosarium 0:2ddc0583bcec 1753 *pcPAtable = palevelvect[i];
rosarium 0:2ddc0583bcec 1754 pcPAtable++;
rosarium 0:2ddc0583bcec 1755 }
rosarium 0:2ddc0583bcec 1756
rosarium 0:2ddc0583bcec 1757 /* Return the settled index */
rosarium 0:2ddc0583bcec 1758 *pcPALevelMaxIndex = palevelvect[8]&0x07;
rosarium 0:2ddc0583bcec 1759
rosarium 0:2ddc0583bcec 1760 }
rosarium 0:2ddc0583bcec 1761
rosarium 0:2ddc0583bcec 1762
rosarium 0:2ddc0583bcec 1763 /**
rosarium 0:2ddc0583bcec 1764 * @brief Sets a specific PA_LEVEL register.
rosarium 0:2ddc0583bcec 1765 * @param cIndex PA_LEVEL to set. This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1766 * @param cPower PA value to write in the register. Be sure that this values is in the
rosarium 0:2ddc0583bcec 1767 * correct range [0 : 90].
rosarium 0:2ddc0583bcec 1768 * @retval None.
rosarium 0:2ddc0583bcec 1769 */
rosarium 0:2ddc0583bcec 1770 void SpiritRadioSetPALevel(uint8_t cIndex, uint8_t cPower)
rosarium 0:2ddc0583bcec 1771 {
rosarium 0:2ddc0583bcec 1772 uint8_t address;
rosarium 0:2ddc0583bcec 1773
rosarium 0:2ddc0583bcec 1774 /* Check the parameters */
rosarium 0:2ddc0583bcec 1775 s_assert_param(IS_PA_MAX_INDEX(cIndex));
rosarium 0:2ddc0583bcec 1776 s_assert_param(IS_PAPOWER(cPower));
rosarium 0:2ddc0583bcec 1777
rosarium 0:2ddc0583bcec 1778 /* Sets the base address */
rosarium 0:2ddc0583bcec 1779 address=PA_POWER8_BASE+7-cIndex;
rosarium 0:2ddc0583bcec 1780
rosarium 0:2ddc0583bcec 1781 /* Configures the PA_LEVEL register */
rosarium 0:2ddc0583bcec 1782 g_xStatus = SpiritSpiWriteRegisters(address, 1, &cPower);
rosarium 0:2ddc0583bcec 1783
rosarium 0:2ddc0583bcec 1784 }
rosarium 0:2ddc0583bcec 1785
rosarium 0:2ddc0583bcec 1786
rosarium 0:2ddc0583bcec 1787 /**
rosarium 0:2ddc0583bcec 1788 * @brief Returns a specific PA_LEVEL register.
rosarium 0:2ddc0583bcec 1789 * @param cIndex PA_LEVEL to read. This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1790 * @retval uint8_t PA_LEVEL value. A value equal to zero
rosarium 0:2ddc0583bcec 1791 * implies no output power (output stage is in high impedance).
rosarium 0:2ddc0583bcec 1792 */
rosarium 0:2ddc0583bcec 1793 uint8_t SpiritRadioGetPALevel(uint8_t cIndex)
rosarium 0:2ddc0583bcec 1794 {
rosarium 0:2ddc0583bcec 1795 uint8_t address, tempRegValue;
rosarium 0:2ddc0583bcec 1796
rosarium 0:2ddc0583bcec 1797 /* Check the parameters */
rosarium 0:2ddc0583bcec 1798 s_assert_param(IS_PA_MAX_INDEX(cIndex));
rosarium 0:2ddc0583bcec 1799
rosarium 0:2ddc0583bcec 1800 /* Sets the base address */
rosarium 0:2ddc0583bcec 1801 address=PA_POWER8_BASE+7-cIndex;
rosarium 0:2ddc0583bcec 1802
rosarium 0:2ddc0583bcec 1803 /* Reads the PA_LEVEL[cIndex] register and return the value */
rosarium 0:2ddc0583bcec 1804 g_xStatus = SpiritSpiReadRegisters(address, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1805 return tempRegValue;
rosarium 0:2ddc0583bcec 1806
rosarium 0:2ddc0583bcec 1807 }
rosarium 0:2ddc0583bcec 1808
rosarium 0:2ddc0583bcec 1809
rosarium 0:2ddc0583bcec 1810 /**
rosarium 0:2ddc0583bcec 1811 * @brief Sets the output stage additional load capacitor bank.
rosarium 0:2ddc0583bcec 1812 * @param xCLoad one of the possible value of the enum type PALoadCapacitor.
rosarium 0:2ddc0583bcec 1813 * @arg LOAD_0_PF No additional PA load capacitor
rosarium 0:2ddc0583bcec 1814 * @arg LOAD_1_2_PF 1.2pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1815 * @arg LOAD_2_4_PF 2.4pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1816 * @arg LOAD_3_6_PF 3.6pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1817 * @retval None.
rosarium 0:2ddc0583bcec 1818 */
rosarium 0:2ddc0583bcec 1819 void SpiritRadioSetPACwc(PALoadCapacitor xCLoad)
rosarium 0:2ddc0583bcec 1820 {
rosarium 0:2ddc0583bcec 1821 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1822
rosarium 0:2ddc0583bcec 1823 /* Check the parameters */
rosarium 0:2ddc0583bcec 1824 s_assert_param(IS_PA_LOAD_CAP(xCLoad));
rosarium 0:2ddc0583bcec 1825
rosarium 0:2ddc0583bcec 1826 /* Reads the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1827 SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1828
rosarium 0:2ddc0583bcec 1829 /* Mask the CWC[1:0] field and write the new value */
rosarium 0:2ddc0583bcec 1830 tempRegValue &= 0x3F;
rosarium 0:2ddc0583bcec 1831 tempRegValue |= xCLoad;
rosarium 0:2ddc0583bcec 1832
rosarium 0:2ddc0583bcec 1833 /* Configures the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1834 g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1835
rosarium 0:2ddc0583bcec 1836 }
rosarium 0:2ddc0583bcec 1837
rosarium 0:2ddc0583bcec 1838
rosarium 0:2ddc0583bcec 1839 /**
rosarium 0:2ddc0583bcec 1840 * @brief Returns the output stage additional load capacitor bank.
rosarium 0:2ddc0583bcec 1841 * @param None.
rosarium 0:2ddc0583bcec 1842 * @retval PALoadCapacitor Output stage additional load capacitor bank.
rosarium 0:2ddc0583bcec 1843 * This parameter can be:
rosarium 0:2ddc0583bcec 1844 * @arg LOAD_0_PF No additional PA load capacitor
rosarium 0:2ddc0583bcec 1845 * @arg LOAD_1_2_PF 1.2pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1846 * @arg LOAD_2_4_PF 2.4pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1847 * @arg LOAD_3_6_PF 3.6pF additional PA load capacitor
rosarium 0:2ddc0583bcec 1848 */
rosarium 0:2ddc0583bcec 1849 PALoadCapacitor SpiritRadioGetPACwc(void)
rosarium 0:2ddc0583bcec 1850 {
rosarium 0:2ddc0583bcec 1851 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1852
rosarium 0:2ddc0583bcec 1853 /* Reads the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1854 g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1855
rosarium 0:2ddc0583bcec 1856 /* Mask the CWC[1:0] field and return the value*/
rosarium 0:2ddc0583bcec 1857 return (PALoadCapacitor)(tempRegValue & 0xC0);
rosarium 0:2ddc0583bcec 1858
rosarium 0:2ddc0583bcec 1859 }
rosarium 0:2ddc0583bcec 1860
rosarium 0:2ddc0583bcec 1861
rosarium 0:2ddc0583bcec 1862 /**
rosarium 0:2ddc0583bcec 1863 * @brief Sets a specific PA_LEVEL_MAX_INDEX.
rosarium 0:2ddc0583bcec 1864 * @param cIndex PA_LEVEL_MAX_INDEX to set. This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 1865 * @retval None
rosarium 0:2ddc0583bcec 1866 */
rosarium 0:2ddc0583bcec 1867 void SpiritRadioSetPALevelMaxIndex(uint8_t cIndex)
rosarium 0:2ddc0583bcec 1868 {
rosarium 0:2ddc0583bcec 1869 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1870
rosarium 0:2ddc0583bcec 1871 /* Check the parameters */
rosarium 0:2ddc0583bcec 1872 s_assert_param(IS_PA_MAX_INDEX(cIndex));
rosarium 0:2ddc0583bcec 1873
rosarium 0:2ddc0583bcec 1874 /* Reads the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1875 SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1876
rosarium 0:2ddc0583bcec 1877 /* Mask the PA_LEVEL_MAX_INDEX[1:0] field and write the new value */
rosarium 0:2ddc0583bcec 1878 tempRegValue &= 0xF8;
rosarium 0:2ddc0583bcec 1879 tempRegValue |= cIndex;
rosarium 0:2ddc0583bcec 1880
rosarium 0:2ddc0583bcec 1881 /* Configures the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1882 g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1883
rosarium 0:2ddc0583bcec 1884 }
rosarium 0:2ddc0583bcec 1885
rosarium 0:2ddc0583bcec 1886
rosarium 0:2ddc0583bcec 1887 /**
rosarium 0:2ddc0583bcec 1888 * @brief Returns the actual PA_LEVEL_MAX_INDEX.
rosarium 0:2ddc0583bcec 1889 * @param None.
rosarium 0:2ddc0583bcec 1890 * @retval uint8_t Actual PA_LEVEL_MAX_INDEX. This parameter will be in the range [0:7].
rosarium 0:2ddc0583bcec 1891 */
rosarium 0:2ddc0583bcec 1892 uint8_t SpiritRadioGetPALevelMaxIndex(void)
rosarium 0:2ddc0583bcec 1893 {
rosarium 0:2ddc0583bcec 1894 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1895
rosarium 0:2ddc0583bcec 1896 /* Reads the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1897 g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1898
rosarium 0:2ddc0583bcec 1899 /* Mask the PA_LEVEL_MAX_INDEX[1:0] field and return the value */
rosarium 0:2ddc0583bcec 1900 return (tempRegValue & 0x07);
rosarium 0:2ddc0583bcec 1901
rosarium 0:2ddc0583bcec 1902 }
rosarium 0:2ddc0583bcec 1903
rosarium 0:2ddc0583bcec 1904
rosarium 0:2ddc0583bcec 1905 /**
rosarium 0:2ddc0583bcec 1906 * @brief Sets a specific PA_RAMP_STEP_WIDTH.
rosarium 0:2ddc0583bcec 1907 * @param cWidth step width expressed in terms of bit period units Tb/8.
rosarium 0:2ddc0583bcec 1908 * This parameter shall be in the range [1:4].
rosarium 0:2ddc0583bcec 1909 * @retval None.
rosarium 0:2ddc0583bcec 1910 */
rosarium 0:2ddc0583bcec 1911 void SpiritRadioSetPAStepWidth(uint8_t cWidth)
rosarium 0:2ddc0583bcec 1912 {
rosarium 0:2ddc0583bcec 1913 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1914
rosarium 0:2ddc0583bcec 1915 /* Check the parameters */
rosarium 0:2ddc0583bcec 1916 s_assert_param(IS_PA_STEP_WIDTH(cWidth));
rosarium 0:2ddc0583bcec 1917
rosarium 0:2ddc0583bcec 1918 /* Reads the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1919 SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1920
rosarium 0:2ddc0583bcec 1921 /* Mask the PA_RAMP_STEP_WIDTH[1:0] field and write the new value */
rosarium 0:2ddc0583bcec 1922 tempRegValue &= 0xE7;
rosarium 0:2ddc0583bcec 1923 tempRegValue |= (cWidth-1)<<3;
rosarium 0:2ddc0583bcec 1924
rosarium 0:2ddc0583bcec 1925 /* Configures the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1926 g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1927
rosarium 0:2ddc0583bcec 1928 }
rosarium 0:2ddc0583bcec 1929
rosarium 0:2ddc0583bcec 1930
rosarium 0:2ddc0583bcec 1931 /**
rosarium 0:2ddc0583bcec 1932 * @brief Returns the actual PA_RAMP_STEP_WIDTH.
rosarium 0:2ddc0583bcec 1933 * @param None.
rosarium 0:2ddc0583bcec 1934 * @retval uint8_t Step width value expressed in terms of bit period units Tb/8.
rosarium 0:2ddc0583bcec 1935 * This parameter will be in the range [1:4].
rosarium 0:2ddc0583bcec 1936 */
rosarium 0:2ddc0583bcec 1937 uint8_t SpiritRadioGetPAStepWidth(void)
rosarium 0:2ddc0583bcec 1938 {
rosarium 0:2ddc0583bcec 1939 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1940
rosarium 0:2ddc0583bcec 1941 /* Reads the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1942 g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1943
rosarium 0:2ddc0583bcec 1944 /* Mask the PA_RAMP_STEP_WIDTH[1:0] field and return the value */
rosarium 0:2ddc0583bcec 1945 tempRegValue &= 0x18;
rosarium 0:2ddc0583bcec 1946 return ((tempRegValue>>3)+1);
rosarium 0:2ddc0583bcec 1947
rosarium 0:2ddc0583bcec 1948 }
rosarium 0:2ddc0583bcec 1949
rosarium 0:2ddc0583bcec 1950
rosarium 0:2ddc0583bcec 1951 /**
rosarium 0:2ddc0583bcec 1952 * @brief Enables or Disables the Power Ramping.
rosarium 0:2ddc0583bcec 1953 * @param xNewState new state for power ramping.
rosarium 0:2ddc0583bcec 1954 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 1955 * @retval None.
rosarium 0:2ddc0583bcec 1956 */
rosarium 0:2ddc0583bcec 1957 void SpiritRadioPARamping(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 1958 {
rosarium 0:2ddc0583bcec 1959 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 1960
rosarium 0:2ddc0583bcec 1961 /* Check the parameters */
rosarium 0:2ddc0583bcec 1962 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 1963
rosarium 0:2ddc0583bcec 1964 /* Reads the PA_POWER_0 register and configure the PA_RAMP_ENABLE field */
rosarium 0:2ddc0583bcec 1965 SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1966 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 1967 {
rosarium 0:2ddc0583bcec 1968 tempRegValue |= PA_POWER0_PA_RAMP_MASK;
rosarium 0:2ddc0583bcec 1969 }
rosarium 0:2ddc0583bcec 1970 else
rosarium 0:2ddc0583bcec 1971 {
rosarium 0:2ddc0583bcec 1972 tempRegValue &= (~PA_POWER0_PA_RAMP_MASK);
rosarium 0:2ddc0583bcec 1973 }
rosarium 0:2ddc0583bcec 1974
rosarium 0:2ddc0583bcec 1975 /* Sets the PA_POWER_0 register */
rosarium 0:2ddc0583bcec 1976 g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1977
rosarium 0:2ddc0583bcec 1978 }
rosarium 0:2ddc0583bcec 1979
rosarium 0:2ddc0583bcec 1980 /**
rosarium 0:2ddc0583bcec 1981 * @brief Returns the Power Ramping enable bit.
rosarium 0:2ddc0583bcec 1982 * @param xNewState new state for power ramping.
rosarium 0:2ddc0583bcec 1983 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 1984 * @retval None.
rosarium 0:2ddc0583bcec 1985 */
rosarium 0:2ddc0583bcec 1986 SpiritFunctionalState SpiritRadioGetPARamping(void)
rosarium 0:2ddc0583bcec 1987 {
rosarium 0:2ddc0583bcec 1988 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 1989
rosarium 0:2ddc0583bcec 1990 /* Reads the PA_POWER_0 register and configure the PA_RAMP_ENABLE field */
rosarium 0:2ddc0583bcec 1991 g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 1992
rosarium 0:2ddc0583bcec 1993 /* Mask and return data */
rosarium 0:2ddc0583bcec 1994 return (SpiritFunctionalState)((tempRegValue>>5) & 0x01);
rosarium 0:2ddc0583bcec 1995
rosarium 0:2ddc0583bcec 1996 }
rosarium 0:2ddc0583bcec 1997
rosarium 0:2ddc0583bcec 1998
rosarium 0:2ddc0583bcec 1999 /**
rosarium 0:2ddc0583bcec 2000 * @brief Enables or Disables the AFC.
rosarium 0:2ddc0583bcec 2001 * @param xNewState new state for AFC.
rosarium 0:2ddc0583bcec 2002 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 2003 * @retval None.
rosarium 0:2ddc0583bcec 2004 */
rosarium 0:2ddc0583bcec 2005 void SpiritRadioAFC(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2006 {
rosarium 0:2ddc0583bcec 2007 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2008
rosarium 0:2ddc0583bcec 2009 /* Check the parameters */
rosarium 0:2ddc0583bcec 2010 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2011
rosarium 0:2ddc0583bcec 2012 /* Reads the AFC_2 register and configure the AFC Enabled field */
rosarium 0:2ddc0583bcec 2013 SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2014 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2015 {
rosarium 0:2ddc0583bcec 2016 tempRegValue |= AFC2_AFC_MASK;
rosarium 0:2ddc0583bcec 2017 }
rosarium 0:2ddc0583bcec 2018 else
rosarium 0:2ddc0583bcec 2019 {
rosarium 0:2ddc0583bcec 2020 tempRegValue &= (~AFC2_AFC_MASK);
rosarium 0:2ddc0583bcec 2021 }
rosarium 0:2ddc0583bcec 2022
rosarium 0:2ddc0583bcec 2023 /* Sets the AFC_2 register */
rosarium 0:2ddc0583bcec 2024 g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2025
rosarium 0:2ddc0583bcec 2026 }
rosarium 0:2ddc0583bcec 2027
rosarium 0:2ddc0583bcec 2028
rosarium 0:2ddc0583bcec 2029 /**
rosarium 0:2ddc0583bcec 2030 * @brief Enables or Disables the AFC freeze on sync word detection.
rosarium 0:2ddc0583bcec 2031 * @param xNewState new state for AFC freeze on sync word detection.
rosarium 0:2ddc0583bcec 2032 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 2033 * @retval None.
rosarium 0:2ddc0583bcec 2034 */
rosarium 0:2ddc0583bcec 2035 void SpiritRadioAFCFreezeOnSync(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2036 {
rosarium 0:2ddc0583bcec 2037 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2038
rosarium 0:2ddc0583bcec 2039 /* Check the parameters */
rosarium 0:2ddc0583bcec 2040 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2041
rosarium 0:2ddc0583bcec 2042 /* Reads the AFC_2 register and configure the AFC Freeze on Sync field */
rosarium 0:2ddc0583bcec 2043 SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2044 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2045 {
rosarium 0:2ddc0583bcec 2046 tempRegValue |= AFC2_AFC_FREEZE_ON_SYNC_MASK;
rosarium 0:2ddc0583bcec 2047 }
rosarium 0:2ddc0583bcec 2048 else
rosarium 0:2ddc0583bcec 2049 {
rosarium 0:2ddc0583bcec 2050 tempRegValue &= (~AFC2_AFC_FREEZE_ON_SYNC_MASK);
rosarium 0:2ddc0583bcec 2051 }
rosarium 0:2ddc0583bcec 2052
rosarium 0:2ddc0583bcec 2053 /* Sets the AFC_2 register */
rosarium 0:2ddc0583bcec 2054 g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2055
rosarium 0:2ddc0583bcec 2056 }
rosarium 0:2ddc0583bcec 2057
rosarium 0:2ddc0583bcec 2058
rosarium 0:2ddc0583bcec 2059 /**
rosarium 0:2ddc0583bcec 2060 * @brief Sets the AFC working mode.
rosarium 0:2ddc0583bcec 2061 * @param xMode the AFC mode. This parameter can be one of the values defined in @ref AFCMode :
rosarium 0:2ddc0583bcec 2062 * @arg AFC_SLICER_CORRECTION AFC loop closed on slicer
rosarium 0:2ddc0583bcec 2063 * @arg AFC_2ND_IF_CORRECTION AFC loop closed on 2nd conversion stage
rosarium 0:2ddc0583bcec 2064 * @retval None.
rosarium 0:2ddc0583bcec 2065 */
rosarium 0:2ddc0583bcec 2066 void SpiritRadioSetAFCMode(AFCMode xMode)
rosarium 0:2ddc0583bcec 2067 {
rosarium 0:2ddc0583bcec 2068 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2069
rosarium 0:2ddc0583bcec 2070 /* Check the parameters */
rosarium 0:2ddc0583bcec 2071 s_assert_param(IS_AFC_MODE(xMode));
rosarium 0:2ddc0583bcec 2072
rosarium 0:2ddc0583bcec 2073 /* Reads the AFC_2 register and configure the AFC Mode field */
rosarium 0:2ddc0583bcec 2074 SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2075 if(xMode == AFC_2ND_IF_CORRECTION)
rosarium 0:2ddc0583bcec 2076 {
rosarium 0:2ddc0583bcec 2077 tempRegValue |= AFC_2ND_IF_CORRECTION;
rosarium 0:2ddc0583bcec 2078 }
rosarium 0:2ddc0583bcec 2079 else
rosarium 0:2ddc0583bcec 2080 {
rosarium 0:2ddc0583bcec 2081 tempRegValue &= (~AFC_2ND_IF_CORRECTION);
rosarium 0:2ddc0583bcec 2082 }
rosarium 0:2ddc0583bcec 2083
rosarium 0:2ddc0583bcec 2084 /* Sets the AFC_2 register */
rosarium 0:2ddc0583bcec 2085 g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2086
rosarium 0:2ddc0583bcec 2087 }
rosarium 0:2ddc0583bcec 2088
rosarium 0:2ddc0583bcec 2089
rosarium 0:2ddc0583bcec 2090 /**
rosarium 0:2ddc0583bcec 2091 * @brief Returns the AFC working mode.
rosarium 0:2ddc0583bcec 2092 * @param None.
rosarium 0:2ddc0583bcec 2093 * @retval AFCMode Settled AFC mode. This parameter will be one of the values defined in @ref AFCMode :
rosarium 0:2ddc0583bcec 2094 * @arg AFC_SLICER_CORRECTION AFC loop closed on slicer
rosarium 0:2ddc0583bcec 2095 * @arg AFC_2ND_IF_CORRECTION AFC loop closed on 2nd conversion stage
rosarium 0:2ddc0583bcec 2096 */
rosarium 0:2ddc0583bcec 2097 AFCMode SpiritRadioGetAFCMode(void)
rosarium 0:2ddc0583bcec 2098 {
rosarium 0:2ddc0583bcec 2099 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2100
rosarium 0:2ddc0583bcec 2101 /* Reads the AFC_2 register */
rosarium 0:2ddc0583bcec 2102 g_xStatus = SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2103
rosarium 0:2ddc0583bcec 2104 /* Mask the AFC Mode field and returns the value */
rosarium 0:2ddc0583bcec 2105 return (AFCMode)(tempRegValue & 0x20);
rosarium 0:2ddc0583bcec 2106
rosarium 0:2ddc0583bcec 2107 }
rosarium 0:2ddc0583bcec 2108
rosarium 0:2ddc0583bcec 2109
rosarium 0:2ddc0583bcec 2110 /**
rosarium 0:2ddc0583bcec 2111 * @brief Sets the AFC peak detector leakage.
rosarium 0:2ddc0583bcec 2112 * @param cLeakage the peak detector leakage. This parameter shall be in the range:
rosarium 0:2ddc0583bcec 2113 * [0:31].
rosarium 0:2ddc0583bcec 2114 * @retval None.
rosarium 0:2ddc0583bcec 2115 */
rosarium 0:2ddc0583bcec 2116 void SpiritRadioSetAFCPDLeakage(uint8_t cLeakage)
rosarium 0:2ddc0583bcec 2117 {
rosarium 0:2ddc0583bcec 2118 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2119
rosarium 0:2ddc0583bcec 2120 /* Check the parameters */
rosarium 0:2ddc0583bcec 2121 s_assert_param(IS_AFC_PD_LEAKAGE(cLeakage));
rosarium 0:2ddc0583bcec 2122
rosarium 0:2ddc0583bcec 2123 /* Reads the AFC_2 register and configure the AFC PD leakage field */
rosarium 0:2ddc0583bcec 2124 SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2125 tempRegValue &= 0xE0;
rosarium 0:2ddc0583bcec 2126 tempRegValue |= cLeakage;
rosarium 0:2ddc0583bcec 2127
rosarium 0:2ddc0583bcec 2128 /* Sets the AFC_2 register */
rosarium 0:2ddc0583bcec 2129 g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2130
rosarium 0:2ddc0583bcec 2131 }
rosarium 0:2ddc0583bcec 2132
rosarium 0:2ddc0583bcec 2133
rosarium 0:2ddc0583bcec 2134 /**
rosarium 0:2ddc0583bcec 2135 * @brief Returns the AFC peak detector leakage.
rosarium 0:2ddc0583bcec 2136 * @param None.
rosarium 0:2ddc0583bcec 2137 * @retval uint8_t Peak detector leakage value. This parameter will be in the range:
rosarium 0:2ddc0583bcec 2138 * [0:31].
rosarium 0:2ddc0583bcec 2139 */
rosarium 0:2ddc0583bcec 2140 uint8_t SpiritRadioGetAFCPDLeakage(void)
rosarium 0:2ddc0583bcec 2141 {
rosarium 0:2ddc0583bcec 2142 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2143
rosarium 0:2ddc0583bcec 2144 /* Reads the AFC_2 register */
rosarium 0:2ddc0583bcec 2145 g_xStatus = SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2146
rosarium 0:2ddc0583bcec 2147 /* Mask the AFC PD leakage field and return the value */
rosarium 0:2ddc0583bcec 2148 return (tempRegValue & 0x1F);
rosarium 0:2ddc0583bcec 2149
rosarium 0:2ddc0583bcec 2150 }
rosarium 0:2ddc0583bcec 2151
rosarium 0:2ddc0583bcec 2152
rosarium 0:2ddc0583bcec 2153 /**
rosarium 0:2ddc0583bcec 2154 * @brief Sets the length of the AFC fast period expressed as number of samples.
rosarium 0:2ddc0583bcec 2155 * @param cLength length of the fast period in number of samples.
rosarium 0:2ddc0583bcec 2156 * @retval None.
rosarium 0:2ddc0583bcec 2157 */
rosarium 0:2ddc0583bcec 2158 void SpiritRadioSetAFCFastPeriod(uint8_t cLength)
rosarium 0:2ddc0583bcec 2159 {
rosarium 0:2ddc0583bcec 2160 /* Sets the AFC_1 register */
rosarium 0:2ddc0583bcec 2161 g_xStatus = SpiritSpiWriteRegisters(AFC1_BASE, 1, &cLength);
rosarium 0:2ddc0583bcec 2162
rosarium 0:2ddc0583bcec 2163 }
rosarium 0:2ddc0583bcec 2164
rosarium 0:2ddc0583bcec 2165
rosarium 0:2ddc0583bcec 2166 /**
rosarium 0:2ddc0583bcec 2167 * @brief Returns the AFC fast period expressed as number of samples.
rosarium 0:2ddc0583bcec 2168 * @param None.
rosarium 0:2ddc0583bcec 2169 * @retval uint8_t Length of the fast period in number of samples.
rosarium 0:2ddc0583bcec 2170 */
rosarium 0:2ddc0583bcec 2171 uint8_t SpiritRadioGetAFCFastPeriod(void)
rosarium 0:2ddc0583bcec 2172 {
rosarium 0:2ddc0583bcec 2173 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2174
rosarium 0:2ddc0583bcec 2175 /* Reads the AFC 1 register and return the value */
rosarium 0:2ddc0583bcec 2176 g_xStatus = SpiritSpiReadRegisters(AFC1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2177
rosarium 0:2ddc0583bcec 2178 return tempRegValue;
rosarium 0:2ddc0583bcec 2179
rosarium 0:2ddc0583bcec 2180 }
rosarium 0:2ddc0583bcec 2181
rosarium 0:2ddc0583bcec 2182
rosarium 0:2ddc0583bcec 2183 /**
rosarium 0:2ddc0583bcec 2184 * @brief Sets the AFC loop gain in fast mode.
rosarium 0:2ddc0583bcec 2185 * @param cGain AFC loop gain in fast mode. This parameter shall be in the range:
rosarium 0:2ddc0583bcec 2186 * [0:15].
rosarium 0:2ddc0583bcec 2187 * @retval None.
rosarium 0:2ddc0583bcec 2188 */
rosarium 0:2ddc0583bcec 2189 void SpiritRadioSetAFCFastGain(uint8_t cGain)
rosarium 0:2ddc0583bcec 2190 {
rosarium 0:2ddc0583bcec 2191 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2192
rosarium 0:2ddc0583bcec 2193 /* Check the parameters */
rosarium 0:2ddc0583bcec 2194 s_assert_param(IS_AFC_FAST_GAIN(cGain));
rosarium 0:2ddc0583bcec 2195
rosarium 0:2ddc0583bcec 2196 /* Reads the AFC_0 register and configure the AFC Fast Gain field */
rosarium 0:2ddc0583bcec 2197 SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2198 tempRegValue &= 0x0F;
rosarium 0:2ddc0583bcec 2199 tempRegValue |= cGain<<4;
rosarium 0:2ddc0583bcec 2200
rosarium 0:2ddc0583bcec 2201 /* Sets the AFC_0 register */
rosarium 0:2ddc0583bcec 2202 g_xStatus = SpiritSpiWriteRegisters(AFC0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2203
rosarium 0:2ddc0583bcec 2204 }
rosarium 0:2ddc0583bcec 2205
rosarium 0:2ddc0583bcec 2206
rosarium 0:2ddc0583bcec 2207 /**
rosarium 0:2ddc0583bcec 2208 * @brief Returns the AFC loop gain in fast mode.
rosarium 0:2ddc0583bcec 2209 * @param None.
rosarium 0:2ddc0583bcec 2210 * @retval uint8_t AFC loop gain in fast mode. This parameter will be in the range:
rosarium 0:2ddc0583bcec 2211 * [0:15].
rosarium 0:2ddc0583bcec 2212 */
rosarium 0:2ddc0583bcec 2213 uint8_t SpiritRadioGetAFCFastGain(void)
rosarium 0:2ddc0583bcec 2214 {
rosarium 0:2ddc0583bcec 2215 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2216
rosarium 0:2ddc0583bcec 2217 /* Reads the AFC_0 register, mask the AFC Fast Gain field and return the value */
rosarium 0:2ddc0583bcec 2218 g_xStatus = SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2219
rosarium 0:2ddc0583bcec 2220 return ((tempRegValue & 0xF0)>>4);
rosarium 0:2ddc0583bcec 2221
rosarium 0:2ddc0583bcec 2222 }
rosarium 0:2ddc0583bcec 2223
rosarium 0:2ddc0583bcec 2224
rosarium 0:2ddc0583bcec 2225 /**
rosarium 0:2ddc0583bcec 2226 * @brief Sets the AFC loop gain in slow mode.
rosarium 0:2ddc0583bcec 2227 * @param cGain AFC loop gain in slow mode. This parameter shall be in the range:
rosarium 0:2ddc0583bcec 2228 * [0:15].
rosarium 0:2ddc0583bcec 2229 * @retval None.
rosarium 0:2ddc0583bcec 2230 */
rosarium 0:2ddc0583bcec 2231 void SpiritRadioSetAFCSlowGain(uint8_t cGain)
rosarium 0:2ddc0583bcec 2232 {
rosarium 0:2ddc0583bcec 2233 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2234
rosarium 0:2ddc0583bcec 2235 /* Check the parameters */
rosarium 0:2ddc0583bcec 2236 s_assert_param(IS_AFC_SLOW_GAIN(cGain));
rosarium 0:2ddc0583bcec 2237
rosarium 0:2ddc0583bcec 2238 /* Reads the AFC_0 register and configure the AFC Slow Gain field */
rosarium 0:2ddc0583bcec 2239 SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2240 tempRegValue &= 0xF0;
rosarium 0:2ddc0583bcec 2241 tempRegValue |= cGain;
rosarium 0:2ddc0583bcec 2242
rosarium 0:2ddc0583bcec 2243 /* Sets the AFC_0 register */
rosarium 0:2ddc0583bcec 2244 g_xStatus = SpiritSpiWriteRegisters(AFC0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2245
rosarium 0:2ddc0583bcec 2246 }
rosarium 0:2ddc0583bcec 2247
rosarium 0:2ddc0583bcec 2248
rosarium 0:2ddc0583bcec 2249 /**
rosarium 0:2ddc0583bcec 2250 * @brief Returns the AFC loop gain in slow mode.
rosarium 0:2ddc0583bcec 2251 * @param None.
rosarium 0:2ddc0583bcec 2252 * @retval uint8_t AFC loop gain in slow mode. This parameter will be in the range:
rosarium 0:2ddc0583bcec 2253 * [0:15].
rosarium 0:2ddc0583bcec 2254 */
rosarium 0:2ddc0583bcec 2255 uint8_t SpiritRadioGetAFCSlowGain(void)
rosarium 0:2ddc0583bcec 2256 {
rosarium 0:2ddc0583bcec 2257 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2258
rosarium 0:2ddc0583bcec 2259 /* Reads the AFC_0 register, mask the AFC Slow Gain field and return the value */
rosarium 0:2ddc0583bcec 2260 g_xStatus = SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2261
rosarium 0:2ddc0583bcec 2262 return (tempRegValue & 0x0F);
rosarium 0:2ddc0583bcec 2263
rosarium 0:2ddc0583bcec 2264 }
rosarium 0:2ddc0583bcec 2265
rosarium 0:2ddc0583bcec 2266
rosarium 0:2ddc0583bcec 2267 /**
rosarium 0:2ddc0583bcec 2268 * @brief Returns the AFC correction from the corresponding register.
rosarium 0:2ddc0583bcec 2269 * @param None.
rosarium 0:2ddc0583bcec 2270 * @retval int8_t AFC correction, read from the corresponding register.
rosarium 0:2ddc0583bcec 2271 * This parameter will be in the range [-128:127].
rosarium 0:2ddc0583bcec 2272 */
rosarium 0:2ddc0583bcec 2273 int8_t SpiritRadioGetAFCCorrectionReg(void)
rosarium 0:2ddc0583bcec 2274 {
rosarium 0:2ddc0583bcec 2275 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2276
rosarium 0:2ddc0583bcec 2277 /* Reads the AFC_CORR register, cast the read value as signed char and return it */
rosarium 0:2ddc0583bcec 2278 g_xStatus = SpiritSpiReadRegisters(AFC_CORR_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2279
rosarium 0:2ddc0583bcec 2280 return (int8_t)tempRegValue;
rosarium 0:2ddc0583bcec 2281
rosarium 0:2ddc0583bcec 2282 }
rosarium 0:2ddc0583bcec 2283
rosarium 0:2ddc0583bcec 2284
rosarium 0:2ddc0583bcec 2285 /**
rosarium 0:2ddc0583bcec 2286 * @brief Returns the AFC correction expressed in Hz.
rosarium 0:2ddc0583bcec 2287 * @param None.
rosarium 0:2ddc0583bcec 2288 * @retval int32_t AFC correction expressed in Hz
rosarium 0:2ddc0583bcec 2289 * according to the following formula:<ul>
rosarium 0:2ddc0583bcec 2290 * <li> Fafc[Hz]= (Fdig/(12*2^10))*AFC_CORR where </li>
rosarium 0:2ddc0583bcec 2291 * <li> AFC_CORR is the value read in the AFC_CORR register </li> </ul>
rosarium 0:2ddc0583bcec 2292 */
rosarium 0:2ddc0583bcec 2293 int32_t SpiritRadioGetAFCCorrectionHz(void)
rosarium 0:2ddc0583bcec 2294 {
rosarium 0:2ddc0583bcec 2295 int8_t correction;
rosarium 0:2ddc0583bcec 2296 uint32_t xtal = s_lXtalFrequency;
rosarium 0:2ddc0583bcec 2297
rosarium 0:2ddc0583bcec 2298 /* Reads the AFC correction register */
rosarium 0:2ddc0583bcec 2299 correction = SpiritRadioGetAFCCorrectionReg();
rosarium 0:2ddc0583bcec 2300
rosarium 0:2ddc0583bcec 2301 if(xtal>DOUBLE_XTAL_THR)
rosarium 0:2ddc0583bcec 2302 {
rosarium 0:2ddc0583bcec 2303 xtal /= 2;
rosarium 0:2ddc0583bcec 2304 }
rosarium 0:2ddc0583bcec 2305
rosarium 0:2ddc0583bcec 2306 /* Calculates and return the Frequency Correction */
rosarium 0:2ddc0583bcec 2307 return (int32_t)(xtal/(12*pow(2,10))*correction);
rosarium 0:2ddc0583bcec 2308
rosarium 0:2ddc0583bcec 2309 }
rosarium 0:2ddc0583bcec 2310
rosarium 0:2ddc0583bcec 2311
rosarium 0:2ddc0583bcec 2312 /**
rosarium 0:2ddc0583bcec 2313 * @brief Enables or Disables the AGC.
rosarium 0:2ddc0583bcec 2314 * @param xNewState new state for AGC.
rosarium 0:2ddc0583bcec 2315 * This parameter can be: S_ENABLE or S_DISABLE
rosarium 0:2ddc0583bcec 2316 * @retval None.
rosarium 0:2ddc0583bcec 2317 */
rosarium 0:2ddc0583bcec 2318 void SpiritRadioAGC(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2319 {
rosarium 0:2ddc0583bcec 2320 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2321
rosarium 0:2ddc0583bcec 2322 /* Check the parameters */
rosarium 0:2ddc0583bcec 2323 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2324
rosarium 0:2ddc0583bcec 2325 /* Reads the AGCCTRL_0 register and configure the AGC Enabled field */
rosarium 0:2ddc0583bcec 2326 SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2327 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2328 {
rosarium 0:2ddc0583bcec 2329 tempRegValue |= AGCCTRL0_AGC_MASK;
rosarium 0:2ddc0583bcec 2330 }
rosarium 0:2ddc0583bcec 2331 else
rosarium 0:2ddc0583bcec 2332 {
rosarium 0:2ddc0583bcec 2333 tempRegValue &= (~AGCCTRL0_AGC_MASK);
rosarium 0:2ddc0583bcec 2334 }
rosarium 0:2ddc0583bcec 2335
rosarium 0:2ddc0583bcec 2336 /* Sets the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2337 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2338
rosarium 0:2ddc0583bcec 2339 }
rosarium 0:2ddc0583bcec 2340
rosarium 0:2ddc0583bcec 2341
rosarium 0:2ddc0583bcec 2342 /**
rosarium 0:2ddc0583bcec 2343 * @brief Sets the AGC working mode.
rosarium 0:2ddc0583bcec 2344 * @param xMode the AGC mode. This parameter can be one of the values defined in @ref AGCMode :
rosarium 0:2ddc0583bcec 2345 * @arg AGC_LINEAR_MODE AGC works in linear mode
rosarium 0:2ddc0583bcec 2346 * @arg AGC_BINARY_MODE AGC works in binary mode
rosarium 0:2ddc0583bcec 2347 * @retval None.
rosarium 0:2ddc0583bcec 2348 */
rosarium 0:2ddc0583bcec 2349 void SpiritRadioSetAGCMode(AGCMode xMode)
rosarium 0:2ddc0583bcec 2350 {
rosarium 0:2ddc0583bcec 2351 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2352
rosarium 0:2ddc0583bcec 2353 /* Check the parameters */
rosarium 0:2ddc0583bcec 2354 s_assert_param(IS_AGC_MODE(xMode));
rosarium 0:2ddc0583bcec 2355
rosarium 0:2ddc0583bcec 2356 /* Reads the AGCCTRL_0 register and configure the AGC Mode field */
rosarium 0:2ddc0583bcec 2357 SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2358 if(xMode == AGC_BINARY_MODE)
rosarium 0:2ddc0583bcec 2359 {
rosarium 0:2ddc0583bcec 2360 tempRegValue |= AGC_BINARY_MODE;
rosarium 0:2ddc0583bcec 2361 }
rosarium 0:2ddc0583bcec 2362 else
rosarium 0:2ddc0583bcec 2363 {
rosarium 0:2ddc0583bcec 2364 tempRegValue &= (~AGC_BINARY_MODE);
rosarium 0:2ddc0583bcec 2365 }
rosarium 0:2ddc0583bcec 2366
rosarium 0:2ddc0583bcec 2367 /* Sets the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2368 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2369
rosarium 0:2ddc0583bcec 2370 }
rosarium 0:2ddc0583bcec 2371
rosarium 0:2ddc0583bcec 2372
rosarium 0:2ddc0583bcec 2373 /**
rosarium 0:2ddc0583bcec 2374 * @brief Returns the AGC working mode.
rosarium 0:2ddc0583bcec 2375 * @param None.
rosarium 0:2ddc0583bcec 2376 * @retval AGCMode Settled AGC mode. This parameter can be one of the values defined in @ref AGCMode :
rosarium 0:2ddc0583bcec 2377 * @arg AGC_LINEAR_MODE AGC works in linear mode
rosarium 0:2ddc0583bcec 2378 * @arg AGC_BINARY_MODE AGC works in binary mode
rosarium 0:2ddc0583bcec 2379 */
rosarium 0:2ddc0583bcec 2380 AGCMode SpiritRadioGetAGCMode(void)
rosarium 0:2ddc0583bcec 2381 {
rosarium 0:2ddc0583bcec 2382 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2383
rosarium 0:2ddc0583bcec 2384 /* Reads the AGCCTRL_0 register, mask the AGC Mode field and return the value */
rosarium 0:2ddc0583bcec 2385 g_xStatus = SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2386
rosarium 0:2ddc0583bcec 2387 return (AGCMode)(tempRegValue & 0x40);
rosarium 0:2ddc0583bcec 2388
rosarium 0:2ddc0583bcec 2389 }
rosarium 0:2ddc0583bcec 2390
rosarium 0:2ddc0583bcec 2391
rosarium 0:2ddc0583bcec 2392 /**
rosarium 0:2ddc0583bcec 2393 * @brief Enables or Disables the AGC freeze on steady state.
rosarium 0:2ddc0583bcec 2394 * @param xNewState new state for AGC freeze on steady state.
rosarium 0:2ddc0583bcec 2395 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 2396 * @retval None.
rosarium 0:2ddc0583bcec 2397 */
rosarium 0:2ddc0583bcec 2398 void SpiritRadioAGCFreezeOnSteady(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2399 {
rosarium 0:2ddc0583bcec 2400 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2401
rosarium 0:2ddc0583bcec 2402 /* Check the parameters */
rosarium 0:2ddc0583bcec 2403 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2404
rosarium 0:2ddc0583bcec 2405 /* Reads the AGCCTRL_2 register and configure the AGC Freeze On Steady field */
rosarium 0:2ddc0583bcec 2406 SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2407 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2408 {
rosarium 0:2ddc0583bcec 2409 tempRegValue |= AGCCTRL2_FREEZE_ON_STEADY_MASK;
rosarium 0:2ddc0583bcec 2410 }
rosarium 0:2ddc0583bcec 2411 else
rosarium 0:2ddc0583bcec 2412 {
rosarium 0:2ddc0583bcec 2413 tempRegValue &= (~AGCCTRL2_FREEZE_ON_STEADY_MASK);
rosarium 0:2ddc0583bcec 2414 }
rosarium 0:2ddc0583bcec 2415
rosarium 0:2ddc0583bcec 2416 /* Sets the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2417 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2418
rosarium 0:2ddc0583bcec 2419 }
rosarium 0:2ddc0583bcec 2420
rosarium 0:2ddc0583bcec 2421
rosarium 0:2ddc0583bcec 2422 /**
rosarium 0:2ddc0583bcec 2423 * @brief Enable or Disable the AGC freeze on sync detection.
rosarium 0:2ddc0583bcec 2424 * @param xNewState new state for AGC freeze on sync detection.
rosarium 0:2ddc0583bcec 2425 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 2426 * @retval None.
rosarium 0:2ddc0583bcec 2427 */
rosarium 0:2ddc0583bcec 2428 void SpiritRadioAGCFreezeOnSync(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2429 {
rosarium 0:2ddc0583bcec 2430 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2431
rosarium 0:2ddc0583bcec 2432 /* Check the parameters */
rosarium 0:2ddc0583bcec 2433 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2434
rosarium 0:2ddc0583bcec 2435 /* Reads the AGCCTRL_2 register and configure the AGC Freeze On Sync field */
rosarium 0:2ddc0583bcec 2436 SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2437 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2438 {
rosarium 0:2ddc0583bcec 2439 tempRegValue |= AGCCTRL2_FREEZE_ON_SYNC_MASK;
rosarium 0:2ddc0583bcec 2440 }
rosarium 0:2ddc0583bcec 2441 else
rosarium 0:2ddc0583bcec 2442 {
rosarium 0:2ddc0583bcec 2443 tempRegValue &= (~AGCCTRL2_FREEZE_ON_SYNC_MASK);
rosarium 0:2ddc0583bcec 2444 }
rosarium 0:2ddc0583bcec 2445
rosarium 0:2ddc0583bcec 2446 /* Sets the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2447 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2448
rosarium 0:2ddc0583bcec 2449 }
rosarium 0:2ddc0583bcec 2450
rosarium 0:2ddc0583bcec 2451
rosarium 0:2ddc0583bcec 2452 /**
rosarium 0:2ddc0583bcec 2453 * @brief Enable or Disable the AGC to start with max attenuation.
rosarium 0:2ddc0583bcec 2454 * @param xNewState new state for AGC start with max attenuation mode.
rosarium 0:2ddc0583bcec 2455 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 2456 * @retval None.
rosarium 0:2ddc0583bcec 2457 */
rosarium 0:2ddc0583bcec 2458 void SpiritRadioAGCStartMaxAttenuation(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2459 {
rosarium 0:2ddc0583bcec 2460 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 2461
rosarium 0:2ddc0583bcec 2462 /* Check the parameters */
rosarium 0:2ddc0583bcec 2463 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2464
rosarium 0:2ddc0583bcec 2465 /* Reads the AGCCTRL_2 register and configure the AGC Start Max Attenuation field */
rosarium 0:2ddc0583bcec 2466 SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2467 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2468 {
rosarium 0:2ddc0583bcec 2469 tempRegValue |= AGCCTRL2_START_MAX_ATTENUATION_MASK;
rosarium 0:2ddc0583bcec 2470 }
rosarium 0:2ddc0583bcec 2471 else
rosarium 0:2ddc0583bcec 2472 {
rosarium 0:2ddc0583bcec 2473 tempRegValue &= (~AGCCTRL2_START_MAX_ATTENUATION_MASK);
rosarium 0:2ddc0583bcec 2474 }
rosarium 0:2ddc0583bcec 2475
rosarium 0:2ddc0583bcec 2476 /* Sets the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2477 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2478
rosarium 0:2ddc0583bcec 2479 }
rosarium 0:2ddc0583bcec 2480
rosarium 0:2ddc0583bcec 2481
rosarium 0:2ddc0583bcec 2482 /**
rosarium 0:2ddc0583bcec 2483 * @brief Sets the AGC measure time.
rosarium 0:2ddc0583bcec 2484 * @param nTime AGC measure time expressed in us. This parameter shall be in the range [0, 393216/F_Xo].
rosarium 0:2ddc0583bcec 2485 * @retval None.
rosarium 0:2ddc0583bcec 2486 */
rosarium 0:2ddc0583bcec 2487 void SpiritRadioSetAGCMeasureTimeUs(uint16_t nTime)
rosarium 0:2ddc0583bcec 2488 {
rosarium 0:2ddc0583bcec 2489 uint8_t tempRegValue, measure;
rosarium 0:2ddc0583bcec 2490
rosarium 0:2ddc0583bcec 2491 /* Check the parameter */
rosarium 0:2ddc0583bcec 2492 s_assert_param(IS_AGC_MEASURE_TIME_US(nTime,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 2493
rosarium 0:2ddc0583bcec 2494 /* Reads the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2495 SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2496
rosarium 0:2ddc0583bcec 2497 /* Calculates the measure time value to write in the register */
rosarium 0:2ddc0583bcec 2498 measure = (uint8_t)lroundf(log2((float)nTime/1e6 * s_lXtalFrequency/12));
rosarium 0:2ddc0583bcec 2499 (measure>15) ? (measure=15):(measure);
rosarium 0:2ddc0583bcec 2500
rosarium 0:2ddc0583bcec 2501 /* Mask the MEAS_TIME field and write the new value */
rosarium 0:2ddc0583bcec 2502 tempRegValue &= 0xF0;
rosarium 0:2ddc0583bcec 2503 tempRegValue |= measure;
rosarium 0:2ddc0583bcec 2504
rosarium 0:2ddc0583bcec 2505 /* Sets the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2506 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2507
rosarium 0:2ddc0583bcec 2508 }
rosarium 0:2ddc0583bcec 2509
rosarium 0:2ddc0583bcec 2510
rosarium 0:2ddc0583bcec 2511 /**
rosarium 0:2ddc0583bcec 2512 * @brief Returns the AGC measure time.
rosarium 0:2ddc0583bcec 2513 * @param None.
rosarium 0:2ddc0583bcec 2514 * @retval uint16_t AGC measure time expressed in us. This parameter will be in the range [0, 393216/F_Xo].
rosarium 0:2ddc0583bcec 2515 */
rosarium 0:2ddc0583bcec 2516 uint16_t SpiritRadioGetAGCMeasureTimeUs(void)
rosarium 0:2ddc0583bcec 2517 {
rosarium 0:2ddc0583bcec 2518 uint8_t measure;
rosarium 0:2ddc0583bcec 2519
rosarium 0:2ddc0583bcec 2520 /* Reads the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2521 g_xStatus = SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &measure);
rosarium 0:2ddc0583bcec 2522
rosarium 0:2ddc0583bcec 2523 /* Mask the MEAS_TIME field */
rosarium 0:2ddc0583bcec 2524 measure &= 0x0F;
rosarium 0:2ddc0583bcec 2525
rosarium 0:2ddc0583bcec 2526 /* Calculates the measure time value to write in the register */
rosarium 0:2ddc0583bcec 2527 return (uint16_t)((12.0/s_lXtalFrequency)*(float)pow(2,measure)*1e6);
rosarium 0:2ddc0583bcec 2528
rosarium 0:2ddc0583bcec 2529 }
rosarium 0:2ddc0583bcec 2530
rosarium 0:2ddc0583bcec 2531
rosarium 0:2ddc0583bcec 2532 /**
rosarium 0:2ddc0583bcec 2533 * @brief Sets the AGC measure time.
rosarium 0:2ddc0583bcec 2534 * @param cTime AGC measure time to write in the MEAS_TIME field of AGCCTRL_2 register.
rosarium 0:2ddc0583bcec 2535 * This parameter shall be in the range [0:15].
rosarium 0:2ddc0583bcec 2536 * @retval None.
rosarium 0:2ddc0583bcec 2537 */
rosarium 0:2ddc0583bcec 2538 void SpiritRadioSetAGCMeasureTime(uint8_t cTime)
rosarium 0:2ddc0583bcec 2539 {
rosarium 0:2ddc0583bcec 2540 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2541
rosarium 0:2ddc0583bcec 2542 /* Check the parameter */
rosarium 0:2ddc0583bcec 2543 s_assert_param(IS_AGC_MEASURE_TIME(cTime));
rosarium 0:2ddc0583bcec 2544
rosarium 0:2ddc0583bcec 2545 /* Reads the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2546 SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2547
rosarium 0:2ddc0583bcec 2548 /* Mask the MEAS_TIME field and write the new value */
rosarium 0:2ddc0583bcec 2549 tempRegValue &= 0xF0;
rosarium 0:2ddc0583bcec 2550 tempRegValue |= cTime;
rosarium 0:2ddc0583bcec 2551
rosarium 0:2ddc0583bcec 2552 /* Sets the AGCCTRL_2 register */
rosarium 0:2ddc0583bcec 2553 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2554
rosarium 0:2ddc0583bcec 2555 }
rosarium 0:2ddc0583bcec 2556
rosarium 0:2ddc0583bcec 2557
rosarium 0:2ddc0583bcec 2558 /**
rosarium 0:2ddc0583bcec 2559 * @brief Returns the AGC measure time.
rosarium 0:2ddc0583bcec 2560 * @param None.
rosarium 0:2ddc0583bcec 2561 * @retval uint8_t AGC measure time read from the MEAS_TIME field of AGCCTRL_2 register.
rosarium 0:2ddc0583bcec 2562 * This parameter will be in the range [0:15].
rosarium 0:2ddc0583bcec 2563 */
rosarium 0:2ddc0583bcec 2564 uint8_t SpiritRadioGetAGCMeasureTime(void)
rosarium 0:2ddc0583bcec 2565 {
rosarium 0:2ddc0583bcec 2566 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2567
rosarium 0:2ddc0583bcec 2568 /* Reads the AGCCTRL_2 register, mask the MEAS_TIME field and return the value */
rosarium 0:2ddc0583bcec 2569 g_xStatus = SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2570
rosarium 0:2ddc0583bcec 2571 return (tempRegValue & 0x0F);
rosarium 0:2ddc0583bcec 2572
rosarium 0:2ddc0583bcec 2573 }
rosarium 0:2ddc0583bcec 2574
rosarium 0:2ddc0583bcec 2575
rosarium 0:2ddc0583bcec 2576 /**
rosarium 0:2ddc0583bcec 2577 * @brief Sets the AGC hold time.
rosarium 0:2ddc0583bcec 2578 * @param cTime AGC hold time expressed in us. This parameter shall be in the range[0, 756/F_Xo].
rosarium 0:2ddc0583bcec 2579 * @retval None.
rosarium 0:2ddc0583bcec 2580 */
rosarium 0:2ddc0583bcec 2581 void SpiritRadioSetAGCHoldTimeUs(uint8_t cTime)
rosarium 0:2ddc0583bcec 2582 {
rosarium 0:2ddc0583bcec 2583 uint8_t tempRegValue, hold;
rosarium 0:2ddc0583bcec 2584
rosarium 0:2ddc0583bcec 2585 /* Check the parameter */
rosarium 0:2ddc0583bcec 2586 s_assert_param(IS_AGC_HOLD_TIME_US(cTime,s_lXtalFrequency));
rosarium 0:2ddc0583bcec 2587
rosarium 0:2ddc0583bcec 2588 /* Reads the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2589 SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2590
rosarium 0:2ddc0583bcec 2591 /* Calculates the hold time value to write in the register */
rosarium 0:2ddc0583bcec 2592 hold = (uint8_t)lroundf(((float)cTime/1e6 * s_lXtalFrequency)/12);
rosarium 0:2ddc0583bcec 2593 (hold>63) ? (hold=63):(hold);
rosarium 0:2ddc0583bcec 2594
rosarium 0:2ddc0583bcec 2595 /* Mask the HOLD_TIME field and write the new value */
rosarium 0:2ddc0583bcec 2596 tempRegValue &= 0xC0;
rosarium 0:2ddc0583bcec 2597 tempRegValue |= hold;
rosarium 0:2ddc0583bcec 2598
rosarium 0:2ddc0583bcec 2599 /* Sets the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2600 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2601
rosarium 0:2ddc0583bcec 2602 }
rosarium 0:2ddc0583bcec 2603
rosarium 0:2ddc0583bcec 2604
rosarium 0:2ddc0583bcec 2605 /**
rosarium 0:2ddc0583bcec 2606 * @brief Returns the AGC hold time.
rosarium 0:2ddc0583bcec 2607 * @param None.
rosarium 0:2ddc0583bcec 2608 * @retval uint8_t AGC hold time expressed in us. This parameter will be in the range:
rosarium 0:2ddc0583bcec 2609 * [0, 756/F_Xo].
rosarium 0:2ddc0583bcec 2610 */
rosarium 0:2ddc0583bcec 2611 uint8_t SpiritRadioGetAGCHoldTimeUs(void)
rosarium 0:2ddc0583bcec 2612 {
rosarium 0:2ddc0583bcec 2613 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2614
rosarium 0:2ddc0583bcec 2615 /* Reads the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2616 g_xStatus = SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2617
rosarium 0:2ddc0583bcec 2618 /* Mask the HOLD_TIME field */
rosarium 0:2ddc0583bcec 2619 tempRegValue &= 0x3F;
rosarium 0:2ddc0583bcec 2620
rosarium 0:2ddc0583bcec 2621 /* Calculates the hold time value and return it */
rosarium 0:2ddc0583bcec 2622 return (uint8_t)lroundf ((12.0/s_lXtalFrequency)*(tempRegValue*1e6));
rosarium 0:2ddc0583bcec 2623
rosarium 0:2ddc0583bcec 2624 }
rosarium 0:2ddc0583bcec 2625
rosarium 0:2ddc0583bcec 2626
rosarium 0:2ddc0583bcec 2627 /**
rosarium 0:2ddc0583bcec 2628 * @brief Sets the AGC hold time.
rosarium 0:2ddc0583bcec 2629 * @param cTime AGC hold time to write in the HOLD_TIME field of AGCCTRL_0 register.
rosarium 0:2ddc0583bcec 2630 * This parameter shall be in the range [0:63].
rosarium 0:2ddc0583bcec 2631 * @retval None.
rosarium 0:2ddc0583bcec 2632 */
rosarium 0:2ddc0583bcec 2633 void SpiritRadioSetAGCHoldTime(uint8_t cTime)
rosarium 0:2ddc0583bcec 2634 {
rosarium 0:2ddc0583bcec 2635 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2636
rosarium 0:2ddc0583bcec 2637 /* Check the parameter */
rosarium 0:2ddc0583bcec 2638 s_assert_param(IS_AGC_HOLD_TIME(cTime));
rosarium 0:2ddc0583bcec 2639
rosarium 0:2ddc0583bcec 2640 /* Reads the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2641 SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2642
rosarium 0:2ddc0583bcec 2643 /* Mask the HOLD_TIME field and write the new value */
rosarium 0:2ddc0583bcec 2644 tempRegValue &= 0xC0;
rosarium 0:2ddc0583bcec 2645 tempRegValue |= cTime;
rosarium 0:2ddc0583bcec 2646
rosarium 0:2ddc0583bcec 2647 /* Sets the AGCCTRL_0 register */
rosarium 0:2ddc0583bcec 2648 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2649
rosarium 0:2ddc0583bcec 2650 }
rosarium 0:2ddc0583bcec 2651
rosarium 0:2ddc0583bcec 2652
rosarium 0:2ddc0583bcec 2653 /**
rosarium 0:2ddc0583bcec 2654 * @brief Returns the AGC hold time.
rosarium 0:2ddc0583bcec 2655 * @param None.
rosarium 0:2ddc0583bcec 2656 * @retval uint8_t AGC hold time read from the HOLD_TIME field of AGCCTRL_0 register.
rosarium 0:2ddc0583bcec 2657 * This parameter will be in the range [0:63].
rosarium 0:2ddc0583bcec 2658 */
rosarium 0:2ddc0583bcec 2659 uint8_t SpiritRadioGetAGCHoldTime(void)
rosarium 0:2ddc0583bcec 2660 {
rosarium 0:2ddc0583bcec 2661 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2662
rosarium 0:2ddc0583bcec 2663 /* Reads the AGCCTRL_0 register, mask the MEAS_TIME field and return the value */
rosarium 0:2ddc0583bcec 2664 g_xStatus = SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2665
rosarium 0:2ddc0583bcec 2666 return (tempRegValue & 0x3F);
rosarium 0:2ddc0583bcec 2667
rosarium 0:2ddc0583bcec 2668 }
rosarium 0:2ddc0583bcec 2669
rosarium 0:2ddc0583bcec 2670
rosarium 0:2ddc0583bcec 2671 /**
rosarium 0:2ddc0583bcec 2672 * @brief Sets the AGC high threshold.
rosarium 0:2ddc0583bcec 2673 * @param cHighThreshold AGC high threshold to write in the THRESHOLD_HIGH field of AGCCTRL_1 register.
rosarium 0:2ddc0583bcec 2674 * This parameter shall be in the range [0:15].
rosarium 0:2ddc0583bcec 2675 * @retval None.
rosarium 0:2ddc0583bcec 2676 */
rosarium 0:2ddc0583bcec 2677 void SpiritRadioSetAGCHighThreshold(uint8_t cHighThreshold)
rosarium 0:2ddc0583bcec 2678 {
rosarium 0:2ddc0583bcec 2679 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2680
rosarium 0:2ddc0583bcec 2681 /* Check the parameter */
rosarium 0:2ddc0583bcec 2682 s_assert_param(IS_AGC_THRESHOLD(cHighThreshold));
rosarium 0:2ddc0583bcec 2683
rosarium 0:2ddc0583bcec 2684 /* Reads the AGCCTRL_1 register */
rosarium 0:2ddc0583bcec 2685 SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2686
rosarium 0:2ddc0583bcec 2687 /* Mask the THRESHOLD_HIGH field and write the new value */
rosarium 0:2ddc0583bcec 2688 tempRegValue &= 0x0F;
rosarium 0:2ddc0583bcec 2689 tempRegValue |= cHighThreshold<<4;
rosarium 0:2ddc0583bcec 2690
rosarium 0:2ddc0583bcec 2691 /* Sets the AGCCTRL_1 register */
rosarium 0:2ddc0583bcec 2692 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2693
rosarium 0:2ddc0583bcec 2694 }
rosarium 0:2ddc0583bcec 2695
rosarium 0:2ddc0583bcec 2696
rosarium 0:2ddc0583bcec 2697 /**
rosarium 0:2ddc0583bcec 2698 * @brief Returns the AGC high threshold.
rosarium 0:2ddc0583bcec 2699 * @param None.
rosarium 0:2ddc0583bcec 2700 * @retval uint8_t AGC high threshold read from the THRESHOLD_HIGH field of AGCCTRL_1 register.
rosarium 0:2ddc0583bcec 2701 * This parameter will be in the range [0:15].
rosarium 0:2ddc0583bcec 2702 */
rosarium 0:2ddc0583bcec 2703 uint8_t SpiritRadioGetAGCHighThreshold(void)
rosarium 0:2ddc0583bcec 2704 {
rosarium 0:2ddc0583bcec 2705 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2706
rosarium 0:2ddc0583bcec 2707 /* Reads the AGCCTRL_1 register, mask the THRESHOLD_HIGH field and return the value */
rosarium 0:2ddc0583bcec 2708 g_xStatus = SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2709
rosarium 0:2ddc0583bcec 2710 return ((tempRegValue & 0xF0)>>4);
rosarium 0:2ddc0583bcec 2711
rosarium 0:2ddc0583bcec 2712 }
rosarium 0:2ddc0583bcec 2713
rosarium 0:2ddc0583bcec 2714
rosarium 0:2ddc0583bcec 2715 /**
rosarium 0:2ddc0583bcec 2716 * @brief Sets the AGC low threshold.
rosarium 0:2ddc0583bcec 2717 * @param cLowThreshold AGC low threshold to write in the THRESHOLD_LOW field of AGCCTRL_1 register.
rosarium 0:2ddc0583bcec 2718 * This parameter shall be in the range [0:15].
rosarium 0:2ddc0583bcec 2719 * @retval None.
rosarium 0:2ddc0583bcec 2720 */
rosarium 0:2ddc0583bcec 2721 void SpiritRadioSetAGCLowThreshold(uint8_t cLowThreshold)
rosarium 0:2ddc0583bcec 2722 {
rosarium 0:2ddc0583bcec 2723 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2724
rosarium 0:2ddc0583bcec 2725 /* Check the parameter */
rosarium 0:2ddc0583bcec 2726 s_assert_param(IS_AGC_THRESHOLD(cLowThreshold));
rosarium 0:2ddc0583bcec 2727
rosarium 0:2ddc0583bcec 2728 /* Reads the AGCCTRL_1 register */
rosarium 0:2ddc0583bcec 2729 SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2730
rosarium 0:2ddc0583bcec 2731 /* Mask the THRESHOLD_LOW field and write the new value */
rosarium 0:2ddc0583bcec 2732 tempRegValue &= 0xF0;
rosarium 0:2ddc0583bcec 2733 tempRegValue |= cLowThreshold;
rosarium 0:2ddc0583bcec 2734
rosarium 0:2ddc0583bcec 2735 /* Sets the AGCCTRL_1 register */
rosarium 0:2ddc0583bcec 2736 g_xStatus = SpiritSpiWriteRegisters(AGCCTRL1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2737
rosarium 0:2ddc0583bcec 2738 }
rosarium 0:2ddc0583bcec 2739
rosarium 0:2ddc0583bcec 2740
rosarium 0:2ddc0583bcec 2741 /**
rosarium 0:2ddc0583bcec 2742 * @brief Returns the AGC low threshold.
rosarium 0:2ddc0583bcec 2743 * @param None.
rosarium 0:2ddc0583bcec 2744 * @retval uint8_t AGC low threshold read from the THRESHOLD_LOW field of AGCCTRL_1 register.
rosarium 0:2ddc0583bcec 2745 * This parameter will be in the range [0:15].
rosarium 0:2ddc0583bcec 2746 */
rosarium 0:2ddc0583bcec 2747 uint8_t SpiritRadioGetAGCLowThreshold(void)
rosarium 0:2ddc0583bcec 2748 {
rosarium 0:2ddc0583bcec 2749 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2750
rosarium 0:2ddc0583bcec 2751 /* Reads the AGCCTRL_1 register, mask the THRESHOLD_LOW field and return the value */
rosarium 0:2ddc0583bcec 2752 g_xStatus = SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2753
rosarium 0:2ddc0583bcec 2754 return (tempRegValue & 0x0F);
rosarium 0:2ddc0583bcec 2755
rosarium 0:2ddc0583bcec 2756 }
rosarium 0:2ddc0583bcec 2757
rosarium 0:2ddc0583bcec 2758
rosarium 0:2ddc0583bcec 2759 /**
rosarium 0:2ddc0583bcec 2760 * @brief Sets the clock recovery algorithm.
rosarium 0:2ddc0583bcec 2761 * @param xMode the Clock Recovery mode. This parameter can be one of the values defined in @ref ClkRecMode :
rosarium 0:2ddc0583bcec 2762 * @arg CLK_REC_PLL PLL alogrithm for clock recovery
rosarium 0:2ddc0583bcec 2763 * @arg CLK_REC_DLL DLL alogrithm for clock recovery
rosarium 0:2ddc0583bcec 2764 * @retval None.
rosarium 0:2ddc0583bcec 2765 */
rosarium 0:2ddc0583bcec 2766 void SpiritRadioSetClkRecMode(ClkRecMode xMode)
rosarium 0:2ddc0583bcec 2767 {
rosarium 0:2ddc0583bcec 2768 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2769
rosarium 0:2ddc0583bcec 2770 /* Check the parameter */
rosarium 0:2ddc0583bcec 2771 s_assert_param(IS_CLK_REC_MODE(xMode));
rosarium 0:2ddc0583bcec 2772
rosarium 0:2ddc0583bcec 2773 /* Reads the FDEV_0 register */
rosarium 0:2ddc0583bcec 2774 SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2775
rosarium 0:2ddc0583bcec 2776 /* Mask the CLOCK_REC_ALGO_SEL field and write the new value */
rosarium 0:2ddc0583bcec 2777 tempRegValue &= 0xF7;
rosarium 0:2ddc0583bcec 2778 tempRegValue |= (uint8_t)xMode;
rosarium 0:2ddc0583bcec 2779
rosarium 0:2ddc0583bcec 2780 /* Sets the FDEV_0 register */
rosarium 0:2ddc0583bcec 2781 g_xStatus = SpiritSpiWriteRegisters(FDEV0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2782
rosarium 0:2ddc0583bcec 2783 }
rosarium 0:2ddc0583bcec 2784
rosarium 0:2ddc0583bcec 2785
rosarium 0:2ddc0583bcec 2786 /**
rosarium 0:2ddc0583bcec 2787 * @brief Returns the Clock Recovery working mode.
rosarium 0:2ddc0583bcec 2788 * @param None.
rosarium 0:2ddc0583bcec 2789 * @retval ClkRecMode Clock Recovery mode. This parameter can be one of the values defined in @ref ClkRecMode :
rosarium 0:2ddc0583bcec 2790 * @arg CLK_REC_PLL PLL alogrithm for clock recovery
rosarium 0:2ddc0583bcec 2791 * @arg CLK_REC_DLL DLL alogrithm for clock recovery
rosarium 0:2ddc0583bcec 2792 */
rosarium 0:2ddc0583bcec 2793 ClkRecMode SpiritRadioGetClkRecMode(void)
rosarium 0:2ddc0583bcec 2794 {
rosarium 0:2ddc0583bcec 2795 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2796
rosarium 0:2ddc0583bcec 2797 /* Reads the FDEV_0 register, mask the CLOCK_REC_ALGO_SEL field and return the value */
rosarium 0:2ddc0583bcec 2798 g_xStatus = SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2799
rosarium 0:2ddc0583bcec 2800 return (ClkRecMode)(tempRegValue & 0x08);
rosarium 0:2ddc0583bcec 2801
rosarium 0:2ddc0583bcec 2802 }
rosarium 0:2ddc0583bcec 2803
rosarium 0:2ddc0583bcec 2804
rosarium 0:2ddc0583bcec 2805 /**
rosarium 0:2ddc0583bcec 2806 * @brief Sets the clock recovery proportional gain.
rosarium 0:2ddc0583bcec 2807 * @param cPGain the Clock Recovery proportional gain to write in the CLK_REC_P_GAIN field of CLOCKREC register.
rosarium 0:2ddc0583bcec 2808 * It represents is log2 value of the clock recovery proportional gain.
rosarium 0:2ddc0583bcec 2809 * This parameter shall be in the range [0:7].
rosarium 0:2ddc0583bcec 2810 * @retval None.
rosarium 0:2ddc0583bcec 2811 */
rosarium 0:2ddc0583bcec 2812 void SpiritRadioSetClkRecPGain(uint8_t cPGain)
rosarium 0:2ddc0583bcec 2813 {
rosarium 0:2ddc0583bcec 2814 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2815
rosarium 0:2ddc0583bcec 2816 /* Check the parameter */
rosarium 0:2ddc0583bcec 2817 s_assert_param(IS_CLK_REC_P_GAIN(cPGain));
rosarium 0:2ddc0583bcec 2818
rosarium 0:2ddc0583bcec 2819 /* Reads the CLOCKREC register */
rosarium 0:2ddc0583bcec 2820 SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2821
rosarium 0:2ddc0583bcec 2822 /* Mask the CLK_REC_P_GAIN field and write the new value */
rosarium 0:2ddc0583bcec 2823 tempRegValue &= 0x1F;
rosarium 0:2ddc0583bcec 2824 tempRegValue |= (cPGain<<5);
rosarium 0:2ddc0583bcec 2825
rosarium 0:2ddc0583bcec 2826 /* Sets the CLOCKREC register */
rosarium 0:2ddc0583bcec 2827 g_xStatus = SpiritSpiWriteRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2828
rosarium 0:2ddc0583bcec 2829 }
rosarium 0:2ddc0583bcec 2830
rosarium 0:2ddc0583bcec 2831
rosarium 0:2ddc0583bcec 2832 /**
rosarium 0:2ddc0583bcec 2833 * @brief Returns the log2 of the clock recovery proportional gain.
rosarium 0:2ddc0583bcec 2834 * @param None.
rosarium 0:2ddc0583bcec 2835 * @retval uint8_t Clock Recovery proportional gain read from the CLK_REC_P_GAIN field of CLOCKREC register.
rosarium 0:2ddc0583bcec 2836 * This parameter will be in the range [0:7].
rosarium 0:2ddc0583bcec 2837 */
rosarium 0:2ddc0583bcec 2838 uint8_t SpiritRadioGetClkRecPGain(void)
rosarium 0:2ddc0583bcec 2839 {
rosarium 0:2ddc0583bcec 2840 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2841
rosarium 0:2ddc0583bcec 2842 /* Reads the CLOCKREC register, mask the CLK_REC_P_GAIN field and return the value */
rosarium 0:2ddc0583bcec 2843 g_xStatus = SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2844
rosarium 0:2ddc0583bcec 2845 return ((tempRegValue & 0xEF)>>5);
rosarium 0:2ddc0583bcec 2846
rosarium 0:2ddc0583bcec 2847 }
rosarium 0:2ddc0583bcec 2848
rosarium 0:2ddc0583bcec 2849
rosarium 0:2ddc0583bcec 2850 /**
rosarium 0:2ddc0583bcec 2851 * @brief Sets the clock recovery integral gain.
rosarium 0:2ddc0583bcec 2852 * @param cIGain the Clock Recovery integral gain to write in the CLK_REC_I_GAIN field of CLOCKREC register.
rosarium 0:2ddc0583bcec 2853 * This parameter shall be in the range [0:15].
rosarium 0:2ddc0583bcec 2854 * @retval None.
rosarium 0:2ddc0583bcec 2855 */
rosarium 0:2ddc0583bcec 2856 void SpiritRadioSetClkRecIGain(uint8_t cIGain)
rosarium 0:2ddc0583bcec 2857 {
rosarium 0:2ddc0583bcec 2858 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2859
rosarium 0:2ddc0583bcec 2860 /* Check the parameter */
rosarium 0:2ddc0583bcec 2861 s_assert_param(IS_CLK_REC_I_GAIN(cIGain));
rosarium 0:2ddc0583bcec 2862
rosarium 0:2ddc0583bcec 2863 /* Reads the CLOCKREC register */
rosarium 0:2ddc0583bcec 2864 SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2865
rosarium 0:2ddc0583bcec 2866 /* Mask the CLK_REC_P_GAIN field and write the new value */
rosarium 0:2ddc0583bcec 2867 tempRegValue &= 0xF0;
rosarium 0:2ddc0583bcec 2868 tempRegValue |= cIGain;
rosarium 0:2ddc0583bcec 2869
rosarium 0:2ddc0583bcec 2870 /* Sets the CLOCKREC register */
rosarium 0:2ddc0583bcec 2871 g_xStatus = SpiritSpiWriteRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2872
rosarium 0:2ddc0583bcec 2873 }
rosarium 0:2ddc0583bcec 2874
rosarium 0:2ddc0583bcec 2875
rosarium 0:2ddc0583bcec 2876 /**
rosarium 0:2ddc0583bcec 2877 * @brief Returns the clock recovery integral gain.
rosarium 0:2ddc0583bcec 2878 * @param None.
rosarium 0:2ddc0583bcec 2879 * @retval uint8_t Clock Recovery integral gain read from the
rosarium 0:2ddc0583bcec 2880 * CLK_REC_I_GAIN field of CLOCKREC register.
rosarium 0:2ddc0583bcec 2881 * This parameter will be in the range [0:15].
rosarium 0:2ddc0583bcec 2882 */
rosarium 0:2ddc0583bcec 2883 uint8_t SpiritRadioGetClkRecIGain(void)
rosarium 0:2ddc0583bcec 2884 {
rosarium 0:2ddc0583bcec 2885 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2886
rosarium 0:2ddc0583bcec 2887 /* Reads the CLOCKREC register, mask the CLK_REC_I_GAIN field and return the value */
rosarium 0:2ddc0583bcec 2888 g_xStatus = SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2889
rosarium 0:2ddc0583bcec 2890 return (tempRegValue & 0x0F);
rosarium 0:2ddc0583bcec 2891
rosarium 0:2ddc0583bcec 2892 }
rosarium 0:2ddc0583bcec 2893
rosarium 0:2ddc0583bcec 2894
rosarium 0:2ddc0583bcec 2895 /**
rosarium 0:2ddc0583bcec 2896 * @brief Sets the postfilter length for clock recovery algorithm.
rosarium 0:2ddc0583bcec 2897 * @param xLength the postfilter length in symbols. This parameter can be one of the values defined in @ref PstFltLength :
rosarium 0:2ddc0583bcec 2898 * @arg PSTFLT_LENGTH_8 Postfilter length is 8 symbols
rosarium 0:2ddc0583bcec 2899 * @arg PSTFLT_LENGTH_16 Postfilter length is 16 symbols
rosarium 0:2ddc0583bcec 2900 * @retval None.
rosarium 0:2ddc0583bcec 2901 */
rosarium 0:2ddc0583bcec 2902 void SpiritRadioSetClkRecPstFltLength(PstFltLength xLength)
rosarium 0:2ddc0583bcec 2903 {
rosarium 0:2ddc0583bcec 2904 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2905
rosarium 0:2ddc0583bcec 2906 /* Check the parameter */
rosarium 0:2ddc0583bcec 2907 s_assert_param(IS_PST_FLT_LENGTH(xLength));
rosarium 0:2ddc0583bcec 2908
rosarium 0:2ddc0583bcec 2909 /* Reads the CLOCKREC register */
rosarium 0:2ddc0583bcec 2910 SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2911
rosarium 0:2ddc0583bcec 2912 /* Mask the PSTFLT_LEN field and write the new value */
rosarium 0:2ddc0583bcec 2913 tempRegValue &= 0xEF;
rosarium 0:2ddc0583bcec 2914 tempRegValue |= (uint8_t)xLength;
rosarium 0:2ddc0583bcec 2915
rosarium 0:2ddc0583bcec 2916 /* Sets the CLOCKREC register */
rosarium 0:2ddc0583bcec 2917 g_xStatus = SpiritSpiWriteRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2918
rosarium 0:2ddc0583bcec 2919 }
rosarium 0:2ddc0583bcec 2920
rosarium 0:2ddc0583bcec 2921
rosarium 0:2ddc0583bcec 2922 /**
rosarium 0:2ddc0583bcec 2923 * @brief Returns the postfilter length for clock recovery algorithm.
rosarium 0:2ddc0583bcec 2924 * @param None.
rosarium 0:2ddc0583bcec 2925 * @retval PstFltLength Postfilter length in symbols. This parameter can be one of the values defined in @ref PstFltLength :
rosarium 0:2ddc0583bcec 2926 * @arg PSTFLT_LENGTH_8 Postfilter length is 8 symbols
rosarium 0:2ddc0583bcec 2927 * @arg PSTFLT_LENGTH_16 Postfilter length is 16 symbols
rosarium 0:2ddc0583bcec 2928 */
rosarium 0:2ddc0583bcec 2929 PstFltLength SpiritRadioGetClkRecPstFltLength(void)
rosarium 0:2ddc0583bcec 2930 {
rosarium 0:2ddc0583bcec 2931 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2932
rosarium 0:2ddc0583bcec 2933 /* Reads the CLOCKREC register, mask the PSTFLT_LEN field and return the value */
rosarium 0:2ddc0583bcec 2934 g_xStatus = SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2935
rosarium 0:2ddc0583bcec 2936 return (PstFltLength)(tempRegValue & 0x10);
rosarium 0:2ddc0583bcec 2937
rosarium 0:2ddc0583bcec 2938 }
rosarium 0:2ddc0583bcec 2939
rosarium 0:2ddc0583bcec 2940
rosarium 0:2ddc0583bcec 2941 /**
rosarium 0:2ddc0583bcec 2942 * @brief Enables or Disables the received data blanking when the CS is under the threshold.
rosarium 0:2ddc0583bcec 2943 * @param xNewState new state of this mode.
rosarium 0:2ddc0583bcec 2944 * This parameter can be: S_ENABLE or S_DISABLE .
rosarium 0:2ddc0583bcec 2945 * @retval None.
rosarium 0:2ddc0583bcec 2946 */
rosarium 0:2ddc0583bcec 2947 void SpiritRadioCsBlanking(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2948 {
rosarium 0:2ddc0583bcec 2949 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2950
rosarium 0:2ddc0583bcec 2951 /* Check the parameters */
rosarium 0:2ddc0583bcec 2952 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2953
rosarium 0:2ddc0583bcec 2954 /* Reads the ANT_SELECT_CONF_BASE and mask the CS_BLANKING BIT field */
rosarium 0:2ddc0583bcec 2955 SpiritSpiReadRegisters(ANT_SELECT_CONF_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2956
rosarium 0:2ddc0583bcec 2957 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2958 {
rosarium 0:2ddc0583bcec 2959 tempRegValue |= ANT_SELECT_CS_BLANKING_MASK;
rosarium 0:2ddc0583bcec 2960 }
rosarium 0:2ddc0583bcec 2961 else
rosarium 0:2ddc0583bcec 2962 {
rosarium 0:2ddc0583bcec 2963 tempRegValue &= (~ANT_SELECT_CS_BLANKING_MASK);
rosarium 0:2ddc0583bcec 2964 }
rosarium 0:2ddc0583bcec 2965
rosarium 0:2ddc0583bcec 2966 /* Writes the new value in the ANT_SELECT_CONF register */
rosarium 0:2ddc0583bcec 2967 g_xStatus = SpiritSpiWriteRegisters(ANT_SELECT_CONF_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2968
rosarium 0:2ddc0583bcec 2969
rosarium 0:2ddc0583bcec 2970 }
rosarium 0:2ddc0583bcec 2971
rosarium 0:2ddc0583bcec 2972 /**
rosarium 0:2ddc0583bcec 2973 * @brief Enables or Disables the persistent RX mode.
rosarium 0:2ddc0583bcec 2974 * @param xNewState new state of this mode.
rosarium 0:2ddc0583bcec 2975 * This parameter can be: S_ENABLE or S_DISABLE .
rosarium 0:2ddc0583bcec 2976 * @retval None.
rosarium 0:2ddc0583bcec 2977 */
rosarium 0:2ddc0583bcec 2978 void SpiritRadioPersistenRx(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 2979 {
rosarium 0:2ddc0583bcec 2980 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 2981
rosarium 0:2ddc0583bcec 2982 /* Check the parameters */
rosarium 0:2ddc0583bcec 2983 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 2984
rosarium 0:2ddc0583bcec 2985 /* Reads the PROTOCOL0_BASE and mask the PROTOCOL0_PERS_RX_MASK bitfield */
rosarium 0:2ddc0583bcec 2986 SpiritSpiReadRegisters(PROTOCOL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2987
rosarium 0:2ddc0583bcec 2988 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 2989 {
rosarium 0:2ddc0583bcec 2990 tempRegValue |= PROTOCOL0_PERS_RX_MASK;
rosarium 0:2ddc0583bcec 2991 }
rosarium 0:2ddc0583bcec 2992 else
rosarium 0:2ddc0583bcec 2993 {
rosarium 0:2ddc0583bcec 2994 tempRegValue &= (~PROTOCOL0_PERS_RX_MASK);
rosarium 0:2ddc0583bcec 2995 }
rosarium 0:2ddc0583bcec 2996
rosarium 0:2ddc0583bcec 2997 /* Writes the new value in the PROTOCOL0_BASE register */
rosarium 0:2ddc0583bcec 2998 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 2999
rosarium 0:2ddc0583bcec 3000 }
rosarium 0:2ddc0583bcec 3001
rosarium 0:2ddc0583bcec 3002 /**
rosarium 0:2ddc0583bcec 3003 * @brief Enables or Disables the synthesizer reference divider.
rosarium 0:2ddc0583bcec 3004 * @param xNewState new state for synthesizer reference divider.
rosarium 0:2ddc0583bcec 3005 * This parameter can be: S_ENABLE or S_DISABLE .
rosarium 0:2ddc0583bcec 3006 * @retval None.
rosarium 0:2ddc0583bcec 3007 */
rosarium 0:2ddc0583bcec 3008 void SpiritRadioSetRefDiv(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 3009 {
rosarium 0:2ddc0583bcec 3010 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 3011
rosarium 0:2ddc0583bcec 3012 /* Check the parameters */
rosarium 0:2ddc0583bcec 3013 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 3014
rosarium 0:2ddc0583bcec 3015 /* Reads the SYNTH_CONFIG1_BASE and mask the REFDIV bit field */
rosarium 0:2ddc0583bcec 3016 SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 3017
rosarium 0:2ddc0583bcec 3018 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 3019 {
rosarium 0:2ddc0583bcec 3020 tempRegValue |= 0x80;
rosarium 0:2ddc0583bcec 3021 }
rosarium 0:2ddc0583bcec 3022 else
rosarium 0:2ddc0583bcec 3023 {
rosarium 0:2ddc0583bcec 3024 tempRegValue &= 0x7F;
rosarium 0:2ddc0583bcec 3025 }
rosarium 0:2ddc0583bcec 3026
rosarium 0:2ddc0583bcec 3027 /* Writes the new value in the SYNTH_CONFIG1_BASE register */
rosarium 0:2ddc0583bcec 3028 g_xStatus = SpiritSpiWriteRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 3029
rosarium 0:2ddc0583bcec 3030 }
rosarium 0:2ddc0583bcec 3031
rosarium 0:2ddc0583bcec 3032 /**
rosarium 0:2ddc0583bcec 3033 * @brief Get the the synthesizer reference divider state.
rosarium 0:2ddc0583bcec 3034 * @param void.
rosarium 0:2ddc0583bcec 3035 * @retval None.
rosarium 0:2ddc0583bcec 3036 */
rosarium 0:2ddc0583bcec 3037 SpiritFunctionalState SpiritRadioGetRefDiv(void)
rosarium 0:2ddc0583bcec 3038 {
rosarium 0:2ddc0583bcec 3039 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 3040
rosarium 0:2ddc0583bcec 3041 g_xStatus = SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 3042
rosarium 0:2ddc0583bcec 3043 if(((tempRegValue>>7)&0x1))
rosarium 0:2ddc0583bcec 3044 {
rosarium 0:2ddc0583bcec 3045 return S_ENABLE;
rosarium 0:2ddc0583bcec 3046 }
rosarium 0:2ddc0583bcec 3047 else
rosarium 0:2ddc0583bcec 3048 {
rosarium 0:2ddc0583bcec 3049 return S_DISABLE;
rosarium 0:2ddc0583bcec 3050 }
rosarium 0:2ddc0583bcec 3051
rosarium 0:2ddc0583bcec 3052 }
rosarium 0:2ddc0583bcec 3053
rosarium 0:2ddc0583bcec 3054 /**
rosarium 0:2ddc0583bcec 3055 * @brief Enables or Disables the synthesizer reference divider.
rosarium 0:2ddc0583bcec 3056 * @param xNewState new state for synthesizer reference divider.
rosarium 0:2ddc0583bcec 3057 * This parameter can be: S_ENABLE or S_DISABLE .
rosarium 0:2ddc0583bcec 3058 * @retval None.
rosarium 0:2ddc0583bcec 3059 */
rosarium 0:2ddc0583bcec 3060 void SpiritRadioSetDigDiv(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 3061 {
rosarium 0:2ddc0583bcec 3062 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 3063
rosarium 0:2ddc0583bcec 3064 /* Check the parameters */
rosarium 0:2ddc0583bcec 3065 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 3066
rosarium 0:2ddc0583bcec 3067 /* Reads the XO_RCO_TEST_BASE and mask the PD_CLKDIV bit field */
rosarium 0:2ddc0583bcec 3068 SpiritSpiReadRegisters(XO_RCO_TEST_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 3069
rosarium 0:2ddc0583bcec 3070 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 3071 {
rosarium 0:2ddc0583bcec 3072 tempRegValue &= 0xf7;
rosarium 0:2ddc0583bcec 3073 }
rosarium 0:2ddc0583bcec 3074 else
rosarium 0:2ddc0583bcec 3075 {
rosarium 0:2ddc0583bcec 3076
rosarium 0:2ddc0583bcec 3077 tempRegValue |= 0x08;
rosarium 0:2ddc0583bcec 3078 }
rosarium 0:2ddc0583bcec 3079
rosarium 0:2ddc0583bcec 3080 /* Writes the new value in the XO_RCO_TEST_BASE register */
rosarium 0:2ddc0583bcec 3081 g_xStatus = SpiritSpiWriteRegisters(XO_RCO_TEST_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 3082
rosarium 0:2ddc0583bcec 3083 }
rosarium 0:2ddc0583bcec 3084
rosarium 0:2ddc0583bcec 3085 /**
rosarium 0:2ddc0583bcec 3086 * @brief Get the the synthesizer reference divider state.
rosarium 0:2ddc0583bcec 3087 * @param void.
rosarium 0:2ddc0583bcec 3088 * @retval None.
rosarium 0:2ddc0583bcec 3089 */
rosarium 0:2ddc0583bcec 3090 SpiritFunctionalState SpiritRadioGetDigDiv(void)
rosarium 0:2ddc0583bcec 3091 {
rosarium 0:2ddc0583bcec 3092 uint8_t tempRegValue;
rosarium 0:2ddc0583bcec 3093
rosarium 0:2ddc0583bcec 3094 g_xStatus = SpiritSpiReadRegisters(XO_RCO_TEST_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 3095
rosarium 0:2ddc0583bcec 3096 if(((tempRegValue>>3)&0x1))
rosarium 0:2ddc0583bcec 3097 {
rosarium 0:2ddc0583bcec 3098 return S_DISABLE;
rosarium 0:2ddc0583bcec 3099 }
rosarium 0:2ddc0583bcec 3100 else
rosarium 0:2ddc0583bcec 3101 {
rosarium 0:2ddc0583bcec 3102 return S_ENABLE;
rosarium 0:2ddc0583bcec 3103 }
rosarium 0:2ddc0583bcec 3104
rosarium 0:2ddc0583bcec 3105 }
rosarium 0:2ddc0583bcec 3106
rosarium 0:2ddc0583bcec 3107 /**
rosarium 0:2ddc0583bcec 3108 * @brief Returns the XTAL frequency.
rosarium 0:2ddc0583bcec 3109 * @param void.
rosarium 0:2ddc0583bcec 3110 * @retval uint32_t XTAL frequency.
rosarium 0:2ddc0583bcec 3111 */
rosarium 0:2ddc0583bcec 3112 uint32_t SpiritRadioGetXtalFrequency(void)
rosarium 0:2ddc0583bcec 3113 {
rosarium 0:2ddc0583bcec 3114 return s_lXtalFrequency;
rosarium 0:2ddc0583bcec 3115 }
rosarium 0:2ddc0583bcec 3116
rosarium 0:2ddc0583bcec 3117 /**
rosarium 0:2ddc0583bcec 3118 * @brief Sets the XTAL frequency.
rosarium 0:2ddc0583bcec 3119 * @param uint32_t XTAL frequency.
rosarium 0:2ddc0583bcec 3120 * @retval void.
rosarium 0:2ddc0583bcec 3121 */
rosarium 0:2ddc0583bcec 3122 void SpiritRadioSetXtalFrequency(uint32_t lXtalFrequency)
rosarium 0:2ddc0583bcec 3123 {
rosarium 0:2ddc0583bcec 3124 s_lXtalFrequency = lXtalFrequency;
rosarium 0:2ddc0583bcec 3125 }
rosarium 0:2ddc0583bcec 3126
rosarium 0:2ddc0583bcec 3127 /**
rosarium 0:2ddc0583bcec 3128 * @}
rosarium 0:2ddc0583bcec 3129 */
rosarium 0:2ddc0583bcec 3130
rosarium 0:2ddc0583bcec 3131
rosarium 0:2ddc0583bcec 3132 /**
rosarium 0:2ddc0583bcec 3133 * @}
rosarium 0:2ddc0583bcec 3134 */
rosarium 0:2ddc0583bcec 3135
rosarium 0:2ddc0583bcec 3136
rosarium 0:2ddc0583bcec 3137 /**
rosarium 0:2ddc0583bcec 3138 * @}
rosarium 0:2ddc0583bcec 3139 */
rosarium 0:2ddc0583bcec 3140
rosarium 0:2ddc0583bcec 3141
rosarium 0:2ddc0583bcec 3142
rosarium 0:2ddc0583bcec 3143 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
rosarium 0:2ddc0583bcec 3144