Prototype RF driver for STM Sub-1 GHz RF expansion board based on the SPSGRF-868 module for STM32 Nucleo.

Prototype RF Driver for STM Sub-1 GHz RF Expansion Boards based on the SPSGRF-868 and SPSGRF-915 Modules for STM32 Nucleo

Currently supported boards:

Note, in order to use expansion board X-NUCLEO-IDS01A4 in mbed you need to perform the following HW modifications on the board:

  • Unmount resistor R4
  • Mount resistor R7

Furthermore, on some Nucleo development boards (e.g. the NUCLEO_F429ZI), in order to be able to use Ethernet together with these Sub-1 GHz RF expansion boards, you need to compile this driver with macro SPIRIT1_SPI_MOSI=PB_5 defined, while the development board typically requires some HW modification as e.g. described here!

This driver can be used together with the 6LoWPAN stack (a.k.a. Nanostack).

Committer:
Wolfgang Betz
Date:
Thu Oct 13 15:41:39 2016 +0200
Revision:
0:4fb29d9ee571
First compiling version (without warnings)

Who changed what in which revision?

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