센서보드 RF IRQ 테스트 중

Fork of stm-spirit1-rf-driver by ST

Committer:
jmhong
Date:
Thu Sep 20 04:46:49 2018 +0000
Revision:
85:4ca74d007fe7
Parent:
84:45b9ff78a066
Environmental test.. temp, etc...

Who changed what in which revision?

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