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