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