ST / stm-spirit1-rf-driver

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_Csma.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 CSMA.
Wolfgang Betz 67:93bec0baf1de 8 * @details
Wolfgang Betz 67:93bec0baf1de 9 * @attention
Wolfgang Betz 67:93bec0baf1de 10 *
Wolfgang Betz 67:93bec0baf1de 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Wolfgang Betz 67:93bec0baf1de 12 *
Wolfgang Betz 67:93bec0baf1de 13 * Redistribution and use in source and binary forms, with or without modification,
Wolfgang Betz 67:93bec0baf1de 14 * are permitted provided that the following conditions are met:
Wolfgang Betz 67:93bec0baf1de 15 * 1. Redistributions of source code must retain the above copyright notice,
Wolfgang Betz 67:93bec0baf1de 16 * this list of conditions and the following disclaimer.
Wolfgang Betz 67:93bec0baf1de 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
Wolfgang Betz 67:93bec0baf1de 18 * this list of conditions and the following disclaimer in the documentation
Wolfgang Betz 67:93bec0baf1de 19 * and/or other materials provided with the distribution.
Wolfgang Betz 67:93bec0baf1de 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Wolfgang Betz 67:93bec0baf1de 21 * may be used to endorse or promote products derived from this software
Wolfgang Betz 67:93bec0baf1de 22 * without specific prior written permission.
Wolfgang Betz 67:93bec0baf1de 23 *
Wolfgang Betz 67:93bec0baf1de 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Wolfgang Betz 67:93bec0baf1de 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Wolfgang Betz 67:93bec0baf1de 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Wolfgang Betz 67:93bec0baf1de 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Wolfgang Betz 67:93bec0baf1de 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Wolfgang Betz 67:93bec0baf1de 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Wolfgang Betz 67:93bec0baf1de 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Wolfgang Betz 67:93bec0baf1de 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Wolfgang Betz 67:93bec0baf1de 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Wolfgang Betz 67:93bec0baf1de 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wolfgang Betz 67:93bec0baf1de 34 *
Wolfgang Betz 67:93bec0baf1de 35 ******************************************************************************
Wolfgang Betz 67:93bec0baf1de 36 */
Wolfgang Betz 67:93bec0baf1de 37
Wolfgang Betz 67:93bec0baf1de 38 /* Includes ------------------------------------------------------------------*/
Wolfgang Betz 67:93bec0baf1de 39 #include "SPIRIT_Csma.h"
Wolfgang Betz 67:93bec0baf1de 40 #include "MCU_Interface.h"
Wolfgang Betz 67:93bec0baf1de 41
Wolfgang Betz 67:93bec0baf1de 42
Wolfgang Betz 67:93bec0baf1de 43 /**
Wolfgang Betz 67:93bec0baf1de 44 * @addtogroup SPIRIT_Libraries
Wolfgang Betz 67:93bec0baf1de 45 * @{
Wolfgang Betz 67:93bec0baf1de 46 */
Wolfgang Betz 67:93bec0baf1de 47
Wolfgang Betz 67:93bec0baf1de 48
Wolfgang Betz 67:93bec0baf1de 49 /**
Wolfgang Betz 67:93bec0baf1de 50 * @addtogroup SPIRIT_Csma
Wolfgang Betz 67:93bec0baf1de 51 * @{
Wolfgang Betz 67:93bec0baf1de 52 */
Wolfgang Betz 67:93bec0baf1de 53
Wolfgang Betz 67:93bec0baf1de 54
Wolfgang Betz 67:93bec0baf1de 55 /**
Wolfgang Betz 67:93bec0baf1de 56 * @defgroup Csma_Private_TypesDefinitions CSMA Private TypesDefinitions
Wolfgang Betz 67:93bec0baf1de 57 * @{
Wolfgang Betz 67:93bec0baf1de 58 */
Wolfgang Betz 67:93bec0baf1de 59
Wolfgang Betz 67:93bec0baf1de 60
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 * @defgroup Csma_Private_Defines CSMA Private Defines
Wolfgang Betz 67:93bec0baf1de 68 * @{
Wolfgang Betz 67:93bec0baf1de 69 */
Wolfgang Betz 67:93bec0baf1de 70
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 * @defgroup Csma_Private_Macros CSMA Private Macros
Wolfgang Betz 67:93bec0baf1de 78 * @{
Wolfgang Betz 67:93bec0baf1de 79 */
Wolfgang Betz 67:93bec0baf1de 80
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 * @defgroup Csma_Private_Variables CSMA Private Variables
Wolfgang Betz 67:93bec0baf1de 88 * @{
Wolfgang Betz 67:93bec0baf1de 89 */
Wolfgang Betz 67:93bec0baf1de 90
Wolfgang Betz 67:93bec0baf1de 91 /**
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 * @defgroup Csma_Private_FunctionPrototypes CSMA Private FunctionPrototypes
Wolfgang Betz 67:93bec0baf1de 99 * @{
Wolfgang Betz 67:93bec0baf1de 100 */
Wolfgang Betz 67:93bec0baf1de 101
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 * @defgroup Csma_Private_Functions CSMA Private Functions
Wolfgang Betz 67:93bec0baf1de 109 * @{
Wolfgang Betz 67:93bec0baf1de 110 */
Wolfgang Betz 67:93bec0baf1de 111
Wolfgang Betz 67:93bec0baf1de 112
Wolfgang Betz 67:93bec0baf1de 113 /**
Wolfgang Betz 67:93bec0baf1de 114 * @brief Initializes the SPIRIT CSMA according to the specified parameters in the CsmaInit.
Wolfgang Betz 67:93bec0baf1de 115 * @param pxCsmaInit Csma init structure.
Wolfgang Betz 67:93bec0baf1de 116 * This parameter is a pointer to @ref CsmaInit.
Wolfgang Betz 67:93bec0baf1de 117 * @retval None.
Wolfgang Betz 67:93bec0baf1de 118 */
Wolfgang Betz 67:93bec0baf1de 119 void SpiritCsmaInit(CsmaInit* pxCsmaInit)
Wolfgang Betz 67:93bec0baf1de 120 {
Wolfgang Betz 67:93bec0baf1de 121 uint8_t tempRegValue[5];
Wolfgang Betz 67:93bec0baf1de 122
Wolfgang Betz 67:93bec0baf1de 123 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 124 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxCsmaInit->xCsmaPersistentMode));
Wolfgang Betz 67:93bec0baf1de 125 s_assert_param(IS_CCA_PERIOD(pxCsmaInit->xMultiplierTbit));
Wolfgang Betz 67:93bec0baf1de 126 s_assert_param(IS_CSMA_LENGTH(pxCsmaInit->xCcaLength));
Wolfgang Betz 67:93bec0baf1de 127 s_assert_param(IS_BU_COUNTER_SEED(pxCsmaInit->nBuCounterSeed));
Wolfgang Betz 67:93bec0baf1de 128 s_assert_param(IS_BU_PRESCALER(pxCsmaInit->cBuPrescaler));
Wolfgang Betz 67:93bec0baf1de 129 s_assert_param(IS_CMAX_NB(pxCsmaInit->cMaxNb));
Wolfgang Betz 67:93bec0baf1de 130
Wolfgang Betz 67:93bec0baf1de 131 /* CSMA BU counter seed (MSB) config */
Wolfgang Betz 67:93bec0baf1de 132 tempRegValue[0] = (uint8_t)(pxCsmaInit->nBuCounterSeed >> 8);
Wolfgang Betz 67:93bec0baf1de 133
Wolfgang Betz 67:93bec0baf1de 134 /* CSMA BU counter seed (LSB) config */
Wolfgang Betz 67:93bec0baf1de 135 tempRegValue[1] = (uint8_t) pxCsmaInit->nBuCounterSeed;
Wolfgang Betz 67:93bec0baf1de 136
Wolfgang Betz 67:93bec0baf1de 137 /* CSMA BU prescaler config and CCA period config */
Wolfgang Betz 67:93bec0baf1de 138 tempRegValue[2] = (pxCsmaInit->cBuPrescaler << 2) | pxCsmaInit->xMultiplierTbit;
Wolfgang Betz 67:93bec0baf1de 139
Wolfgang Betz 67:93bec0baf1de 140 /* CSMA CCA length config and max number of back-off */
Wolfgang Betz 67:93bec0baf1de 141 tempRegValue[3] = (pxCsmaInit->xCcaLength | pxCsmaInit->cMaxNb);
Wolfgang Betz 67:93bec0baf1de 142
Wolfgang Betz 67:93bec0baf1de 143 /* Reads the PROTOCOL1_BASE register value, to write the SEED_RELOAD and CSMA_PERS_ON fields */
Wolfgang Betz 67:93bec0baf1de 144 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[4]);
Wolfgang Betz 67:93bec0baf1de 145
Wolfgang Betz 67:93bec0baf1de 146 /* Writes the new value for persistent mode */
Wolfgang Betz 67:93bec0baf1de 147 if(pxCsmaInit->xCsmaPersistentMode==S_ENABLE)
Wolfgang Betz 67:93bec0baf1de 148 {
Wolfgang Betz 67:93bec0baf1de 149 tempRegValue[4] |= PROTOCOL1_CSMA_PERS_ON_MASK;
Wolfgang Betz 67:93bec0baf1de 150 }
Wolfgang Betz 67:93bec0baf1de 151 else
Wolfgang Betz 67:93bec0baf1de 152 {
Wolfgang Betz 67:93bec0baf1de 153 tempRegValue[4] &= ~PROTOCOL1_CSMA_PERS_ON_MASK;
Wolfgang Betz 67:93bec0baf1de 154 }
Wolfgang Betz 67:93bec0baf1de 155
Wolfgang Betz 67:93bec0baf1de 156 /* Writes PROTOCOL1_BASE register */
Wolfgang Betz 67:93bec0baf1de 157 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue[4]);
Wolfgang Betz 67:93bec0baf1de 158
Wolfgang Betz 67:93bec0baf1de 159 /* Writes CSMA_CONFIGx_BASE registers */
Wolfgang Betz 67:93bec0baf1de 160 g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG3_BASE, 4, tempRegValue);
Wolfgang Betz 67:93bec0baf1de 161
Wolfgang Betz 67:93bec0baf1de 162 }
Wolfgang Betz 67:93bec0baf1de 163
Wolfgang Betz 67:93bec0baf1de 164
Wolfgang Betz 67:93bec0baf1de 165 /**
Wolfgang Betz 67:93bec0baf1de 166 * @brief Returns the fitted structure CsmaInit starting from the registers values.
Wolfgang Betz 67:93bec0baf1de 167 * @param pxCsmaInit Csma structure to be fitted.
Wolfgang Betz 67:93bec0baf1de 168 * This parameter is a pointer to @ref CsmaInit.
Wolfgang Betz 67:93bec0baf1de 169 * @retval None.
Wolfgang Betz 67:93bec0baf1de 170 */
Wolfgang Betz 67:93bec0baf1de 171 void SpiritCsmaGetInfo(CsmaInit* pxCsmaInit)
Wolfgang Betz 67:93bec0baf1de 172 {
Wolfgang Betz 67:93bec0baf1de 173 uint8_t tempRegValue[5];
Wolfgang Betz 67:93bec0baf1de 174
Wolfgang Betz 67:93bec0baf1de 175 /* Reads PROTOCOL1_BASE register */
Wolfgang Betz 67:93bec0baf1de 176 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[4]);
Wolfgang Betz 67:93bec0baf1de 177
Wolfgang Betz 67:93bec0baf1de 178 /* Reads CSMA_CONFIGx_BASE registers */
Wolfgang Betz 67:93bec0baf1de 179 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG3_BASE, 4, tempRegValue);
Wolfgang Betz 67:93bec0baf1de 180
Wolfgang Betz 67:93bec0baf1de 181 /* Reads the bu counter seed */
Wolfgang Betz 67:93bec0baf1de 182 pxCsmaInit->nBuCounterSeed = (uint16_t)tempRegValue[1] | ((uint16_t)(tempRegValue[0] << 8));
Wolfgang Betz 67:93bec0baf1de 183
Wolfgang Betz 67:93bec0baf1de 184 /* Reads the bu prescaler */
Wolfgang Betz 67:93bec0baf1de 185 pxCsmaInit->cBuPrescaler = tempRegValue[2]>>2;
Wolfgang Betz 67:93bec0baf1de 186
Wolfgang Betz 67:93bec0baf1de 187 /* Reads the Cca period */
Wolfgang Betz 67:93bec0baf1de 188 pxCsmaInit->xMultiplierTbit = (CcaPeriod)(tempRegValue[2] & 0x03);
Wolfgang Betz 67:93bec0baf1de 189
Wolfgang Betz 67:93bec0baf1de 190 /* Reads the Cca length */
Wolfgang Betz 67:93bec0baf1de 191 pxCsmaInit->xCcaLength = (CsmaLength)(tempRegValue[3]&0xF0);
Wolfgang Betz 67:93bec0baf1de 192
Wolfgang Betz 67:93bec0baf1de 193 /* Reads the max number of back off */
Wolfgang Betz 67:93bec0baf1de 194 pxCsmaInit->cMaxNb = tempRegValue[3] & 0x07;
Wolfgang Betz 67:93bec0baf1de 195
Wolfgang Betz 67:93bec0baf1de 196 /* Reads the persistent mode enable bit */
Wolfgang Betz 67:93bec0baf1de 197 pxCsmaInit->xCsmaPersistentMode = (SpiritFunctionalState)((tempRegValue[4]>>1) & 0x01);
Wolfgang Betz 67:93bec0baf1de 198
Wolfgang Betz 67:93bec0baf1de 199 }
Wolfgang Betz 67:93bec0baf1de 200
Wolfgang Betz 67:93bec0baf1de 201
Wolfgang Betz 67:93bec0baf1de 202 /**
Wolfgang Betz 67:93bec0baf1de 203 * @brief Enables or Disables the CSMA.
Wolfgang Betz 67:93bec0baf1de 204 * @param xNewState the state of the CSMA mode.
Wolfgang Betz 67:93bec0baf1de 205 * This parameter can be: S_ENABLE or S_DISABLE.
Wolfgang Betz 67:93bec0baf1de 206 * @retval None.
Wolfgang Betz 67:93bec0baf1de 207 */
Wolfgang Betz 67:93bec0baf1de 208 void SpiritCsma(SpiritFunctionalState xNewState)
Wolfgang Betz 67:93bec0baf1de 209 {
Wolfgang Betz 67:93bec0baf1de 210 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 211
Wolfgang Betz 67:93bec0baf1de 212 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 213 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
Wolfgang Betz 67:93bec0baf1de 214
Wolfgang Betz 67:93bec0baf1de 215 /* Reads the PROTOCOL1 register value */
Wolfgang Betz 67:93bec0baf1de 216 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 217
Wolfgang Betz 67:93bec0baf1de 218 /* Sets or resets the CSMA enable bit */
Wolfgang Betz 67:93bec0baf1de 219 if(xNewState==S_ENABLE)
Wolfgang Betz 67:93bec0baf1de 220 {
Wolfgang Betz 67:93bec0baf1de 221 tempRegValue |= PROTOCOL1_CSMA_ON_MASK;
Wolfgang Betz 67:93bec0baf1de 222 }
Wolfgang Betz 67:93bec0baf1de 223 else
Wolfgang Betz 67:93bec0baf1de 224 {
Wolfgang Betz 67:93bec0baf1de 225 tempRegValue &= ~PROTOCOL1_CSMA_ON_MASK;
Wolfgang Betz 67:93bec0baf1de 226 }
Wolfgang Betz 67:93bec0baf1de 227
Wolfgang Betz 67:93bec0baf1de 228 /* Writes the new value on the PROTOCOL1 register */
Wolfgang Betz 67:93bec0baf1de 229 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 230
Wolfgang Betz 67:93bec0baf1de 231 }
Wolfgang Betz 67:93bec0baf1de 232
Wolfgang Betz 67:93bec0baf1de 233 /**
Wolfgang Betz 67:93bec0baf1de 234 * @brief Gets the CSMA mode. Says if it is enabled or disabled.
Wolfgang Betz 67:93bec0baf1de 235 * @param None.
Wolfgang Betz 67:93bec0baf1de 236 * @retval SpiritFunctionalState: CSMA mode.
Wolfgang Betz 67:93bec0baf1de 237 */
Wolfgang Betz 67:93bec0baf1de 238 SpiritFunctionalState SpiritCsmaGetCsma(void)
Wolfgang Betz 67:93bec0baf1de 239 {
Wolfgang Betz 67:93bec0baf1de 240 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 241
Wolfgang Betz 67:93bec0baf1de 242 /* Reads the PROTOCOL1 register value */
Wolfgang Betz 67:93bec0baf1de 243 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 244
Wolfgang Betz 67:93bec0baf1de 245 /* Return if set or reset */
Wolfgang Betz 67:93bec0baf1de 246 if(tempRegValue & PROTOCOL1_CSMA_ON_MASK)
Wolfgang Betz 67:93bec0baf1de 247 {
Wolfgang Betz 67:93bec0baf1de 248 return S_ENABLE;
Wolfgang Betz 67:93bec0baf1de 249 }
Wolfgang Betz 67:93bec0baf1de 250 else
Wolfgang Betz 67:93bec0baf1de 251 {
Wolfgang Betz 67:93bec0baf1de 252 return S_DISABLE;
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 Enables or Disables the persistent CSMA mode.
Wolfgang Betz 67:93bec0baf1de 259 * @param xNewState the state of the persistent CSMA mode.
Wolfgang Betz 67:93bec0baf1de 260 * This parameter can be: S_ENABLE or S_DISABLE.
Wolfgang Betz 67:93bec0baf1de 261 * @retval None.
Wolfgang Betz 67:93bec0baf1de 262 */
Wolfgang Betz 67:93bec0baf1de 263 void SpiritCsmaPersistentMode(SpiritFunctionalState xNewState)
Wolfgang Betz 67:93bec0baf1de 264 {
Wolfgang Betz 67:93bec0baf1de 265 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 266
Wolfgang Betz 67:93bec0baf1de 267 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 268 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
Wolfgang Betz 67:93bec0baf1de 269
Wolfgang Betz 67:93bec0baf1de 270 /* Reads the PROTOCOL1 register value */
Wolfgang Betz 67:93bec0baf1de 271 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 272
Wolfgang Betz 67:93bec0baf1de 273 /* Enables/disables the CSMA persistent mode */
Wolfgang Betz 67:93bec0baf1de 274 if(xNewState==S_ENABLE)
Wolfgang Betz 67:93bec0baf1de 275 {
Wolfgang Betz 67:93bec0baf1de 276 tempRegValue |= PROTOCOL1_CSMA_PERS_ON_MASK;
Wolfgang Betz 67:93bec0baf1de 277 }
Wolfgang Betz 67:93bec0baf1de 278 else
Wolfgang Betz 67:93bec0baf1de 279 {
Wolfgang Betz 67:93bec0baf1de 280 tempRegValue &= ~PROTOCOL1_CSMA_PERS_ON_MASK;
Wolfgang Betz 67:93bec0baf1de 281 }
Wolfgang Betz 67:93bec0baf1de 282
Wolfgang Betz 67:93bec0baf1de 283 /* Writes the new vaue on the PROTOCOL1 register */
Wolfgang Betz 67:93bec0baf1de 284 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
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 * @brief Gets the persistent CSMA mode.
Wolfgang Betz 67:93bec0baf1de 291 * @param None.
Wolfgang Betz 67:93bec0baf1de 292 * @retval SpiritFunctionalState: CSMA persistent mode.
Wolfgang Betz 67:93bec0baf1de 293 */
Wolfgang Betz 67:93bec0baf1de 294 SpiritFunctionalState SpiritCsmaGetPersistentMode(void)
Wolfgang Betz 67:93bec0baf1de 295 {
Wolfgang Betz 67:93bec0baf1de 296 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 297
Wolfgang Betz 67:93bec0baf1de 298 /* Reads the PROTOCOL1 register value */
Wolfgang Betz 67:93bec0baf1de 299 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 300
Wolfgang Betz 67:93bec0baf1de 301 /* Return if set or reset */
Wolfgang Betz 67:93bec0baf1de 302 if(tempRegValue & PROTOCOL1_CSMA_PERS_ON_MASK)
Wolfgang Betz 67:93bec0baf1de 303 {
Wolfgang Betz 67:93bec0baf1de 304 return S_ENABLE;
Wolfgang Betz 67:93bec0baf1de 305 }
Wolfgang Betz 67:93bec0baf1de 306 else
Wolfgang Betz 67:93bec0baf1de 307 {
Wolfgang Betz 67:93bec0baf1de 308 return S_DISABLE;
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
Wolfgang Betz 67:93bec0baf1de 314 /**
Wolfgang Betz 67:93bec0baf1de 315 * @brief Enables or Disables the seed reload mode (if enabled it reloads the back-off generator seed using the value written in the BU_COUNTER_SEED register).
Wolfgang Betz 67:93bec0baf1de 316 * @param xNewState the state of the seed reload mode.
Wolfgang Betz 67:93bec0baf1de 317 * This parameter can be: S_ENABLE or S_DISABLE.
Wolfgang Betz 67:93bec0baf1de 318 * @retval None.
Wolfgang Betz 67:93bec0baf1de 319 */
Wolfgang Betz 67:93bec0baf1de 320 void SpiritCsmaSeedReloadMode(SpiritFunctionalState xNewState)
Wolfgang Betz 67:93bec0baf1de 321 {
Wolfgang Betz 67:93bec0baf1de 322 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 323
Wolfgang Betz 67:93bec0baf1de 324 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 325 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
Wolfgang Betz 67:93bec0baf1de 326
Wolfgang Betz 67:93bec0baf1de 327 /* Reads the PROTOCOL1 register value */
Wolfgang Betz 67:93bec0baf1de 328 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 329
Wolfgang Betz 67:93bec0baf1de 330 /* Enables/disables the seed reload mode */
Wolfgang Betz 67:93bec0baf1de 331 if(xNewState==S_ENABLE)
Wolfgang Betz 67:93bec0baf1de 332 {
Wolfgang Betz 67:93bec0baf1de 333 tempRegValue |= PROTOCOL1_SEED_RELOAD_MASK;
Wolfgang Betz 67:93bec0baf1de 334 }
Wolfgang Betz 67:93bec0baf1de 335 else
Wolfgang Betz 67:93bec0baf1de 336 {
Wolfgang Betz 67:93bec0baf1de 337 tempRegValue &= ~PROTOCOL1_SEED_RELOAD_MASK;
Wolfgang Betz 67:93bec0baf1de 338 }
Wolfgang Betz 67:93bec0baf1de 339
Wolfgang Betz 67:93bec0baf1de 340 /* Writes the new value on the PROTOCOL1 register */
Wolfgang Betz 67:93bec0baf1de 341 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 342
Wolfgang Betz 67:93bec0baf1de 343 }
Wolfgang Betz 67:93bec0baf1de 344
Wolfgang Betz 67:93bec0baf1de 345
Wolfgang Betz 67:93bec0baf1de 346 /**
Wolfgang Betz 67:93bec0baf1de 347 * @brief Gets the seed reload mode.
Wolfgang Betz 67:93bec0baf1de 348 * @param None.
Wolfgang Betz 67:93bec0baf1de 349 * @retval SpiritFunctionalState: CSMA seed reload mode.
Wolfgang Betz 67:93bec0baf1de 350 */
Wolfgang Betz 67:93bec0baf1de 351 SpiritFunctionalState SpiritCsmaGetSeedReloadMode(void)
Wolfgang Betz 67:93bec0baf1de 352 {
Wolfgang Betz 67:93bec0baf1de 353 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 354
Wolfgang Betz 67:93bec0baf1de 355 /* Reads the PROTOCOL1 register value */
Wolfgang Betz 67:93bec0baf1de 356 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 357
Wolfgang Betz 67:93bec0baf1de 358 /* Return if set or reset */
Wolfgang Betz 67:93bec0baf1de 359 if(tempRegValue & PROTOCOL1_SEED_RELOAD_MASK)
Wolfgang Betz 67:93bec0baf1de 360 {
Wolfgang Betz 67:93bec0baf1de 361 return S_ENABLE;
Wolfgang Betz 67:93bec0baf1de 362 }
Wolfgang Betz 67:93bec0baf1de 363 else
Wolfgang Betz 67:93bec0baf1de 364 {
Wolfgang Betz 67:93bec0baf1de 365 return S_DISABLE;
Wolfgang Betz 67:93bec0baf1de 366 }
Wolfgang Betz 67:93bec0baf1de 367 }
Wolfgang Betz 67:93bec0baf1de 368
Wolfgang Betz 67:93bec0baf1de 369
Wolfgang Betz 67:93bec0baf1de 370 /**
Wolfgang Betz 67:93bec0baf1de 371 * @brief Sets the BU counter seed (BU_COUNTER_SEED register). The CSMA back off time is given by the formula: BO = rand(2^NB)*BU.
Wolfgang Betz 67:93bec0baf1de 372 * @param nBuCounterSeed seed of the random number generator used to apply the BBE algorithm.
Wolfgang Betz 67:93bec0baf1de 373 * This parameter is an uint16_t.
Wolfgang Betz 67:93bec0baf1de 374 * @retval None.
Wolfgang Betz 67:93bec0baf1de 375 */
Wolfgang Betz 67:93bec0baf1de 376 void SpiritCsmaSetBuCounterSeed(uint16_t nBuCounterSeed)
Wolfgang Betz 67:93bec0baf1de 377 {
Wolfgang Betz 67:93bec0baf1de 378 uint8_t tempRegValue[2];
Wolfgang Betz 67:93bec0baf1de 379
Wolfgang Betz 67:93bec0baf1de 380 /* Check parameters */
Wolfgang Betz 67:93bec0baf1de 381 s_assert_param(IS_BU_COUNTER_SEED(nBuCounterSeed));
Wolfgang Betz 67:93bec0baf1de 382
Wolfgang Betz 67:93bec0baf1de 383 /* Build value (MSB)*/
Wolfgang Betz 67:93bec0baf1de 384 tempRegValue[0]=(uint8_t)(nBuCounterSeed>>8);
Wolfgang Betz 67:93bec0baf1de 385 /* Build value (LSB) */
Wolfgang Betz 67:93bec0baf1de 386 tempRegValue[1]=(uint8_t)nBuCounterSeed;
Wolfgang Betz 67:93bec0baf1de 387
Wolfgang Betz 67:93bec0baf1de 388 /* Writes the CSMA_CONFIG3 registers */
Wolfgang Betz 67:93bec0baf1de 389 g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG3_BASE, 2, tempRegValue);
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 Returns the BU counter seed (BU_COUNTER_SEED register).
Wolfgang Betz 67:93bec0baf1de 395 * @param None.
Wolfgang Betz 67:93bec0baf1de 396 * @retval uint16_t Seed of the random number generator used to apply the BBE algorithm.
Wolfgang Betz 67:93bec0baf1de 397 */
Wolfgang Betz 67:93bec0baf1de 398 uint16_t SpiritCsmaGetBuCounterSeed(void)
Wolfgang Betz 67:93bec0baf1de 399 {
Wolfgang Betz 67:93bec0baf1de 400 uint8_t tempRegValue[2];
Wolfgang Betz 67:93bec0baf1de 401
Wolfgang Betz 67:93bec0baf1de 402 /* Reads the CSMA_CONFIGx registers value */
Wolfgang Betz 67:93bec0baf1de 403 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG3_BASE, 2, tempRegValue);
Wolfgang Betz 67:93bec0baf1de 404
Wolfgang Betz 67:93bec0baf1de 405 /* Build the counter seed and return it */
Wolfgang Betz 67:93bec0baf1de 406 return ((uint16_t)tempRegValue[1] + (((uint16_t)tempRegValue[0])<<8));
Wolfgang Betz 67:93bec0baf1de 407
Wolfgang Betz 67:93bec0baf1de 408 }
Wolfgang Betz 67:93bec0baf1de 409
Wolfgang Betz 67:93bec0baf1de 410
Wolfgang Betz 67:93bec0baf1de 411 /**
Wolfgang Betz 67:93bec0baf1de 412 * @brief Sets the BU prescaler. The CSMA back off time is given by the formula: BO = rand(2^NB)*BU.
Wolfgang Betz 67:93bec0baf1de 413 * @param cBuPrescaler used to program the back-off unit BU.
Wolfgang Betz 67:93bec0baf1de 414 * This parameter is an uint8_t.
Wolfgang Betz 67:93bec0baf1de 415 * @retval None.
Wolfgang Betz 67:93bec0baf1de 416 */
Wolfgang Betz 67:93bec0baf1de 417 void SpiritCsmaSetBuPrescaler(uint8_t cBuPrescaler)
Wolfgang Betz 67:93bec0baf1de 418 {
Wolfgang Betz 67:93bec0baf1de 419 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 420
Wolfgang Betz 67:93bec0baf1de 421 /* Check parameters */
Wolfgang Betz 67:93bec0baf1de 422 s_assert_param(IS_BU_PRESCALER(cBuPrescaler));
Wolfgang Betz 67:93bec0baf1de 423
Wolfgang Betz 67:93bec0baf1de 424 /* Reads the CSMA_CONFIG1 register value */
Wolfgang Betz 67:93bec0baf1de 425 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 426
Wolfgang Betz 67:93bec0baf1de 427 /* Build the new value for the BU prescaler */
Wolfgang Betz 67:93bec0baf1de 428 tempRegValue &= 0x03;
Wolfgang Betz 67:93bec0baf1de 429 tempRegValue |= (cBuPrescaler<<2);
Wolfgang Betz 67:93bec0baf1de 430
Wolfgang Betz 67:93bec0baf1de 431 /* Writes the new value on the CSMA_CONFIG1_BASE register */
Wolfgang Betz 67:93bec0baf1de 432 g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG1_BASE, 1, &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 Returns the BU prescaler.
Wolfgang Betz 67:93bec0baf1de 439 * @param None.
Wolfgang Betz 67:93bec0baf1de 440 * @retval uint8_t Value back-off unit (BU).
Wolfgang Betz 67:93bec0baf1de 441 */
Wolfgang Betz 67:93bec0baf1de 442 uint8_t SpiritCsmaGetBuPrescaler(void)
Wolfgang Betz 67:93bec0baf1de 443 {
Wolfgang Betz 67:93bec0baf1de 444 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 445
Wolfgang Betz 67:93bec0baf1de 446 /* Reads the CSMA_CONFIG1 register value */
Wolfgang Betz 67:93bec0baf1de 447 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 448
Wolfgang Betz 67:93bec0baf1de 449 /* Build and return the BU prescaler value */
Wolfgang Betz 67:93bec0baf1de 450 return (tempRegValue >> 2);
Wolfgang Betz 67:93bec0baf1de 451
Wolfgang Betz 67:93bec0baf1de 452 }
Wolfgang Betz 67:93bec0baf1de 453
Wolfgang Betz 67:93bec0baf1de 454
Wolfgang Betz 67:93bec0baf1de 455 /**
Wolfgang Betz 67:93bec0baf1de 456 * @brief Sets the CCA period.
Wolfgang Betz 67:93bec0baf1de 457 * @param xMultiplierTbit value of CCA period to store.
Wolfgang Betz 67:93bec0baf1de 458 * This parameter can be a value of @ref CcaPeriod.
Wolfgang Betz 67:93bec0baf1de 459 * @retval None.
Wolfgang Betz 67:93bec0baf1de 460 */
Wolfgang Betz 67:93bec0baf1de 461 void SpiritCsmaSetCcaPeriod(CcaPeriod xMultiplierTbit)
Wolfgang Betz 67:93bec0baf1de 462 {
Wolfgang Betz 67:93bec0baf1de 463 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 464
Wolfgang Betz 67:93bec0baf1de 465 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 466 s_assert_param(IS_CCA_PERIOD(xMultiplierTbit));
Wolfgang Betz 67:93bec0baf1de 467
Wolfgang Betz 67:93bec0baf1de 468 /* Reads the CSMA_CONFIG1 register value */
Wolfgang Betz 67:93bec0baf1de 469 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 470
Wolfgang Betz 67:93bec0baf1de 471 /* Build the new value setting the the CCA period */
Wolfgang Betz 67:93bec0baf1de 472 tempRegValue &= 0xFC;
Wolfgang Betz 67:93bec0baf1de 473 tempRegValue |= xMultiplierTbit;
Wolfgang Betz 67:93bec0baf1de 474
Wolfgang Betz 67:93bec0baf1de 475 /* Writes the new value on the CSMA_CONFIG1 register */
Wolfgang Betz 67:93bec0baf1de 476 g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 477
Wolfgang Betz 67:93bec0baf1de 478 }
Wolfgang Betz 67:93bec0baf1de 479
Wolfgang Betz 67:93bec0baf1de 480
Wolfgang Betz 67:93bec0baf1de 481 /**
Wolfgang Betz 67:93bec0baf1de 482 * @brief Returns the CCA period.
Wolfgang Betz 67:93bec0baf1de 483 * @param None.
Wolfgang Betz 67:93bec0baf1de 484 * @retval CcaPeriod CCA period.
Wolfgang Betz 67:93bec0baf1de 485 */
Wolfgang Betz 67:93bec0baf1de 486 CcaPeriod SpiritCsmaGetCcaPeriod(void)
Wolfgang Betz 67:93bec0baf1de 487 {
Wolfgang Betz 67:93bec0baf1de 488 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 489
Wolfgang Betz 67:93bec0baf1de 490 /* Reads the CSMA_CONFIG1 register value */
Wolfgang Betz 67:93bec0baf1de 491 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 492
Wolfgang Betz 67:93bec0baf1de 493 /* Build and return the CCA period value */
Wolfgang Betz 67:93bec0baf1de 494 return (CcaPeriod)(tempRegValue & 0x03);
Wolfgang Betz 67:93bec0baf1de 495
Wolfgang Betz 67:93bec0baf1de 496 }
Wolfgang Betz 67:93bec0baf1de 497
Wolfgang Betz 67:93bec0baf1de 498
Wolfgang Betz 67:93bec0baf1de 499 /**
Wolfgang Betz 67:93bec0baf1de 500 * @brief Sets the CCA length.
Wolfgang Betz 67:93bec0baf1de 501 * @param xCcaLength the CCA length (a value between 1 and 15 that multiplies the CCA period).
Wolfgang Betz 67:93bec0baf1de 502 * This parameter can be any value of @ref CsmaLength.
Wolfgang Betz 67:93bec0baf1de 503 * @retval None.
Wolfgang Betz 67:93bec0baf1de 504 */
Wolfgang Betz 67:93bec0baf1de 505 void SpiritCsmaSetCcaLength(CsmaLength xCcaLength)
Wolfgang Betz 67:93bec0baf1de 506 {
Wolfgang Betz 67:93bec0baf1de 507 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 508
Wolfgang Betz 67:93bec0baf1de 509 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 510 s_assert_param(IS_CSMA_LENGTH(xCcaLength));
Wolfgang Betz 67:93bec0baf1de 511
Wolfgang Betz 67:93bec0baf1de 512 /* Reads the CSMA_CONFIG0 register value */
Wolfgang Betz 67:93bec0baf1de 513 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 514
Wolfgang Betz 67:93bec0baf1de 515 /* Build the value of CCA length to be set */
Wolfgang Betz 67:93bec0baf1de 516 tempRegValue &= 0x0F;
Wolfgang Betz 67:93bec0baf1de 517 tempRegValue |= xCcaLength;
Wolfgang Betz 67:93bec0baf1de 518
Wolfgang Betz 67:93bec0baf1de 519 /* Writes the new value on the CSMA_CONFIG0 register */
Wolfgang Betz 67:93bec0baf1de 520 g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 521
Wolfgang Betz 67:93bec0baf1de 522 }
Wolfgang Betz 67:93bec0baf1de 523
Wolfgang Betz 67:93bec0baf1de 524
Wolfgang Betz 67:93bec0baf1de 525 /**
Wolfgang Betz 67:93bec0baf1de 526 * @brief Returns the CCA length.
Wolfgang Betz 67:93bec0baf1de 527 * @param None.
Wolfgang Betz 67:93bec0baf1de 528 * @retval uint8_t CCA length.
Wolfgang Betz 67:93bec0baf1de 529 */
Wolfgang Betz 67:93bec0baf1de 530 uint8_t SpiritCsmaGetCcaLength(void)
Wolfgang Betz 67:93bec0baf1de 531 {
Wolfgang Betz 67:93bec0baf1de 532 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 533
Wolfgang Betz 67:93bec0baf1de 534 /* Reads the CSMA_CONFIG0 register value */
Wolfgang Betz 67:93bec0baf1de 535 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 536
Wolfgang Betz 67:93bec0baf1de 537 /* Build and return the CCA length */
Wolfgang Betz 67:93bec0baf1de 538 return tempRegValue >> 4;
Wolfgang Betz 67:93bec0baf1de 539
Wolfgang Betz 67:93bec0baf1de 540 }
Wolfgang Betz 67:93bec0baf1de 541
Wolfgang Betz 67:93bec0baf1de 542
Wolfgang Betz 67:93bec0baf1de 543 /**
Wolfgang Betz 67:93bec0baf1de 544 * @brief Sets the max number of back-off. If reached Spirit stops the transmission.
Wolfgang Betz 67:93bec0baf1de 545 * @param cMaxNb the max number of back-off.
Wolfgang Betz 67:93bec0baf1de 546 * This parameter is an uint8_t.
Wolfgang Betz 67:93bec0baf1de 547 * @retval None.
Wolfgang Betz 67:93bec0baf1de 548 */
Wolfgang Betz 67:93bec0baf1de 549 void SpiritCsmaSetMaxNumberBackoff(uint8_t cMaxNb)
Wolfgang Betz 67:93bec0baf1de 550 {
Wolfgang Betz 67:93bec0baf1de 551 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 552
Wolfgang Betz 67:93bec0baf1de 553 /* Check the parameters */
Wolfgang Betz 67:93bec0baf1de 554 s_assert_param(IS_CMAX_NB(cMaxNb));
Wolfgang Betz 67:93bec0baf1de 555
Wolfgang Betz 67:93bec0baf1de 556 /* Reads the CSMA_CONFIG0 register value */
Wolfgang Betz 67:93bec0baf1de 557 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 558
Wolfgang Betz 67:93bec0baf1de 559 /* Build the value of max back off to be set */
Wolfgang Betz 67:93bec0baf1de 560 tempRegValue &= 0xF8;
Wolfgang Betz 67:93bec0baf1de 561 tempRegValue |= cMaxNb;
Wolfgang Betz 67:93bec0baf1de 562
Wolfgang Betz 67:93bec0baf1de 563 /* Writes the new value on the CSMA_CONFIG0 register */
Wolfgang Betz 67:93bec0baf1de 564 g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 565 }
Wolfgang Betz 67:93bec0baf1de 566
Wolfgang Betz 67:93bec0baf1de 567 /**
Wolfgang Betz 67:93bec0baf1de 568 * @brief Returns the max number of back-off.
Wolfgang Betz 67:93bec0baf1de 569 * @param None.
Wolfgang Betz 67:93bec0baf1de 570 * @retval uint8_t Max number of back-off.
Wolfgang Betz 67:93bec0baf1de 571 */
Wolfgang Betz 67:93bec0baf1de 572 uint8_t SpiritCsmaGetMaxNumberBackoff(void)
Wolfgang Betz 67:93bec0baf1de 573 {
Wolfgang Betz 67:93bec0baf1de 574 uint8_t tempRegValue;
Wolfgang Betz 67:93bec0baf1de 575
Wolfgang Betz 67:93bec0baf1de 576 /* Reads the CSMA_CONFIG0 register value */
Wolfgang Betz 67:93bec0baf1de 577 g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue);
Wolfgang Betz 67:93bec0baf1de 578
Wolfgang Betz 67:93bec0baf1de 579 /* Build and return the max number of back-off */
Wolfgang Betz 67:93bec0baf1de 580 return (tempRegValue & 0x07);
Wolfgang Betz 67:93bec0baf1de 581
Wolfgang Betz 67:93bec0baf1de 582 }
Wolfgang Betz 67:93bec0baf1de 583
Wolfgang Betz 67:93bec0baf1de 584
Wolfgang Betz 67:93bec0baf1de 585 /**
Wolfgang Betz 67:93bec0baf1de 586 *@}
Wolfgang Betz 67:93bec0baf1de 587 */
Wolfgang Betz 67:93bec0baf1de 588
Wolfgang Betz 67:93bec0baf1de 589 /**
Wolfgang Betz 67:93bec0baf1de 590 *@}
Wolfgang Betz 67:93bec0baf1de 591 */
Wolfgang Betz 67:93bec0baf1de 592
Wolfgang Betz 67:93bec0baf1de 593
Wolfgang Betz 67:93bec0baf1de 594 /**
Wolfgang Betz 67:93bec0baf1de 595 *@}
Wolfgang Betz 67:93bec0baf1de 596 */
Wolfgang Betz 67:93bec0baf1de 597
Wolfgang Betz 67:93bec0baf1de 598
Wolfgang Betz 67:93bec0baf1de 599
Wolfgang Betz 67:93bec0baf1de 600 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/