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:
Tue Nov 22 11:40:10 2016 +0100
Revision:
34:edda6a7238ec
Child:
67:93bec0baf1de
Perform re-naming

Who changed what in which revision?

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