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