HelloWorld_IDS01A4 mbed application for Spirit1 P2P demo.

Dependencies:   mbed

Fork of HelloWorld_IDS01A5_Program by rosarium pila

mbed 2.0 (a.k.a classic) HelloWorld example for Spirit1 to transfer data from one node to another.
To send the predefined data packet from the sender to the receiver, user needs to press User Button on the board. The LED on the receiver expansion board will toggle on reception of data successfully.
Data packets sent and received can be seen on USB serial terminal.

EVALUATION BOARDS RF FREQUENCY DESCRIPTION :
X-NUCLEO-IDS01A4 868 MHz 868 MHz RF expansion board based on SPIRIT1

Committer:
rosarium
Date:
Thu May 25 16:38:55 2017 +0000
Revision:
0:2ddc0583bcec
First draft version of HelloWorld_IDS01A5

Who changed what in which revision?

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