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

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

Currently supported boards:

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

  • Unmount resistor R4
  • Mount resistor R7

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

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

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 0:4fb29d9ee571 1 /**
Wolfgang Betz 0:4fb29d9ee571 2 ******************************************************************************
Wolfgang Betz 0:4fb29d9ee571 3 * @file SPIRIT_Timer.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 Configuration and management of SPIRIT timers.
Wolfgang Betz 0:4fb29d9ee571 8 * @details
Wolfgang Betz 0:4fb29d9ee571 9 *
Wolfgang Betz 0:4fb29d9ee571 10 * @attention
Wolfgang Betz 0:4fb29d9ee571 11 *
Wolfgang Betz 0:4fb29d9ee571 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Wolfgang Betz 0:4fb29d9ee571 13 *
Wolfgang Betz 0:4fb29d9ee571 14 * Redistribution and use in source and binary forms, with or without modification,
Wolfgang Betz 0:4fb29d9ee571 15 * are permitted provided that the following conditions are met:
Wolfgang Betz 0:4fb29d9ee571 16 * 1. Redistributions of source code must retain the above copyright notice,
Wolfgang Betz 0:4fb29d9ee571 17 * this list of conditions and the following disclaimer.
Wolfgang Betz 0:4fb29d9ee571 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Wolfgang Betz 0:4fb29d9ee571 19 * this list of conditions and the following disclaimer in the documentation
Wolfgang Betz 0:4fb29d9ee571 20 * and/or other materials provided with the distribution.
Wolfgang Betz 0:4fb29d9ee571 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Wolfgang Betz 0:4fb29d9ee571 22 * may be used to endorse or promote products derived from this software
Wolfgang Betz 0:4fb29d9ee571 23 * without specific prior written permission.
Wolfgang Betz 0:4fb29d9ee571 24 *
Wolfgang Betz 0:4fb29d9ee571 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Wolfgang Betz 0:4fb29d9ee571 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Wolfgang Betz 0:4fb29d9ee571 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Wolfgang Betz 0:4fb29d9ee571 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Wolfgang Betz 0:4fb29d9ee571 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Wolfgang Betz 0:4fb29d9ee571 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Wolfgang Betz 0:4fb29d9ee571 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Wolfgang Betz 0:4fb29d9ee571 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Wolfgang Betz 0:4fb29d9ee571 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Wolfgang Betz 0:4fb29d9ee571 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wolfgang Betz 0:4fb29d9ee571 35 *
Wolfgang Betz 0:4fb29d9ee571 36 ******************************************************************************
Wolfgang Betz 0:4fb29d9ee571 37 */
Wolfgang Betz 0:4fb29d9ee571 38
Wolfgang Betz 0:4fb29d9ee571 39 /* Includes ------------------------------------------------------------------*/
Wolfgang Betz 0:4fb29d9ee571 40 #include "SPIRIT_Timer.h"
Wolfgang Betz 0:4fb29d9ee571 41 #include "SPIRIT_Radio.h"
Wolfgang Betz 0:4fb29d9ee571 42 #include "MCU_Interface.h"
Wolfgang Betz 0:4fb29d9ee571 43
Wolfgang Betz 0:4fb29d9ee571 44
Wolfgang Betz 0:4fb29d9ee571 45
Wolfgang Betz 0:4fb29d9ee571 46
Wolfgang Betz 0:4fb29d9ee571 47 /**
Wolfgang Betz 0:4fb29d9ee571 48 * @addtogroup SPIRIT_Libraries
Wolfgang Betz 0:4fb29d9ee571 49 * @{
Wolfgang Betz 0:4fb29d9ee571 50 */
Wolfgang Betz 0:4fb29d9ee571 51
Wolfgang Betz 0:4fb29d9ee571 52
Wolfgang Betz 0:4fb29d9ee571 53 /**
Wolfgang Betz 0:4fb29d9ee571 54 * @addtogroup SPIRIT_Timer
Wolfgang Betz 0:4fb29d9ee571 55 * @{
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 * @defgroup Timer_Private_TypesDefinitions Timer Private Types Definitions
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 *@}
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 * @defgroup Timer_Private_Defines Timer Private Defines
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
Wolfgang Betz 0:4fb29d9ee571 78
Wolfgang Betz 0:4fb29d9ee571 79 /**
Wolfgang Betz 0:4fb29d9ee571 80 * @defgroup Timer_Private_Macros Timer Private Macros
Wolfgang Betz 0:4fb29d9ee571 81 * @{
Wolfgang Betz 0:4fb29d9ee571 82 */
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
Wolfgang Betz 0:4fb29d9ee571 89
Wolfgang Betz 0:4fb29d9ee571 90 /**
Wolfgang Betz 0:4fb29d9ee571 91 * @defgroup Timer_Private_Variables Timer Private Variables
Wolfgang Betz 0:4fb29d9ee571 92 * @{
Wolfgang Betz 0:4fb29d9ee571 93 */
Wolfgang Betz 0:4fb29d9ee571 94
Wolfgang Betz 0:4fb29d9ee571 95 /**
Wolfgang Betz 0:4fb29d9ee571 96 *@}
Wolfgang Betz 0:4fb29d9ee571 97 */
Wolfgang Betz 0:4fb29d9ee571 98
Wolfgang Betz 0:4fb29d9ee571 99
Wolfgang Betz 0:4fb29d9ee571 100 /**
Wolfgang Betz 0:4fb29d9ee571 101 * @defgroup Timer_Private_FunctionPrototypes Timer Private Function Prototypes
Wolfgang Betz 0:4fb29d9ee571 102 * @{
Wolfgang Betz 0:4fb29d9ee571 103 */
Wolfgang Betz 0:4fb29d9ee571 104
Wolfgang Betz 0:4fb29d9ee571 105 /**
Wolfgang Betz 0:4fb29d9ee571 106 *@}
Wolfgang Betz 0:4fb29d9ee571 107 */
Wolfgang Betz 0:4fb29d9ee571 108
Wolfgang Betz 0:4fb29d9ee571 109
Wolfgang Betz 0:4fb29d9ee571 110 /**
Wolfgang Betz 0:4fb29d9ee571 111 * @defgroup Timer_Private_Functions Timer Private Functions
Wolfgang Betz 0:4fb29d9ee571 112 * @{
Wolfgang Betz 0:4fb29d9ee571 113 */
Wolfgang Betz 0:4fb29d9ee571 114
Wolfgang Betz 0:4fb29d9ee571 115 /**
Wolfgang Betz 0:4fb29d9ee571 116 * @brief Enables or Disables the LDCR mode.
Wolfgang Betz 0:4fb29d9ee571 117 * @param xNewState new state for LDCR mode.
Wolfgang Betz 0:4fb29d9ee571 118 * This parameter can be: S_ENABLE or S_DISABLE.
Wolfgang Betz 0:4fb29d9ee571 119 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 120 */
Wolfgang Betz 0:4fb29d9ee571 121 void SpiritTimerLdcrMode(SpiritFunctionalState xNewState)
Wolfgang Betz 0:4fb29d9ee571 122 {
Wolfgang Betz 0:4fb29d9ee571 123 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 124
Wolfgang Betz 0:4fb29d9ee571 125 /* Reads the register value */
Wolfgang Betz 0:4fb29d9ee571 126 g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 127
Wolfgang Betz 0:4fb29d9ee571 128 /* Mask the read value to enable or disable the LDC mode */
Wolfgang Betz 0:4fb29d9ee571 129 if(xNewState==S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 130 {
Wolfgang Betz 0:4fb29d9ee571 131 tempRegValue |= PROTOCOL2_LDC_MODE_MASK;
Wolfgang Betz 0:4fb29d9ee571 132 }
Wolfgang Betz 0:4fb29d9ee571 133 else
Wolfgang Betz 0:4fb29d9ee571 134 {
Wolfgang Betz 0:4fb29d9ee571 135 tempRegValue &= ~PROTOCOL2_LDC_MODE_MASK;
Wolfgang Betz 0:4fb29d9ee571 136 }
Wolfgang Betz 0:4fb29d9ee571 137
Wolfgang Betz 0:4fb29d9ee571 138 /* Writes the register to Enable or Disable the LDCR mode */
Wolfgang Betz 0:4fb29d9ee571 139 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 140
Wolfgang Betz 0:4fb29d9ee571 141 }
Wolfgang Betz 0:4fb29d9ee571 142
Wolfgang Betz 0:4fb29d9ee571 143
Wolfgang Betz 0:4fb29d9ee571 144 /**
Wolfgang Betz 0:4fb29d9ee571 145 * @brief Enables or Disables the LDCR timer reloading with the value stored in the LDCR_RELOAD registers.
Wolfgang Betz 0:4fb29d9ee571 146 * @param xNewState new state for LDCR reloading.
Wolfgang Betz 0:4fb29d9ee571 147 * This parameter can be: S_ENABLE or S_DISABLE.
Wolfgang Betz 0:4fb29d9ee571 148 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 149 */
Wolfgang Betz 0:4fb29d9ee571 150 void SpiritTimerLdcrAutoReload(SpiritFunctionalState xNewState)
Wolfgang Betz 0:4fb29d9ee571 151 {
Wolfgang Betz 0:4fb29d9ee571 152 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 153
Wolfgang Betz 0:4fb29d9ee571 154 /* Reads the register value */
Wolfgang Betz 0:4fb29d9ee571 155 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 156
Wolfgang Betz 0:4fb29d9ee571 157 /* Mask te read value to enable or disable the reload on sync mode */
Wolfgang Betz 0:4fb29d9ee571 158 if(xNewState==S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 159 {
Wolfgang Betz 0:4fb29d9ee571 160 tempRegValue |= PROTOCOL1_LDC_RELOAD_ON_SYNC_MASK;
Wolfgang Betz 0:4fb29d9ee571 161 }
Wolfgang Betz 0:4fb29d9ee571 162 else
Wolfgang Betz 0:4fb29d9ee571 163 {
Wolfgang Betz 0:4fb29d9ee571 164 tempRegValue &= ~PROTOCOL1_LDC_RELOAD_ON_SYNC_MASK;
Wolfgang Betz 0:4fb29d9ee571 165 }
Wolfgang Betz 0:4fb29d9ee571 166
Wolfgang Betz 0:4fb29d9ee571 167 /* Writes the register to Enable or Disable the Auto Reload */
Wolfgang Betz 0:4fb29d9ee571 168 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
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 * @brief Returns the LDCR timer reload bit.
Wolfgang Betz 0:4fb29d9ee571 175 * @param None.
Wolfgang Betz 0:4fb29d9ee571 176 * @retval SpiritFunctionalState: value of the reload bit.
Wolfgang Betz 0:4fb29d9ee571 177 */
Wolfgang Betz 0:4fb29d9ee571 178 SpiritFunctionalState SpiritTimerLdcrGetAutoReload(void)
Wolfgang Betz 0:4fb29d9ee571 179 {
Wolfgang Betz 0:4fb29d9ee571 180 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 181
Wolfgang Betz 0:4fb29d9ee571 182 /* Reads the register value */
Wolfgang Betz 0:4fb29d9ee571 183 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 184
Wolfgang Betz 0:4fb29d9ee571 185 return (SpiritFunctionalState)(tempRegValue & 0x80);
Wolfgang Betz 0:4fb29d9ee571 186
Wolfgang Betz 0:4fb29d9ee571 187 }
Wolfgang Betz 0:4fb29d9ee571 188
Wolfgang Betz 0:4fb29d9ee571 189 /**
Wolfgang Betz 0:4fb29d9ee571 190 * @brief Sets the RX timeout timer initialization registers with the values of COUNTER and PRESCALER according to the formula: Trx=PRESCALER*COUNTER*Tck.
Wolfgang Betz 0:4fb29d9ee571 191 * Remember that it is possible to have infinite RX_Timeout writing 0 in the RX_Timeout_Counter and/or RX_Timeout_Prescaler registers.
Wolfgang Betz 0:4fb29d9ee571 192 * @param cCounter value for the timer counter.
Wolfgang Betz 0:4fb29d9ee571 193 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 194 * @param cPrescaler value for the timer prescaler.
Wolfgang Betz 0:4fb29d9ee571 195 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 196 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 197 */
Wolfgang Betz 0:4fb29d9ee571 198 void SpiritTimerSetRxTimeout(uint8_t cCounter , uint8_t cPrescaler)
Wolfgang Betz 0:4fb29d9ee571 199 {
Wolfgang Betz 0:4fb29d9ee571 200 uint8_t tempRegValue[2]={cPrescaler,cCounter};
Wolfgang Betz 0:4fb29d9ee571 201
Wolfgang Betz 0:4fb29d9ee571 202 /* Writes the prescaler and counter value for RX timeout in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 203 g_xStatus = SpiritSpiWriteRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 204
Wolfgang Betz 0:4fb29d9ee571 205 }
Wolfgang Betz 0:4fb29d9ee571 206
Wolfgang Betz 0:4fb29d9ee571 207
Wolfgang Betz 0:4fb29d9ee571 208 /**
Wolfgang Betz 0:4fb29d9ee571 209 * @brief Sets the RX timeout timer counter and prescaler from the desired value in ms. it is possible to fix the RX_Timeout to
Wolfgang Betz 0:4fb29d9ee571 210 * a minimum value of 50.417us to a maximum value of about 3.28 s.
Wolfgang Betz 0:4fb29d9ee571 211 * @param fDesiredMsec desired timer value.
Wolfgang Betz 0:4fb29d9ee571 212 * This parameter must be a float.
Wolfgang Betz 0:4fb29d9ee571 213 * @retval None
Wolfgang Betz 0:4fb29d9ee571 214 */
Wolfgang Betz 0:4fb29d9ee571 215
Wolfgang Betz 0:4fb29d9ee571 216 void SpiritTimerSetRxTimeoutMs(float fDesiredMsec)
Wolfgang Betz 0:4fb29d9ee571 217 {
Wolfgang Betz 0:4fb29d9ee571 218 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 219
Wolfgang Betz 0:4fb29d9ee571 220 /* Computes the counter and prescaler value */
Wolfgang Betz 0:4fb29d9ee571 221 SpiritTimerComputeRxTimeoutValues(fDesiredMsec , &tempRegValue[1] , &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 222
Wolfgang Betz 0:4fb29d9ee571 223 /* Writes the prescaler and counter value for RX timeout in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 224 g_xStatus = SpiritSpiWriteRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 225
Wolfgang Betz 0:4fb29d9ee571 226 }
Wolfgang Betz 0:4fb29d9ee571 227
Wolfgang Betz 0:4fb29d9ee571 228
Wolfgang Betz 0:4fb29d9ee571 229 /**
Wolfgang Betz 0:4fb29d9ee571 230 * @brief Sets the RX timeout timer counter. If it is equal to 0 the timeout is infinite.
Wolfgang Betz 0:4fb29d9ee571 231 * @param cCounter value for the timer counter.
Wolfgang Betz 0:4fb29d9ee571 232 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 233 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 234 */
Wolfgang Betz 0:4fb29d9ee571 235 void SpiritTimerSetRxTimeoutCounter(uint8_t cCounter)
Wolfgang Betz 0:4fb29d9ee571 236 {
Wolfgang Betz 0:4fb29d9ee571 237 /* Writes the counter value for RX timeout in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 238 g_xStatus = SpiritSpiWriteRegisters(TIMERS4_RX_TIMEOUT_COUNTER_BASE, 1, &cCounter);
Wolfgang Betz 0:4fb29d9ee571 239
Wolfgang Betz 0:4fb29d9ee571 240 }
Wolfgang Betz 0:4fb29d9ee571 241
Wolfgang Betz 0:4fb29d9ee571 242
Wolfgang Betz 0:4fb29d9ee571 243 /**
Wolfgang Betz 0:4fb29d9ee571 244 * @brief Sets the RX timeout timer prescaler. If it is equal to 0 the timeout is infinite.
Wolfgang Betz 0:4fb29d9ee571 245 * @param cPrescaler value for the timer prescaler.
Wolfgang Betz 0:4fb29d9ee571 246 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 247 * @retval None
Wolfgang Betz 0:4fb29d9ee571 248 */
Wolfgang Betz 0:4fb29d9ee571 249 void SpiritTimerSetRxTimeoutPrescaler(uint8_t cPrescaler)
Wolfgang Betz 0:4fb29d9ee571 250 {
Wolfgang Betz 0:4fb29d9ee571 251 /* Writes the prescaler value for RX timeout in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 252 g_xStatus = SpiritSpiWriteRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 1, &cPrescaler);
Wolfgang Betz 0:4fb29d9ee571 253
Wolfgang Betz 0:4fb29d9ee571 254 }
Wolfgang Betz 0:4fb29d9ee571 255
Wolfgang Betz 0:4fb29d9ee571 256
Wolfgang Betz 0:4fb29d9ee571 257 /**
Wolfgang Betz 0:4fb29d9ee571 258 * @brief Returns the RX timeout timer.
Wolfgang Betz 0:4fb29d9ee571 259 * @param pfTimeoutMsec pointer to the variable in which the timeout expressed in milliseconds has to be stored.
Wolfgang Betz 0:4fb29d9ee571 260 * If the returned value is 0, it means that the RX_Timeout is infinite.
Wolfgang Betz 0:4fb29d9ee571 261 * This parameter must be a float*.
Wolfgang Betz 0:4fb29d9ee571 262 * @param pcCounter pointer to the variable in which the timer counter has to be stored.
Wolfgang Betz 0:4fb29d9ee571 263 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 264 * @param pcPrescaler pointer to the variable in which the timer prescaler has to be stored.
Wolfgang Betz 0:4fb29d9ee571 265 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 266 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 267 */
Wolfgang Betz 0:4fb29d9ee571 268 void SpiritTimerGetRxTimeout(float* pfTimeoutMsec, uint8_t* pcCounter , uint8_t* pcPrescaler)
Wolfgang Betz 0:4fb29d9ee571 269 {
Wolfgang Betz 0:4fb29d9ee571 270 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 271
Wolfgang Betz 0:4fb29d9ee571 272 /* Reads the RX timeout registers value */
Wolfgang Betz 0:4fb29d9ee571 273 g_xStatus = SpiritSpiReadRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 274
Wolfgang Betz 0:4fb29d9ee571 275 /* Returns values */
Wolfgang Betz 0:4fb29d9ee571 276 (*pcPrescaler) = tempRegValue[0];
Wolfgang Betz 0:4fb29d9ee571 277 (*pcCounter) = tempRegValue[1];
Wolfgang Betz 0:4fb29d9ee571 278
Wolfgang Betz 0:4fb29d9ee571 279 float nXtalFrequency = (float)SpiritRadioGetXtalFrequency();
Wolfgang Betz 0:4fb29d9ee571 280 if(nXtalFrequency>DOUBLE_XTAL_THR) {
Wolfgang Betz 0:4fb29d9ee571 281 nXtalFrequency /= 2.0;
Wolfgang Betz 0:4fb29d9ee571 282 }
Wolfgang Betz 0:4fb29d9ee571 283 nXtalFrequency /= 1000.0;
Wolfgang Betz 0:4fb29d9ee571 284 *pfTimeoutMsec = (float)((tempRegValue[0]+1)*tempRegValue[1]*(1210.0/nXtalFrequency));
Wolfgang Betz 0:4fb29d9ee571 285
Wolfgang Betz 0:4fb29d9ee571 286
Wolfgang Betz 0:4fb29d9ee571 287 }
Wolfgang Betz 0:4fb29d9ee571 288
Wolfgang Betz 0:4fb29d9ee571 289
Wolfgang Betz 0:4fb29d9ee571 290 /**
Wolfgang Betz 0:4fb29d9ee571 291 * @brief Sets the LDCR wake up timer initialization registers with the values of
Wolfgang Betz 0:4fb29d9ee571 292 * COUNTER and PRESCALER according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where
Wolfgang Betz 0:4fb29d9ee571 293 * Tck = 28.818 us. The minimum vale of the wakeup timeout is 28.818us (PRESCALER and
Wolfgang Betz 0:4fb29d9ee571 294 * COUNTER equals to 0) and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals
Wolfgang Betz 0:4fb29d9ee571 295 * to 255).
Wolfgang Betz 0:4fb29d9ee571 296 * @param cCounter value for the timer counter.
Wolfgang Betz 0:4fb29d9ee571 297 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 298 * @param cPrescaler value for the timer prescaler.
Wolfgang Betz 0:4fb29d9ee571 299 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 300 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 301 */
Wolfgang Betz 0:4fb29d9ee571 302 void SpiritTimerSetWakeUpTimer(uint8_t cCounter , uint8_t cPrescaler)
Wolfgang Betz 0:4fb29d9ee571 303 {
Wolfgang Betz 0:4fb29d9ee571 304 uint8_t tempRegValue[2]={cPrescaler,cCounter};
Wolfgang Betz 0:4fb29d9ee571 305
Wolfgang Betz 0:4fb29d9ee571 306 /* Writes the counter and prescaler value of wake-up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 307 g_xStatus = SpiritSpiWriteRegisters(TIMERS3_LDC_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 308
Wolfgang Betz 0:4fb29d9ee571 309 }
Wolfgang Betz 0:4fb29d9ee571 310
Wolfgang Betz 0:4fb29d9ee571 311
Wolfgang Betz 0:4fb29d9ee571 312 /**
Wolfgang Betz 0:4fb29d9ee571 313 * @brief Sets the LDCR wake up timer counter and prescaler from the desired value in ms,
Wolfgang Betz 0:4fb29d9ee571 314 * according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us.
Wolfgang Betz 0:4fb29d9ee571 315 * The minimum vale of the wakeup timeout is 28.818us (PRESCALER and COUNTER equals to 0)
Wolfgang Betz 0:4fb29d9ee571 316 * and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals to 255).
Wolfgang Betz 0:4fb29d9ee571 317 * @param fDesiredMsec desired timer value.
Wolfgang Betz 0:4fb29d9ee571 318 * This parameter must be a float.
Wolfgang Betz 0:4fb29d9ee571 319 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 320 */
Wolfgang Betz 0:4fb29d9ee571 321 void SpiritTimerSetWakeUpTimerMs(float fDesiredMsec)
Wolfgang Betz 0:4fb29d9ee571 322 {
Wolfgang Betz 0:4fb29d9ee571 323 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 324
Wolfgang Betz 0:4fb29d9ee571 325 /* Computes counter and prescaler */
Wolfgang Betz 0:4fb29d9ee571 326 SpiritTimerComputeWakeUpValues(fDesiredMsec , &tempRegValue[1] , &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 327
Wolfgang Betz 0:4fb29d9ee571 328 /* Writes the counter and prescaler value of wake-up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 329 g_xStatus = SpiritSpiWriteRegisters(TIMERS3_LDC_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 330
Wolfgang Betz 0:4fb29d9ee571 331 }
Wolfgang Betz 0:4fb29d9ee571 332
Wolfgang Betz 0:4fb29d9ee571 333
Wolfgang Betz 0:4fb29d9ee571 334 /**
Wolfgang Betz 0:4fb29d9ee571 335 * @brief Sets the LDCR wake up timer counter. Remember that this value is incresead by one in the Twu calculation.
Wolfgang Betz 0:4fb29d9ee571 336 * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us
Wolfgang Betz 0:4fb29d9ee571 337 * @param cCounter value for the timer counter.
Wolfgang Betz 0:4fb29d9ee571 338 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 339 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 340 */
Wolfgang Betz 0:4fb29d9ee571 341 void SpiritTimerSetWakeUpTimerCounter(uint8_t cCounter)
Wolfgang Betz 0:4fb29d9ee571 342 {
Wolfgang Betz 0:4fb29d9ee571 343 /* Writes the counter value for Wake_Up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 344 g_xStatus = SpiritSpiWriteRegisters(TIMERS2_LDC_COUNTER_BASE, 1, &cCounter);
Wolfgang Betz 0:4fb29d9ee571 345
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 * @brief Sets the LDCR wake up timer prescaler. Remember that this value is incresead by one in the Twu calculation.
Wolfgang Betz 0:4fb29d9ee571 351 * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us
Wolfgang Betz 0:4fb29d9ee571 352 * @param cPrescaler value for the timer prescaler.
Wolfgang Betz 0:4fb29d9ee571 353 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 354 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 355 */
Wolfgang Betz 0:4fb29d9ee571 356 void SpiritTimerSetWakeUpTimerPrescaler(uint8_t cPrescaler)
Wolfgang Betz 0:4fb29d9ee571 357 {
Wolfgang Betz 0:4fb29d9ee571 358 /* Writes the prescaler value for Wake_Up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 359 g_xStatus = SpiritSpiWriteRegisters(TIMERS3_LDC_PRESCALER_BASE, 1, &cPrescaler);
Wolfgang Betz 0:4fb29d9ee571 360
Wolfgang Betz 0:4fb29d9ee571 361 }
Wolfgang Betz 0:4fb29d9ee571 362
Wolfgang Betz 0:4fb29d9ee571 363
Wolfgang Betz 0:4fb29d9ee571 364 /**
Wolfgang Betz 0:4fb29d9ee571 365 * @brief Returns the LDCR wake up timer, according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us.
Wolfgang Betz 0:4fb29d9ee571 366 * @param pfWakeUpMsec pointer to the variable in which the wake-up time expressed in milliseconds has to be stored.
Wolfgang Betz 0:4fb29d9ee571 367 * This parameter must be a float*.
Wolfgang Betz 0:4fb29d9ee571 368 * @param pcCounter pointer to the variable in which the timer counter has to be stored.
Wolfgang Betz 0:4fb29d9ee571 369 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 370 * @param pcPrescaler pointer to the variable in which the timer prescaler has to be stored.
Wolfgang Betz 0:4fb29d9ee571 371 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 372 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 373 */
Wolfgang Betz 0:4fb29d9ee571 374 void SpiritTimerGetWakeUpTimer(float* pfWakeUpMsec, uint8_t* pcCounter , uint8_t* pcPrescaler)
Wolfgang Betz 0:4fb29d9ee571 375 {
Wolfgang Betz 0:4fb29d9ee571 376 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 377 //uint32_t xtal=SpiritRadioGetXtalFrequency();
Wolfgang Betz 0:4fb29d9ee571 378 float rco_freq;
Wolfgang Betz 0:4fb29d9ee571 379
Wolfgang Betz 0:4fb29d9ee571 380 rco_freq=(float)SpiritTimerGetRcoFrequency();
Wolfgang Betz 0:4fb29d9ee571 381
Wolfgang Betz 0:4fb29d9ee571 382 /* Reads the Wake_Up timer registers value */
Wolfgang Betz 0:4fb29d9ee571 383 g_xStatus = SpiritSpiReadRegisters(TIMERS3_LDC_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 384
Wolfgang Betz 0:4fb29d9ee571 385 /* Returns values */
Wolfgang Betz 0:4fb29d9ee571 386 (*pcPrescaler)=tempRegValue[0];
Wolfgang Betz 0:4fb29d9ee571 387 (*pcCounter)=tempRegValue[1];
Wolfgang Betz 0:4fb29d9ee571 388 *pfWakeUpMsec = (float)((((*pcPrescaler)+1)*((*pcCounter)+1)*(1000.0/rco_freq)));
Wolfgang Betz 0:4fb29d9ee571 389
Wolfgang Betz 0:4fb29d9ee571 390 }
Wolfgang Betz 0:4fb29d9ee571 391
Wolfgang Betz 0:4fb29d9ee571 392
Wolfgang Betz 0:4fb29d9ee571 393 /**
Wolfgang Betz 0:4fb29d9ee571 394 * @brief Sets the LDCR wake up timer reloading registers with the values of
Wolfgang Betz 0:4fb29d9ee571 395 * COUNTER and PRESCALER according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where
Wolfgang Betz 0:4fb29d9ee571 396 * Tck = 28.818 us. The minimum vale of the wakeup timeout is 28.818us (PRESCALER and
Wolfgang Betz 0:4fb29d9ee571 397 * COUNTER equals to 0) and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals
Wolfgang Betz 0:4fb29d9ee571 398 * to 255).
Wolfgang Betz 0:4fb29d9ee571 399 * @param cCounter reload value for the timer counter.
Wolfgang Betz 0:4fb29d9ee571 400 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 401 * @param cPrescaler reload value for the timer prescaler.
Wolfgang Betz 0:4fb29d9ee571 402 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 403 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 404 */
Wolfgang Betz 0:4fb29d9ee571 405 void SpiritTimerSetWakeUpTimerReload(uint8_t cCounter , uint8_t cPrescaler)
Wolfgang Betz 0:4fb29d9ee571 406 {
Wolfgang Betz 0:4fb29d9ee571 407 uint8_t tempRegValue[2]={cPrescaler,cCounter};
Wolfgang Betz 0:4fb29d9ee571 408
Wolfgang Betz 0:4fb29d9ee571 409 /* Writes the counter and prescaler value of reload wake-up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 410 g_xStatus = SpiritSpiWriteRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 411
Wolfgang Betz 0:4fb29d9ee571 412 }
Wolfgang Betz 0:4fb29d9ee571 413
Wolfgang Betz 0:4fb29d9ee571 414
Wolfgang Betz 0:4fb29d9ee571 415 /**
Wolfgang Betz 0:4fb29d9ee571 416 * @brief Sets the LDCR wake up reload timer counter and prescaler from the desired value in ms,
Wolfgang Betz 0:4fb29d9ee571 417 * according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us.
Wolfgang Betz 0:4fb29d9ee571 418 * The minimum vale of the wakeup timeout is 28.818us (PRESCALER and COUNTER equals to 0)
Wolfgang Betz 0:4fb29d9ee571 419 * and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals to 255).
Wolfgang Betz 0:4fb29d9ee571 420 * @param fDesiredMsec desired timer value.
Wolfgang Betz 0:4fb29d9ee571 421 * This parameter must be a float.
Wolfgang Betz 0:4fb29d9ee571 422 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 423 */
Wolfgang Betz 0:4fb29d9ee571 424 void SpiritTimerSetWakeUpTimerReloadMs(float fDesiredMsec)
Wolfgang Betz 0:4fb29d9ee571 425 {
Wolfgang Betz 0:4fb29d9ee571 426 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 427
Wolfgang Betz 0:4fb29d9ee571 428 /* Computes counter and prescaler */
Wolfgang Betz 0:4fb29d9ee571 429 SpiritTimerComputeWakeUpValues(fDesiredMsec , &tempRegValue[1] , &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 430
Wolfgang Betz 0:4fb29d9ee571 431 /* Writes the counter and prescaler value of reload wake-up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 432 g_xStatus = SpiritSpiWriteRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 433
Wolfgang Betz 0:4fb29d9ee571 434 }
Wolfgang Betz 0:4fb29d9ee571 435
Wolfgang Betz 0:4fb29d9ee571 436
Wolfgang Betz 0:4fb29d9ee571 437 /**
Wolfgang Betz 0:4fb29d9ee571 438 * @brief Sets the LDCR wake up timer reload counter. Remember that this value is incresead by one in the Twu calculation.
Wolfgang Betz 0:4fb29d9ee571 439 * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us
Wolfgang Betz 0:4fb29d9ee571 440 * @param cCounter value for the timer counter.
Wolfgang Betz 0:4fb29d9ee571 441 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 442 * @retval None
Wolfgang Betz 0:4fb29d9ee571 443 */
Wolfgang Betz 0:4fb29d9ee571 444 void SpiritTimerSetWakeUpTimerReloadCounter(uint8_t cCounter)
Wolfgang Betz 0:4fb29d9ee571 445 {
Wolfgang Betz 0:4fb29d9ee571 446 /* Writes the counter value for reload Wake_Up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 447 g_xStatus = SpiritSpiWriteRegisters(TIMERS0_LDC_RELOAD_COUNTER_BASE, 1, &cCounter);
Wolfgang Betz 0:4fb29d9ee571 448
Wolfgang Betz 0:4fb29d9ee571 449 }
Wolfgang Betz 0:4fb29d9ee571 450
Wolfgang Betz 0:4fb29d9ee571 451
Wolfgang Betz 0:4fb29d9ee571 452 /**
Wolfgang Betz 0:4fb29d9ee571 453 * @brief Sets the LDCR wake up timer reload prescaler. Remember that this value is incresead by one in the Twu calculation.
Wolfgang Betz 0:4fb29d9ee571 454 * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us
Wolfgang Betz 0:4fb29d9ee571 455 * @param cPrescaler value for the timer prescaler.
Wolfgang Betz 0:4fb29d9ee571 456 * This parameter must be an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 457 * @retval None
Wolfgang Betz 0:4fb29d9ee571 458 */
Wolfgang Betz 0:4fb29d9ee571 459 void SpiritTimerSetWakeUpTimerReloadPrescaler(uint8_t cPrescaler)
Wolfgang Betz 0:4fb29d9ee571 460 {
Wolfgang Betz 0:4fb29d9ee571 461 /* Writes the prescaler value for reload Wake_Up timer in the corresponding register */
Wolfgang Betz 0:4fb29d9ee571 462 g_xStatus = SpiritSpiWriteRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 1, &cPrescaler);
Wolfgang Betz 0:4fb29d9ee571 463
Wolfgang Betz 0:4fb29d9ee571 464 }
Wolfgang Betz 0:4fb29d9ee571 465
Wolfgang Betz 0:4fb29d9ee571 466
Wolfgang Betz 0:4fb29d9ee571 467 /**
Wolfgang Betz 0:4fb29d9ee571 468 * @brief Returns the LDCR wake up reload timer, according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us.
Wolfgang Betz 0:4fb29d9ee571 469 * @param pfWakeUpReloadMsec pointer to the variable in which the wake-up reload time expressed in milliseconds has to be stored.
Wolfgang Betz 0:4fb29d9ee571 470 * This parameter must be a float*.
Wolfgang Betz 0:4fb29d9ee571 471 * @param pcCounter pointer to the variable in which the timer counter has to be stored.
Wolfgang Betz 0:4fb29d9ee571 472 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 473 * @param pcPrescaler pointer to the variable in which the timer prescaler has to be stored.
Wolfgang Betz 0:4fb29d9ee571 474 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 475 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 476 */
Wolfgang Betz 0:4fb29d9ee571 477 void SpiritTimerGetWakeUpTimerReload(float* pfWakeUpReloadMsec, uint8_t* pcCounter , uint8_t* pcPrescaler)
Wolfgang Betz 0:4fb29d9ee571 478 {
Wolfgang Betz 0:4fb29d9ee571 479 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 480 //uint32_t xtal=SpiritRadioGetXtalFrequency();
Wolfgang Betz 0:4fb29d9ee571 481 float rco_freq;
Wolfgang Betz 0:4fb29d9ee571 482
Wolfgang Betz 0:4fb29d9ee571 483 rco_freq=(float)SpiritTimerGetRcoFrequency();
Wolfgang Betz 0:4fb29d9ee571 484
Wolfgang Betz 0:4fb29d9ee571 485 /* Reads the reload Wake_Up timer registers value */
Wolfgang Betz 0:4fb29d9ee571 486 g_xStatus = SpiritSpiReadRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 487
Wolfgang Betz 0:4fb29d9ee571 488 /* Returns values */
Wolfgang Betz 0:4fb29d9ee571 489 (*pcPrescaler)=tempRegValue[0];
Wolfgang Betz 0:4fb29d9ee571 490 (*pcCounter)=tempRegValue[1];
Wolfgang Betz 0:4fb29d9ee571 491 *pfWakeUpReloadMsec = (float)((((*pcPrescaler)+1)*((*pcCounter)+1)*(1000.0/rco_freq)));
Wolfgang Betz 0:4fb29d9ee571 492
Wolfgang Betz 0:4fb29d9ee571 493 }
Wolfgang Betz 0:4fb29d9ee571 494
Wolfgang Betz 0:4fb29d9ee571 495 /**
Wolfgang Betz 0:4fb29d9ee571 496 * @brief Computes and returns the RCO frequency.
Wolfgang Betz 0:4fb29d9ee571 497 * This frequency depends on the xtal frequency and the XTAL bit in register 0x01.
Wolfgang Betz 0:4fb29d9ee571 498 * @retval RCO frequency in Hz as an uint16_t.
Wolfgang Betz 0:4fb29d9ee571 499 */
Wolfgang Betz 0:4fb29d9ee571 500 uint16_t SpiritTimerGetRcoFrequency(void)
Wolfgang Betz 0:4fb29d9ee571 501 {
Wolfgang Betz 0:4fb29d9ee571 502 uint16_t rco_freq=34700;
Wolfgang Betz 0:4fb29d9ee571 503 uint32_t xtal=SpiritRadioGetXtalFrequency();
Wolfgang Betz 0:4fb29d9ee571 504
Wolfgang Betz 0:4fb29d9ee571 505 if(xtal>30000000) xtal/=2;
Wolfgang Betz 0:4fb29d9ee571 506
Wolfgang Betz 0:4fb29d9ee571 507 if(xtal==25000000)
Wolfgang Betz 0:4fb29d9ee571 508 {
Wolfgang Betz 0:4fb29d9ee571 509 uint8_t xtal_flag;
Wolfgang Betz 0:4fb29d9ee571 510 SpiritSpiReadRegisters(0x01, 1, &xtal_flag);
Wolfgang Betz 0:4fb29d9ee571 511 xtal_flag=(xtal_flag&0x40);
Wolfgang Betz 0:4fb29d9ee571 512
Wolfgang Betz 0:4fb29d9ee571 513 if(xtal_flag==0)
Wolfgang Betz 0:4fb29d9ee571 514 {
Wolfgang Betz 0:4fb29d9ee571 515 rco_freq=36100;
Wolfgang Betz 0:4fb29d9ee571 516 }
Wolfgang Betz 0:4fb29d9ee571 517 else
Wolfgang Betz 0:4fb29d9ee571 518 {
Wolfgang Betz 0:4fb29d9ee571 519 rco_freq=33300;
Wolfgang Betz 0:4fb29d9ee571 520 }
Wolfgang Betz 0:4fb29d9ee571 521 }
Wolfgang Betz 0:4fb29d9ee571 522
Wolfgang Betz 0:4fb29d9ee571 523 return rco_freq;
Wolfgang Betz 0:4fb29d9ee571 524 }
Wolfgang Betz 0:4fb29d9ee571 525
Wolfgang Betz 0:4fb29d9ee571 526 /**
Wolfgang Betz 0:4fb29d9ee571 527 * @brief Computes the values of the wakeup timer counter and prescaler from the user time expressed in millisecond.
Wolfgang Betz 0:4fb29d9ee571 528 * The prescaler and the counter values are computed maintaining the prescaler value as
Wolfgang Betz 0:4fb29d9ee571 529 * small as possible in order to obtain the best resolution, and in the meantime minimizing the error.
Wolfgang Betz 0:4fb29d9ee571 530 * @param fDesiredMsec desired wakeup timeout in millisecs.
Wolfgang Betz 0:4fb29d9ee571 531 * This parameter must be a float. Since the counter and prescaler are 8 bit registers the maximum
Wolfgang Betz 0:4fb29d9ee571 532 * reachable value is maxTime = fTclk x 256 x 256.
Wolfgang Betz 0:4fb29d9ee571 533 * @param pcCounter pointer to the variable in which the value for the wakeup timer counter has to be stored.
Wolfgang Betz 0:4fb29d9ee571 534 * This parameter must be a uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 535 * @param pcPrescaler pointer to the variable in which the value for the wakeup timer prescaler has to be stored.
Wolfgang Betz 0:4fb29d9ee571 536 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 537 * @retval None
Wolfgang Betz 0:4fb29d9ee571 538 */
Wolfgang Betz 0:4fb29d9ee571 539 void SpiritTimerComputeWakeUpValues(float fDesiredMsec , uint8_t* pcCounter , uint8_t* pcPrescaler)
Wolfgang Betz 0:4fb29d9ee571 540 {
Wolfgang Betz 0:4fb29d9ee571 541 float rco_freq,err;
Wolfgang Betz 0:4fb29d9ee571 542 uint32_t n;
Wolfgang Betz 0:4fb29d9ee571 543
Wolfgang Betz 0:4fb29d9ee571 544 rco_freq=((float)SpiritTimerGetRcoFrequency())/1000;
Wolfgang Betz 0:4fb29d9ee571 545
Wolfgang Betz 0:4fb29d9ee571 546 /* N cycles in the time base of the timer:
Wolfgang Betz 0:4fb29d9ee571 547 - clock of the timer is RCO frequency
Wolfgang Betz 0:4fb29d9ee571 548 - divide times 1000 more because we have an input in ms (variable rco_freq is already this frequency divided by 1000)
Wolfgang Betz 0:4fb29d9ee571 549 */
Wolfgang Betz 0:4fb29d9ee571 550 n=(uint32_t)(fDesiredMsec*rco_freq);
Wolfgang Betz 0:4fb29d9ee571 551
Wolfgang Betz 0:4fb29d9ee571 552 /* check if it is possible to reach that target with prescaler and counter of spirit1 */
Wolfgang Betz 0:4fb29d9ee571 553 if(n/0xFF>0xFD)
Wolfgang Betz 0:4fb29d9ee571 554 {
Wolfgang Betz 0:4fb29d9ee571 555 /* if not return the maximum possible value */
Wolfgang Betz 0:4fb29d9ee571 556 (*pcCounter) = 0xFF;
Wolfgang Betz 0:4fb29d9ee571 557 (*pcPrescaler) = 0xFF;
Wolfgang Betz 0:4fb29d9ee571 558 return;
Wolfgang Betz 0:4fb29d9ee571 559 }
Wolfgang Betz 0:4fb29d9ee571 560
Wolfgang Betz 0:4fb29d9ee571 561 /* prescaler is really 2 as min value */
Wolfgang Betz 0:4fb29d9ee571 562 (*pcPrescaler)=(n/0xFF)+2;
Wolfgang Betz 0:4fb29d9ee571 563 (*pcCounter) = n / (*pcPrescaler);
Wolfgang Betz 0:4fb29d9ee571 564
Wolfgang Betz 0:4fb29d9ee571 565 /* check if the error is minimum */
Wolfgang Betz 0:4fb29d9ee571 566 err=S_ABS((float)(*pcCounter)*(*pcPrescaler)/rco_freq-fDesiredMsec);
Wolfgang Betz 0:4fb29d9ee571 567
Wolfgang Betz 0:4fb29d9ee571 568 if((*pcCounter)<=254)
Wolfgang Betz 0:4fb29d9ee571 569 {
Wolfgang Betz 0:4fb29d9ee571 570 if(S_ABS((float)((*pcCounter)+1)*(*pcPrescaler)/rco_freq-fDesiredMsec)<err)
Wolfgang Betz 0:4fb29d9ee571 571 (*pcCounter)=(*pcCounter)+1;
Wolfgang Betz 0:4fb29d9ee571 572 }
Wolfgang Betz 0:4fb29d9ee571 573
Wolfgang Betz 0:4fb29d9ee571 574 /* decrement prescaler and counter according to the logic of this timer in spirit1 */
Wolfgang Betz 0:4fb29d9ee571 575 (*pcPrescaler)--;
Wolfgang Betz 0:4fb29d9ee571 576 if((*pcCounter)>1)
Wolfgang Betz 0:4fb29d9ee571 577 (*pcCounter)--;
Wolfgang Betz 0:4fb29d9ee571 578 else
Wolfgang Betz 0:4fb29d9ee571 579 (*pcCounter)=1;
Wolfgang Betz 0:4fb29d9ee571 580 }
Wolfgang Betz 0:4fb29d9ee571 581
Wolfgang Betz 0:4fb29d9ee571 582
Wolfgang Betz 0:4fb29d9ee571 583 /**
Wolfgang Betz 0:4fb29d9ee571 584 * @brief Computes the values of the rx_timeout timer counter and prescaler from the user time expressed in millisecond.
Wolfgang Betz 0:4fb29d9ee571 585 * The prescaler and the counter values are computed maintaining the prescaler value as
Wolfgang Betz 0:4fb29d9ee571 586 * small as possible in order to obtain the best resolution, and in the meantime minimizing the error.
Wolfgang Betz 0:4fb29d9ee571 587 * @param fDesiredMsec desired rx_timeout in millisecs.
Wolfgang Betz 0:4fb29d9ee571 588 * This parameter must be a float. Since the counter and prescaler are 8 bit registers the maximum
Wolfgang Betz 0:4fb29d9ee571 589 * reachable value is maxTime = fTclk x 255 x 255.
Wolfgang Betz 0:4fb29d9ee571 590 * @param pcCounter pointer to the variable in which the value for the rx_timeout counter has to be stored.
Wolfgang Betz 0:4fb29d9ee571 591 * This parameter must be a uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 592 * @param pcPrescaler pointer to the variable in which the value for the rx_timeout prescaler has to be stored.
Wolfgang Betz 0:4fb29d9ee571 593 * This parameter must be an uint8_t*.
Wolfgang Betz 0:4fb29d9ee571 594 * @retval None
Wolfgang Betz 0:4fb29d9ee571 595 */
Wolfgang Betz 0:4fb29d9ee571 596 void SpiritTimerComputeRxTimeoutValues(float fDesiredMsec , uint8_t* pcCounter , uint8_t* pcPrescaler)
Wolfgang Betz 0:4fb29d9ee571 597 {
Wolfgang Betz 0:4fb29d9ee571 598 uint32_t nXtalFrequency = SpiritRadioGetXtalFrequency();
Wolfgang Betz 0:4fb29d9ee571 599 uint32_t n;
Wolfgang Betz 0:4fb29d9ee571 600 float err;
Wolfgang Betz 0:4fb29d9ee571 601
Wolfgang Betz 0:4fb29d9ee571 602 /* if xtal is doubled divide it by 2 */
Wolfgang Betz 0:4fb29d9ee571 603 if(nXtalFrequency>DOUBLE_XTAL_THR) {
Wolfgang Betz 0:4fb29d9ee571 604 nXtalFrequency >>= 1;
Wolfgang Betz 0:4fb29d9ee571 605 }
Wolfgang Betz 0:4fb29d9ee571 606
Wolfgang Betz 0:4fb29d9ee571 607 /* N cycles in the time base of the timer:
Wolfgang Betz 0:4fb29d9ee571 608 - clock of the timer is xtal/1210
Wolfgang Betz 0:4fb29d9ee571 609 - divide times 1000 more because we have an input in ms
Wolfgang Betz 0:4fb29d9ee571 610 */
Wolfgang Betz 0:4fb29d9ee571 611 n=(uint32_t)(fDesiredMsec*nXtalFrequency/1210000);
Wolfgang Betz 0:4fb29d9ee571 612
Wolfgang Betz 0:4fb29d9ee571 613 /* check if it is possible to reach that target with prescaler and counter of spirit1 */
Wolfgang Betz 0:4fb29d9ee571 614 if(n/0xFF>0xFD)
Wolfgang Betz 0:4fb29d9ee571 615 {
Wolfgang Betz 0:4fb29d9ee571 616 /* if not return the maximum possible value */
Wolfgang Betz 0:4fb29d9ee571 617 (*pcCounter) = 0xFF;
Wolfgang Betz 0:4fb29d9ee571 618 (*pcPrescaler) = 0xFF;
Wolfgang Betz 0:4fb29d9ee571 619 return;
Wolfgang Betz 0:4fb29d9ee571 620 }
Wolfgang Betz 0:4fb29d9ee571 621
Wolfgang Betz 0:4fb29d9ee571 622 /* prescaler is really 2 as min value */
Wolfgang Betz 0:4fb29d9ee571 623 (*pcPrescaler)=(n/0xFF)+2;
Wolfgang Betz 0:4fb29d9ee571 624 (*pcCounter) = n / (*pcPrescaler);
Wolfgang Betz 0:4fb29d9ee571 625
Wolfgang Betz 0:4fb29d9ee571 626 /* check if the error is minimum */
Wolfgang Betz 0:4fb29d9ee571 627 err=S_ABS((float)(*pcCounter)*(*pcPrescaler)*1210000/nXtalFrequency-fDesiredMsec);
Wolfgang Betz 0:4fb29d9ee571 628
Wolfgang Betz 0:4fb29d9ee571 629 if((*pcCounter)<=254)
Wolfgang Betz 0:4fb29d9ee571 630 {
Wolfgang Betz 0:4fb29d9ee571 631 if(S_ABS((float)((*pcCounter)+1)*(*pcPrescaler)*1210000/nXtalFrequency-fDesiredMsec)<err)
Wolfgang Betz 0:4fb29d9ee571 632 (*pcCounter)=(*pcCounter)+1;
Wolfgang Betz 0:4fb29d9ee571 633 }
Wolfgang Betz 0:4fb29d9ee571 634
Wolfgang Betz 0:4fb29d9ee571 635 /* decrement prescaler and counter according to the logic of this timer in spirit1 */
Wolfgang Betz 0:4fb29d9ee571 636 (*pcPrescaler)--;
Wolfgang Betz 0:4fb29d9ee571 637 if((*pcCounter)>1)
Wolfgang Betz 0:4fb29d9ee571 638 (*pcCounter)--;
Wolfgang Betz 0:4fb29d9ee571 639 else
Wolfgang Betz 0:4fb29d9ee571 640 (*pcCounter)=1;
Wolfgang Betz 0:4fb29d9ee571 641 }
Wolfgang Betz 0:4fb29d9ee571 642
Wolfgang Betz 0:4fb29d9ee571 643
Wolfgang Betz 0:4fb29d9ee571 644 /**
Wolfgang Betz 0:4fb29d9ee571 645 * @brief Sets the RX timeout stop conditions.
Wolfgang Betz 0:4fb29d9ee571 646 * @param xStopCondition new stop condition.
Wolfgang Betz 0:4fb29d9ee571 647 * This parameter can be any value of @ref RxTimeoutStopCondition.
Wolfgang Betz 0:4fb29d9ee571 648 * @retval None
Wolfgang Betz 0:4fb29d9ee571 649 */
Wolfgang Betz 0:4fb29d9ee571 650 void SpiritTimerSetRxTimeoutStopCondition(RxTimeoutStopCondition xStopCondition)
Wolfgang Betz 0:4fb29d9ee571 651 {
Wolfgang Betz 0:4fb29d9ee571 652 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 653
Wolfgang Betz 0:4fb29d9ee571 654 /* Check the parameters */
Wolfgang Betz 0:4fb29d9ee571 655 s_assert_param(IS_RX_TIMEOUT_STOP_CONDITION(xStopCondition));
Wolfgang Betz 0:4fb29d9ee571 656
Wolfgang Betz 0:4fb29d9ee571 657 /* Reads value on the PKT_FLT_OPTIONS and PROTOCOL2 register */
Wolfgang Betz 0:4fb29d9ee571 658 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 659
Wolfgang Betz 0:4fb29d9ee571 660 tempRegValue[0] &= 0xBF;
Wolfgang Betz 0:4fb29d9ee571 661 tempRegValue[0] |= ((xStopCondition & 0x08) << 3);
Wolfgang Betz 0:4fb29d9ee571 662
Wolfgang Betz 0:4fb29d9ee571 663 tempRegValue[1] &= 0x1F;
Wolfgang Betz 0:4fb29d9ee571 664 tempRegValue[1] |= (xStopCondition << 5);
Wolfgang Betz 0:4fb29d9ee571 665
Wolfgang Betz 0:4fb29d9ee571 666 /* Writes value on the PKT_FLT_OPTIONS and PROTOCOL2 register */
Wolfgang Betz 0:4fb29d9ee571 667 g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 668
Wolfgang Betz 0:4fb29d9ee571 669 }
Wolfgang Betz 0:4fb29d9ee571 670
Wolfgang Betz 0:4fb29d9ee571 671 /**
Wolfgang Betz 0:4fb29d9ee571 672 * @brief Sends the LDC_RELOAD command to SPIRIT. Reload the LDC timer with the value stored in the LDC_PRESCALER / COUNTER registers.
Wolfgang Betz 0:4fb29d9ee571 673 * @param None.
Wolfgang Betz 0:4fb29d9ee571 674 * @retval None
Wolfgang Betz 0:4fb29d9ee571 675 */
Wolfgang Betz 0:4fb29d9ee571 676 void SpiritTimerReloadStrobe(void)
Wolfgang Betz 0:4fb29d9ee571 677 {
Wolfgang Betz 0:4fb29d9ee571 678 /* Sends the CMD_LDC_RELOAD command */
Wolfgang Betz 0:4fb29d9ee571 679 g_xStatus = SpiritSpiCommandStrobes(COMMAND_LDC_RELOAD);
Wolfgang Betz 0:4fb29d9ee571 680
Wolfgang Betz 0:4fb29d9ee571 681 }
Wolfgang Betz 0:4fb29d9ee571 682
Wolfgang Betz 0:4fb29d9ee571 683
Wolfgang Betz 0:4fb29d9ee571 684 /**
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 *@}
Wolfgang Betz 0:4fb29d9ee571 691 */
Wolfgang Betz 0:4fb29d9ee571 692
Wolfgang Betz 0:4fb29d9ee571 693
Wolfgang Betz 0:4fb29d9ee571 694 /**
Wolfgang Betz 0:4fb29d9ee571 695 *@}
Wolfgang Betz 0:4fb29d9ee571 696 */
Wolfgang Betz 0:4fb29d9ee571 697
Wolfgang Betz 0:4fb29d9ee571 698
Wolfgang Betz 0:4fb29d9ee571 699
Wolfgang Betz 0:4fb29d9ee571 700 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/