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 Jul 06 11:13:31 2017 +0200
Revision:
67:93bec0baf1de
Parent:
34:edda6a7238ec
Clarify some comments

Who changed what in which revision?

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