wifi test

Dependencies:   X_NUCLEO_IKS01A2 mbed-http

Committer:
JMF
Date:
Wed Sep 05 14:28:24 2018 +0000
Revision:
0:24d3eb812fd4
Initial commit

Who changed what in which revision?

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