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

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

Currently supported boards:

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

  • Unmount resistor R4
  • Mount resistor R7

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

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

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 0:4fb29d9ee571 1 /**
Wolfgang Betz 0:4fb29d9ee571 2 ******************************************************************************
Wolfgang Betz 0:4fb29d9ee571 3 * @file SPIRIT_PktStack.c
Wolfgang Betz 0:4fb29d9ee571 4 * @author VMA division - AMS
Wolfgang Betz 0:4fb29d9ee571 5 * @version 3.2.2
Wolfgang Betz 0:4fb29d9ee571 6 * @date 08-July-2015
Wolfgang Betz 0:4fb29d9ee571 7 * @brief Configuration and management of SPIRIT STack packets.
Wolfgang Betz 0:4fb29d9ee571 8 * @details
Wolfgang Betz 0:4fb29d9ee571 9 *
Wolfgang Betz 0:4fb29d9ee571 10 * @attention
Wolfgang Betz 0:4fb29d9ee571 11 *
Wolfgang Betz 0:4fb29d9ee571 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Wolfgang Betz 0:4fb29d9ee571 13 *
Wolfgang Betz 0:4fb29d9ee571 14 * Redistribution and use in source and binary forms, with or without modification,
Wolfgang Betz 0:4fb29d9ee571 15 * are permitted provided that the following conditions are met:
Wolfgang Betz 0:4fb29d9ee571 16 * 1. Redistributions of source code must retain the above copyright notice,
Wolfgang Betz 0:4fb29d9ee571 17 * this list of conditions and the following disclaimer.
Wolfgang Betz 0:4fb29d9ee571 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Wolfgang Betz 0:4fb29d9ee571 19 * this list of conditions and the following disclaimer in the documentation
Wolfgang Betz 0:4fb29d9ee571 20 * and/or other materials provided with the distribution.
Wolfgang Betz 0:4fb29d9ee571 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Wolfgang Betz 0:4fb29d9ee571 22 * may be used to endorse or promote products derived from this software
Wolfgang Betz 0:4fb29d9ee571 23 * without specific prior written permission.
Wolfgang Betz 0:4fb29d9ee571 24 *
Wolfgang Betz 0:4fb29d9ee571 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Wolfgang Betz 0:4fb29d9ee571 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Wolfgang Betz 0:4fb29d9ee571 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Wolfgang Betz 0:4fb29d9ee571 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Wolfgang Betz 0:4fb29d9ee571 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Wolfgang Betz 0:4fb29d9ee571 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Wolfgang Betz 0:4fb29d9ee571 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Wolfgang Betz 0:4fb29d9ee571 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Wolfgang Betz 0:4fb29d9ee571 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Wolfgang Betz 0:4fb29d9ee571 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wolfgang Betz 0:4fb29d9ee571 35 *
Wolfgang Betz 0:4fb29d9ee571 36 ******************************************************************************
Wolfgang Betz 0:4fb29d9ee571 37 */
Wolfgang Betz 0:4fb29d9ee571 38
Wolfgang Betz 0:4fb29d9ee571 39 /* Includes ------------------------------------------------------------------*/
Wolfgang Betz 0:4fb29d9ee571 40 #include "SPIRIT_PktStack.h"
Wolfgang Betz 0:4fb29d9ee571 41 #include "MCU_Interface.h"
Wolfgang Betz 0:4fb29d9ee571 42
Wolfgang Betz 0:4fb29d9ee571 43
Wolfgang Betz 0:4fb29d9ee571 44 /**
Wolfgang Betz 0:4fb29d9ee571 45 * @addtogroup SPIRIT_Libraries
Wolfgang Betz 0:4fb29d9ee571 46 * @{
Wolfgang Betz 0:4fb29d9ee571 47 */
Wolfgang Betz 0:4fb29d9ee571 48
Wolfgang Betz 0:4fb29d9ee571 49
Wolfgang Betz 0:4fb29d9ee571 50 /**
Wolfgang Betz 0:4fb29d9ee571 51 * @addtogroup SPIRIT_PktStack
Wolfgang Betz 0:4fb29d9ee571 52 * @{
Wolfgang Betz 0:4fb29d9ee571 53 */
Wolfgang Betz 0:4fb29d9ee571 54
Wolfgang Betz 0:4fb29d9ee571 55
Wolfgang Betz 0:4fb29d9ee571 56 /**
Wolfgang Betz 0:4fb29d9ee571 57 * @defgroup PktStack_Private_TypesDefinitions Pkt STack Private Types Definitions
Wolfgang Betz 0:4fb29d9ee571 58 * @{
Wolfgang Betz 0:4fb29d9ee571 59 */
Wolfgang Betz 0:4fb29d9ee571 60
Wolfgang Betz 0:4fb29d9ee571 61 /**
Wolfgang Betz 0:4fb29d9ee571 62 *@}
Wolfgang Betz 0:4fb29d9ee571 63 */
Wolfgang Betz 0:4fb29d9ee571 64
Wolfgang Betz 0:4fb29d9ee571 65
Wolfgang Betz 0:4fb29d9ee571 66 /**
Wolfgang Betz 0:4fb29d9ee571 67 * @defgroup PktStack_Private_Defines Pkt STack Private Defines
Wolfgang Betz 0:4fb29d9ee571 68 * @{
Wolfgang Betz 0:4fb29d9ee571 69 */
Wolfgang Betz 0:4fb29d9ee571 70
Wolfgang Betz 0:4fb29d9ee571 71 /**
Wolfgang Betz 0:4fb29d9ee571 72 *@}
Wolfgang Betz 0:4fb29d9ee571 73 */
Wolfgang Betz 0:4fb29d9ee571 74
Wolfgang Betz 0:4fb29d9ee571 75
Wolfgang Betz 0:4fb29d9ee571 76 /**
Wolfgang Betz 0:4fb29d9ee571 77 * @defgroup PktStack_Private_Macros Pkt STack Private Macros
Wolfgang Betz 0:4fb29d9ee571 78 * @{
Wolfgang Betz 0:4fb29d9ee571 79 */
Wolfgang Betz 0:4fb29d9ee571 80
Wolfgang Betz 0:4fb29d9ee571 81 /**
Wolfgang Betz 0:4fb29d9ee571 82 *@}
Wolfgang Betz 0:4fb29d9ee571 83 */
Wolfgang Betz 0:4fb29d9ee571 84
Wolfgang Betz 0:4fb29d9ee571 85
Wolfgang Betz 0:4fb29d9ee571 86 /**
Wolfgang Betz 0:4fb29d9ee571 87 * @defgroup PktStack_Private_Variables Pkt STack Private Variables
Wolfgang Betz 0:4fb29d9ee571 88 * @{
Wolfgang Betz 0:4fb29d9ee571 89 */
Wolfgang Betz 0:4fb29d9ee571 90
Wolfgang Betz 0:4fb29d9ee571 91 /**
Wolfgang Betz 0:4fb29d9ee571 92 *@}
Wolfgang Betz 0:4fb29d9ee571 93 */
Wolfgang Betz 0:4fb29d9ee571 94
Wolfgang Betz 0:4fb29d9ee571 95
Wolfgang Betz 0:4fb29d9ee571 96 /**
Wolfgang Betz 0:4fb29d9ee571 97 * @defgroup PktStack_Private_FunctionPrototypes Pkt STack Private Function Prototypes
Wolfgang Betz 0:4fb29d9ee571 98 * @{
Wolfgang Betz 0:4fb29d9ee571 99 */
Wolfgang Betz 0:4fb29d9ee571 100
Wolfgang Betz 0:4fb29d9ee571 101 /**
Wolfgang Betz 0:4fb29d9ee571 102 *@}
Wolfgang Betz 0:4fb29d9ee571 103 */
Wolfgang Betz 0:4fb29d9ee571 104
Wolfgang Betz 0:4fb29d9ee571 105
Wolfgang Betz 0:4fb29d9ee571 106 /**
Wolfgang Betz 0:4fb29d9ee571 107 * @defgroup PktStack_Private_Functions Pkt STack Private Functions
Wolfgang Betz 0:4fb29d9ee571 108 * @{
Wolfgang Betz 0:4fb29d9ee571 109 */
Wolfgang Betz 0:4fb29d9ee571 110
Wolfgang Betz 0:4fb29d9ee571 111
Wolfgang Betz 0:4fb29d9ee571 112 /**
Wolfgang Betz 0:4fb29d9ee571 113 * @brief Initializes the SPIRIT STack packet according to the specified
Wolfgang Betz 0:4fb29d9ee571 114 * parameters in the PktStackInit.
Wolfgang Betz 0:4fb29d9ee571 115 * @param pxPktStackInit STack packet init structure.
Wolfgang Betz 0:4fb29d9ee571 116 * This parameter is a pointer to @ref PktStackInit.
Wolfgang Betz 0:4fb29d9ee571 117 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 118 */
Wolfgang Betz 0:4fb29d9ee571 119 void SpiritPktStackInit(PktStackInit* pxPktStackInit)
Wolfgang Betz 0:4fb29d9ee571 120 {
Wolfgang Betz 0:4fb29d9ee571 121 uint8_t tempRegValue[4], i;
Wolfgang Betz 0:4fb29d9ee571 122
Wolfgang Betz 0:4fb29d9ee571 123 /* Check the parameters */
Wolfgang Betz 0:4fb29d9ee571 124 s_assert_param(IS_STACK_PREAMBLE_LENGTH(pxPktStackInit->xPreambleLength));
Wolfgang Betz 0:4fb29d9ee571 125 s_assert_param(IS_STACK_SYNC_LENGTH(pxPktStackInit->xSyncLength));
Wolfgang Betz 0:4fb29d9ee571 126 s_assert_param(IS_STACK_CRC_MODE(pxPktStackInit->xCrcMode));
Wolfgang Betz 0:4fb29d9ee571 127 s_assert_param(IS_STACK_LENGTH_WIDTH_BITS(pxPktStackInit->cPktLengthWidth));
Wolfgang Betz 0:4fb29d9ee571 128 s_assert_param(IS_STACK_FIX_VAR_LENGTH(pxPktStackInit->xFixVarLength));
Wolfgang Betz 0:4fb29d9ee571 129 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackInit->xFec));
Wolfgang Betz 0:4fb29d9ee571 130 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackInit->xDataWhitening));
Wolfgang Betz 0:4fb29d9ee571 131 s_assert_param(IS_STACK_CONTROL_LENGTH(pxPktStackInit->xControlLength));
Wolfgang Betz 0:4fb29d9ee571 132
Wolfgang Betz 0:4fb29d9ee571 133
Wolfgang Betz 0:4fb29d9ee571 134 /* Reads the PROTOCOL1 register */
Wolfgang Betz 0:4fb29d9ee571 135 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 136
Wolfgang Betz 0:4fb29d9ee571 137 /* Mask a reserved bit */
Wolfgang Betz 0:4fb29d9ee571 138 tempRegValue[0] &= ~0x20;
Wolfgang Betz 0:4fb29d9ee571 139
Wolfgang Betz 0:4fb29d9ee571 140 /* Always (!) set the automatic packet filtering */
Wolfgang Betz 0:4fb29d9ee571 141 tempRegValue[0] |= PROTOCOL1_AUTO_PCKT_FLT_MASK;
Wolfgang Betz 0:4fb29d9ee571 142
Wolfgang Betz 0:4fb29d9ee571 143 /* Writes the value on register */
Wolfgang Betz 0:4fb29d9ee571 144 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 145
Wolfgang Betz 0:4fb29d9ee571 146 /* Reads the PCKT_FLT_OPTIONS register */
Wolfgang Betz 0:4fb29d9ee571 147 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 148
Wolfgang Betz 0:4fb29d9ee571 149 /* Always reset the control and source filtering */
Wolfgang Betz 0:4fb29d9ee571 150 tempRegValue[0] &= ~(PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK | PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK);
Wolfgang Betz 0:4fb29d9ee571 151
Wolfgang Betz 0:4fb29d9ee571 152 /* Writes the value on register */
Wolfgang Betz 0:4fb29d9ee571 153 g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 154
Wolfgang Betz 0:4fb29d9ee571 155
Wolfgang Betz 0:4fb29d9ee571 156 /* Address and control length setting: source and destination address are always present so ADDRESS_LENGTH=2 */
Wolfgang Betz 0:4fb29d9ee571 157 tempRegValue[0] = 0x10 | ((uint8_t) pxPktStackInit->xControlLength);
Wolfgang Betz 0:4fb29d9ee571 158
Wolfgang Betz 0:4fb29d9ee571 159
Wolfgang Betz 0:4fb29d9ee571 160 /* Packet format and width length setting */
Wolfgang Betz 0:4fb29d9ee571 161 pxPktStackInit->cPktLengthWidth == 0 ? pxPktStackInit->cPktLengthWidth=1 : pxPktStackInit->cPktLengthWidth;
Wolfgang Betz 0:4fb29d9ee571 162 tempRegValue[1] = ((uint8_t) PCKTCTRL3_PCKT_FRMT_STACK) | ((uint8_t)(pxPktStackInit->cPktLengthWidth-1));
Wolfgang Betz 0:4fb29d9ee571 163
Wolfgang Betz 0:4fb29d9ee571 164 /* Preamble, sync and fixed or variable length setting */
Wolfgang Betz 0:4fb29d9ee571 165 tempRegValue[2] = ((uint8_t) pxPktStackInit->xPreambleLength) | ((uint8_t) pxPktStackInit->xSyncLength) |
Wolfgang Betz 0:4fb29d9ee571 166 ((uint8_t) pxPktStackInit->xFixVarLength);
Wolfgang Betz 0:4fb29d9ee571 167
Wolfgang Betz 0:4fb29d9ee571 168 /* CRC length, whitening and FEC setting */
Wolfgang Betz 0:4fb29d9ee571 169 tempRegValue[3] = (uint8_t) pxPktStackInit->xCrcMode;
Wolfgang Betz 0:4fb29d9ee571 170
Wolfgang Betz 0:4fb29d9ee571 171 if(pxPktStackInit->xDataWhitening == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 172 {
Wolfgang Betz 0:4fb29d9ee571 173 tempRegValue[3] |= PCKTCTRL1_WHIT_MASK;
Wolfgang Betz 0:4fb29d9ee571 174 }
Wolfgang Betz 0:4fb29d9ee571 175
Wolfgang Betz 0:4fb29d9ee571 176 if(pxPktStackInit->xFec == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 177 {
Wolfgang Betz 0:4fb29d9ee571 178 tempRegValue[3] |= PCKTCTRL1_FEC_MASK;
Wolfgang Betz 0:4fb29d9ee571 179 }
Wolfgang Betz 0:4fb29d9ee571 180
Wolfgang Betz 0:4fb29d9ee571 181 /* Writes registers */
Wolfgang Betz 0:4fb29d9ee571 182 SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 4, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 183
Wolfgang Betz 0:4fb29d9ee571 184 /* Sync words setting */
Wolfgang Betz 0:4fb29d9ee571 185 for(i=0;i<4;i++)
Wolfgang Betz 0:4fb29d9ee571 186 {
Wolfgang Betz 0:4fb29d9ee571 187 if(i<3-(pxPktStackInit->xSyncLength >>1))
Wolfgang Betz 0:4fb29d9ee571 188 {
Wolfgang Betz 0:4fb29d9ee571 189 tempRegValue[i]=0;
Wolfgang Betz 0:4fb29d9ee571 190 }
Wolfgang Betz 0:4fb29d9ee571 191 else
Wolfgang Betz 0:4fb29d9ee571 192 {
Wolfgang Betz 0:4fb29d9ee571 193 tempRegValue[i] = (uint8_t)(pxPktStackInit->lSyncWords>>(8*i));
Wolfgang Betz 0:4fb29d9ee571 194 }
Wolfgang Betz 0:4fb29d9ee571 195 }
Wolfgang Betz 0:4fb29d9ee571 196
Wolfgang Betz 0:4fb29d9ee571 197 /* Enables or disables the CRC check */
Wolfgang Betz 0:4fb29d9ee571 198 if(pxPktStackInit->xCrcMode == PKT_NO_CRC)
Wolfgang Betz 0:4fb29d9ee571 199 {
Wolfgang Betz 0:4fb29d9ee571 200 SpiritPktStackFilterOnCrc(S_DISABLE);
Wolfgang Betz 0:4fb29d9ee571 201 }
Wolfgang Betz 0:4fb29d9ee571 202 else
Wolfgang Betz 0:4fb29d9ee571 203 {
Wolfgang Betz 0:4fb29d9ee571 204 SpiritPktStackFilterOnCrc(S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 205 }
Wolfgang Betz 0:4fb29d9ee571 206
Wolfgang Betz 0:4fb29d9ee571 207 /* Writes registers */
Wolfgang Betz 0:4fb29d9ee571 208 g_xStatus = SpiritSpiWriteRegisters(SYNC4_BASE, 4, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 209
Wolfgang Betz 0:4fb29d9ee571 210 }
Wolfgang Betz 0:4fb29d9ee571 211
Wolfgang Betz 0:4fb29d9ee571 212
Wolfgang Betz 0:4fb29d9ee571 213 /**
Wolfgang Betz 0:4fb29d9ee571 214 * @brief Returns the SPIRIT STack packet structure according to the specified parameters in the registers.
Wolfgang Betz 0:4fb29d9ee571 215 * @param pxPktStackInit STack packet init structure.
Wolfgang Betz 0:4fb29d9ee571 216 * This parameter is a pointer to @ref PktStackInit.
Wolfgang Betz 0:4fb29d9ee571 217 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 218 */
Wolfgang Betz 0:4fb29d9ee571 219 void SpiritPktStackGetInfo(PktStackInit* pxPktStackInit)
Wolfgang Betz 0:4fb29d9ee571 220 {
Wolfgang Betz 0:4fb29d9ee571 221 uint8_t tempRegValue[10];
Wolfgang Betz 0:4fb29d9ee571 222
Wolfgang Betz 0:4fb29d9ee571 223 /* Reads registers */
Wolfgang Betz 0:4fb29d9ee571 224 g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 10, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 225
Wolfgang Betz 0:4fb29d9ee571 226 /* Length width */
Wolfgang Betz 0:4fb29d9ee571 227 pxPktStackInit->cPktLengthWidth=(tempRegValue[1] & 0x0F)+1;
Wolfgang Betz 0:4fb29d9ee571 228
Wolfgang Betz 0:4fb29d9ee571 229 /* Control length */
Wolfgang Betz 0:4fb29d9ee571 230 pxPktStackInit->xControlLength=(StackControlLength)(tempRegValue[0] & 0x07);
Wolfgang Betz 0:4fb29d9ee571 231
Wolfgang Betz 0:4fb29d9ee571 232 /* CRC mode */
Wolfgang Betz 0:4fb29d9ee571 233 pxPktStackInit->xCrcMode=(StackCrcMode)(tempRegValue[3] & 0xE0);
Wolfgang Betz 0:4fb29d9ee571 234
Wolfgang Betz 0:4fb29d9ee571 235 /* Whitening */
Wolfgang Betz 0:4fb29d9ee571 236 pxPktStackInit->xDataWhitening=(SpiritFunctionalState)((tempRegValue[3] >> 4) & 0x01);
Wolfgang Betz 0:4fb29d9ee571 237
Wolfgang Betz 0:4fb29d9ee571 238 /* FEC */
Wolfgang Betz 0:4fb29d9ee571 239 pxPktStackInit->xFec=(SpiritFunctionalState)(tempRegValue[3] & 0x01);
Wolfgang Betz 0:4fb29d9ee571 240
Wolfgang Betz 0:4fb29d9ee571 241 /* FIX or VAR bit */
Wolfgang Betz 0:4fb29d9ee571 242 pxPktStackInit->xFixVarLength=(StackFixVarLength)(tempRegValue[2] & 0x01);
Wolfgang Betz 0:4fb29d9ee571 243
Wolfgang Betz 0:4fb29d9ee571 244 /* Preamble length */
Wolfgang Betz 0:4fb29d9ee571 245 pxPktStackInit->xPreambleLength=(StackPreambleLength)(tempRegValue[2] & 0xF8);
Wolfgang Betz 0:4fb29d9ee571 246
Wolfgang Betz 0:4fb29d9ee571 247 /* Sync length */
Wolfgang Betz 0:4fb29d9ee571 248 pxPktStackInit->xSyncLength=(StackSyncLength)(tempRegValue[2] & 0x06);
Wolfgang Betz 0:4fb29d9ee571 249
Wolfgang Betz 0:4fb29d9ee571 250 /* sync Words */
Wolfgang Betz 0:4fb29d9ee571 251 pxPktStackInit->lSyncWords=0;
Wolfgang Betz 0:4fb29d9ee571 252 for(uint8_t i=0 ; i<4 ; i++)
Wolfgang Betz 0:4fb29d9ee571 253 {
Wolfgang Betz 0:4fb29d9ee571 254 if(i>2-(pxPktStackInit->xSyncLength >>1))
Wolfgang Betz 0:4fb29d9ee571 255 {
Wolfgang Betz 0:4fb29d9ee571 256 pxPktStackInit->lSyncWords |= tempRegValue[i+6]<<(8*i);
Wolfgang Betz 0:4fb29d9ee571 257 }
Wolfgang Betz 0:4fb29d9ee571 258 }
Wolfgang Betz 0:4fb29d9ee571 259
Wolfgang Betz 0:4fb29d9ee571 260 }
Wolfgang Betz 0:4fb29d9ee571 261
Wolfgang Betz 0:4fb29d9ee571 262
Wolfgang Betz 0:4fb29d9ee571 263 /**
Wolfgang Betz 0:4fb29d9ee571 264 * @brief Initializes the SPIRIT STack packet addresses according to the specified
Wolfgang Betz 0:4fb29d9ee571 265 * parameters in the PktStackAddresses struct.
Wolfgang Betz 0:4fb29d9ee571 266 * @param pxPktStackAddresses STack packet addresses init structure.
Wolfgang Betz 0:4fb29d9ee571 267 * This parameter is a pointer to @ref PktStackAddressesInit .
Wolfgang Betz 0:4fb29d9ee571 268 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 269 */
Wolfgang Betz 0:4fb29d9ee571 270 void SpiritPktStackAddressesInit(PktStackAddressesInit* pxPktStackAddresses)
Wolfgang Betz 0:4fb29d9ee571 271 {
Wolfgang Betz 0:4fb29d9ee571 272 uint8_t tempRegValue[3];
Wolfgang Betz 0:4fb29d9ee571 273
Wolfgang Betz 0:4fb29d9ee571 274 /* Check the parameters */
Wolfgang Betz 0:4fb29d9ee571 275 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackAddresses->xFilterOnMyAddress));
Wolfgang Betz 0:4fb29d9ee571 276 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackAddresses->xFilterOnMulticastAddress));
Wolfgang Betz 0:4fb29d9ee571 277 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackAddresses->xFilterOnBroadcastAddress));
Wolfgang Betz 0:4fb29d9ee571 278
Wolfgang Betz 0:4fb29d9ee571 279 /* Reads the filtering options ragister */
Wolfgang Betz 0:4fb29d9ee571 280 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 281
Wolfgang Betz 0:4fb29d9ee571 282 /* Enables or disables filtering on my address */
Wolfgang Betz 0:4fb29d9ee571 283 if(pxPktStackAddresses->xFilterOnMyAddress == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 284 {
Wolfgang Betz 0:4fb29d9ee571 285 tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK;
Wolfgang Betz 0:4fb29d9ee571 286 }
Wolfgang Betz 0:4fb29d9ee571 287 else
Wolfgang Betz 0:4fb29d9ee571 288 {
Wolfgang Betz 0:4fb29d9ee571 289 tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK;
Wolfgang Betz 0:4fb29d9ee571 290 }
Wolfgang Betz 0:4fb29d9ee571 291
Wolfgang Betz 0:4fb29d9ee571 292 /* Enables or disables filtering on multicast address */
Wolfgang Betz 0:4fb29d9ee571 293 if(pxPktStackAddresses->xFilterOnMulticastAddress == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 294 {
Wolfgang Betz 0:4fb29d9ee571 295 tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK;
Wolfgang Betz 0:4fb29d9ee571 296 }
Wolfgang Betz 0:4fb29d9ee571 297 else
Wolfgang Betz 0:4fb29d9ee571 298 {
Wolfgang Betz 0:4fb29d9ee571 299 tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK;
Wolfgang Betz 0:4fb29d9ee571 300 }
Wolfgang Betz 0:4fb29d9ee571 301
Wolfgang Betz 0:4fb29d9ee571 302 /* Enables or disables filtering on broadcast address */
Wolfgang Betz 0:4fb29d9ee571 303 if(pxPktStackAddresses->xFilterOnBroadcastAddress == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 304 {
Wolfgang Betz 0:4fb29d9ee571 305 tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK;
Wolfgang Betz 0:4fb29d9ee571 306 }
Wolfgang Betz 0:4fb29d9ee571 307 else
Wolfgang Betz 0:4fb29d9ee571 308 {
Wolfgang Betz 0:4fb29d9ee571 309 tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK;
Wolfgang Betz 0:4fb29d9ee571 310 }
Wolfgang Betz 0:4fb29d9ee571 311
Wolfgang Betz 0:4fb29d9ee571 312 /* Writes value on the register */
Wolfgang Betz 0:4fb29d9ee571 313 g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 314
Wolfgang Betz 0:4fb29d9ee571 315 /* Fills array with the addresses passed in the structure */
Wolfgang Betz 0:4fb29d9ee571 316 tempRegValue[0] = pxPktStackAddresses->cBroadcastAddress;
Wolfgang Betz 0:4fb29d9ee571 317 tempRegValue[1] = pxPktStackAddresses->cMulticastAddress;
Wolfgang Betz 0:4fb29d9ee571 318 tempRegValue[2] = pxPktStackAddresses->cMyAddress;
Wolfgang Betz 0:4fb29d9ee571 319
Wolfgang Betz 0:4fb29d9ee571 320 /* Writes them on the addresses registers */
Wolfgang Betz 0:4fb29d9ee571 321 g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 3, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 322
Wolfgang Betz 0:4fb29d9ee571 323 }
Wolfgang Betz 0:4fb29d9ee571 324
Wolfgang Betz 0:4fb29d9ee571 325
Wolfgang Betz 0:4fb29d9ee571 326 /**
Wolfgang Betz 0:4fb29d9ee571 327 * @brief Returns the SPIRIT STack packet addresses structure according to the specified
Wolfgang Betz 0:4fb29d9ee571 328 * parameters in the registers.
Wolfgang Betz 0:4fb29d9ee571 329 * @param pxPktStackAddresses STack packet addresses init structure.
Wolfgang Betz 0:4fb29d9ee571 330 * This parameter is a pointer to @ref PktStackAddresses.
Wolfgang Betz 0:4fb29d9ee571 331 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 332 */
Wolfgang Betz 0:4fb29d9ee571 333 void SpiritPktStackGetAddressesInfo(PktStackAddressesInit* pxPktStackAddresses)
Wolfgang Betz 0:4fb29d9ee571 334 {
Wolfgang Betz 0:4fb29d9ee571 335 uint8_t tempRegValue[3];
Wolfgang Betz 0:4fb29d9ee571 336
Wolfgang Betz 0:4fb29d9ee571 337 /* Reads values on the PCKT_FLT_GOALS registers */
Wolfgang Betz 0:4fb29d9ee571 338 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 3, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 339
Wolfgang Betz 0:4fb29d9ee571 340 /* Fit the structure with the read addresses */
Wolfgang Betz 0:4fb29d9ee571 341 pxPktStackAddresses->cBroadcastAddress = tempRegValue[0];
Wolfgang Betz 0:4fb29d9ee571 342 pxPktStackAddresses->cMulticastAddress = tempRegValue[1];
Wolfgang Betz 0:4fb29d9ee571 343 pxPktStackAddresses->cMyAddress = tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 344
Wolfgang Betz 0:4fb29d9ee571 345 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]);
Wolfgang Betz 0:4fb29d9ee571 346
Wolfgang Betz 0:4fb29d9ee571 347 /* Fit the structure with the read filtering bits */
Wolfgang Betz 0:4fb29d9ee571 348 pxPktStackAddresses->xFilterOnBroadcastAddress = (SpiritFunctionalState)((tempRegValue[0] >> 1) & 0x01);
Wolfgang Betz 0:4fb29d9ee571 349 pxPktStackAddresses->xFilterOnMulticastAddress = (SpiritFunctionalState)((tempRegValue[0] >> 2) & 0x01);
Wolfgang Betz 0:4fb29d9ee571 350 pxPktStackAddresses->xFilterOnMyAddress = (SpiritFunctionalState)((tempRegValue[0] >> 3) & 0x01);
Wolfgang Betz 0:4fb29d9ee571 351
Wolfgang Betz 0:4fb29d9ee571 352 }
Wolfgang Betz 0:4fb29d9ee571 353
Wolfgang Betz 0:4fb29d9ee571 354
Wolfgang Betz 0:4fb29d9ee571 355 /**
Wolfgang Betz 0:4fb29d9ee571 356 * @brief Initializes the SPIRIT STack packet LLP options according to the specified
Wolfgang Betz 0:4fb29d9ee571 357 * parameters in the PktStackLlpInit struct.
Wolfgang Betz 0:4fb29d9ee571 358 * @param pxPktStackLlpInit STack packet LLP init structure.
Wolfgang Betz 0:4fb29d9ee571 359 * This parameter is a pointer to @ref PktStackLlpInit.
Wolfgang Betz 0:4fb29d9ee571 360 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 361 */
Wolfgang Betz 0:4fb29d9ee571 362 void SpiritPktStackLlpInit(PktStackLlpInit* pxPktStackLlpInit)
Wolfgang Betz 0:4fb29d9ee571 363 {
Wolfgang Betz 0:4fb29d9ee571 364 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 365
Wolfgang Betz 0:4fb29d9ee571 366 /* Check the parameters */
Wolfgang Betz 0:4fb29d9ee571 367 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackLlpInit->xPiggybacking));
Wolfgang Betz 0:4fb29d9ee571 368 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackLlpInit->xAutoAck));
Wolfgang Betz 0:4fb29d9ee571 369 s_assert_param(IS_STACK_NMAX_RETX(pxPktStackLlpInit->xNMaxRetx));
Wolfgang Betz 0:4fb29d9ee571 370 /* check if piggybacking is enabled and autoack is disabled */
Wolfgang Betz 0:4fb29d9ee571 371 s_assert_param(!(pxPktStackLlpInit->xPiggybacking==S_ENABLE && pxPktStackLlpInit->xAutoAck==S_DISABLE));
Wolfgang Betz 0:4fb29d9ee571 372
Wolfgang Betz 0:4fb29d9ee571 373 /* Piggybacking mechanism setting on the PROTOCOL1 register */
Wolfgang Betz 0:4fb29d9ee571 374 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 375 if(pxPktStackLlpInit->xPiggybacking == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 376 {
Wolfgang Betz 0:4fb29d9ee571 377 tempRegValue[0] |= PROTOCOL1_PIGGYBACKING_MASK;
Wolfgang Betz 0:4fb29d9ee571 378 }
Wolfgang Betz 0:4fb29d9ee571 379 else
Wolfgang Betz 0:4fb29d9ee571 380 {
Wolfgang Betz 0:4fb29d9ee571 381 tempRegValue[0] &= ~PROTOCOL1_PIGGYBACKING_MASK;
Wolfgang Betz 0:4fb29d9ee571 382 }
Wolfgang Betz 0:4fb29d9ee571 383
Wolfgang Betz 0:4fb29d9ee571 384 /* RX and TX autoack mechanisms setting on the PROTOCOL0 register */
Wolfgang Betz 0:4fb29d9ee571 385 if(pxPktStackLlpInit->xAutoAck == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 386 {
Wolfgang Betz 0:4fb29d9ee571 387 tempRegValue[1] |= PROTOCOL0_AUTO_ACK_MASK;
Wolfgang Betz 0:4fb29d9ee571 388 }
Wolfgang Betz 0:4fb29d9ee571 389 else
Wolfgang Betz 0:4fb29d9ee571 390 {
Wolfgang Betz 0:4fb29d9ee571 391 tempRegValue[1] &= ~PROTOCOL0_AUTO_ACK_MASK;
Wolfgang Betz 0:4fb29d9ee571 392 }
Wolfgang Betz 0:4fb29d9ee571 393
Wolfgang Betz 0:4fb29d9ee571 394 /* Max number of retransmission setting */
Wolfgang Betz 0:4fb29d9ee571 395 tempRegValue[1] &= ~PROTOCOL0_NMAX_RETX_MASK;
Wolfgang Betz 0:4fb29d9ee571 396 tempRegValue[1] |= pxPktStackLlpInit->xNMaxRetx;
Wolfgang Betz 0:4fb29d9ee571 397
Wolfgang Betz 0:4fb29d9ee571 398 /* Writes registers */
Wolfgang Betz 0:4fb29d9ee571 399 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 400
Wolfgang Betz 0:4fb29d9ee571 401 }
Wolfgang Betz 0:4fb29d9ee571 402
Wolfgang Betz 0:4fb29d9ee571 403
Wolfgang Betz 0:4fb29d9ee571 404 /**
Wolfgang Betz 0:4fb29d9ee571 405 * @brief Returns the SPIRIT STack packet LLP options according to the specified
Wolfgang Betz 0:4fb29d9ee571 406 * values in the registers.
Wolfgang Betz 0:4fb29d9ee571 407 * @param pxPktStackLlpInit STack packet LLP structure.
Wolfgang Betz 0:4fb29d9ee571 408 * This parameter is a pointer to @ref PktStackLlpInit.
Wolfgang Betz 0:4fb29d9ee571 409 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 410 */
Wolfgang Betz 0:4fb29d9ee571 411 void SpiritPktStackLlpGetInfo(PktStackLlpInit* pxPktStackLlpInit)
Wolfgang Betz 0:4fb29d9ee571 412 {
Wolfgang Betz 0:4fb29d9ee571 413 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 414
Wolfgang Betz 0:4fb29d9ee571 415 /* Piggybacking mechanism setting on the PROTOCOL1 register */
Wolfgang Betz 0:4fb29d9ee571 416 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 417
Wolfgang Betz 0:4fb29d9ee571 418 /* Fit the structure with the read values */
Wolfgang Betz 0:4fb29d9ee571 419 pxPktStackLlpInit->xPiggybacking = (SpiritFunctionalState)((tempRegValue[0] >> 6) & 0x01);
Wolfgang Betz 0:4fb29d9ee571 420 pxPktStackLlpInit->xAutoAck = (SpiritFunctionalState)((tempRegValue[1] >> 2) & 0x01);
Wolfgang Betz 0:4fb29d9ee571 421 pxPktStackLlpInit->xNMaxRetx = (StackNMaxReTx)(tempRegValue[1] & PROTOCOL0_NMAX_RETX_MASK);
Wolfgang Betz 0:4fb29d9ee571 422
Wolfgang Betz 0:4fb29d9ee571 423 }
Wolfgang Betz 0:4fb29d9ee571 424
Wolfgang Betz 0:4fb29d9ee571 425
Wolfgang Betz 0:4fb29d9ee571 426 /**
Wolfgang Betz 0:4fb29d9ee571 427 * @brief Configures the STack packet format for SPIRIT.
Wolfgang Betz 0:4fb29d9ee571 428 * @param None.
Wolfgang Betz 0:4fb29d9ee571 429 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 430 */
Wolfgang Betz 0:4fb29d9ee571 431 void SpiritPktStackSetFormat(void)
Wolfgang Betz 0:4fb29d9ee571 432 {
Wolfgang Betz 0:4fb29d9ee571 433 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 434
Wolfgang Betz 0:4fb29d9ee571 435 /* Reads the PCKTCTRL3 register value */
Wolfgang Betz 0:4fb29d9ee571 436 g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 437
Wolfgang Betz 0:4fb29d9ee571 438 /* Build value to be written. Also set to 0 the direct RX mode bits */
Wolfgang Betz 0:4fb29d9ee571 439 tempRegValue &= 0x0F;
Wolfgang Betz 0:4fb29d9ee571 440 tempRegValue |= ((uint8_t)PCKTCTRL3_PCKT_FRMT_STACK);
Wolfgang Betz 0:4fb29d9ee571 441
Wolfgang Betz 0:4fb29d9ee571 442 /* Writes the value on the PCKTCTRL3 register. */
Wolfgang Betz 0:4fb29d9ee571 443 g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 444
Wolfgang Betz 0:4fb29d9ee571 445 /* Reads the PCKTCTRL1 register value */
Wolfgang Betz 0:4fb29d9ee571 446 g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 447
Wolfgang Betz 0:4fb29d9ee571 448 /* Build the new value. Set to 0 the direct TX mode bits */
Wolfgang Betz 0:4fb29d9ee571 449 tempRegValue &= 0xF3;
Wolfgang Betz 0:4fb29d9ee571 450
Wolfgang Betz 0:4fb29d9ee571 451 /* Writes the PCKTCTRL1 value on register */
Wolfgang Betz 0:4fb29d9ee571 452 g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 453
Wolfgang Betz 0:4fb29d9ee571 454 /* Reads the PROTOCOL1 register */
Wolfgang Betz 0:4fb29d9ee571 455 g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 456
Wolfgang Betz 0:4fb29d9ee571 457 /* Mask a reserved bit */
Wolfgang Betz 0:4fb29d9ee571 458 tempRegValue &= ~0x20;
Wolfgang Betz 0:4fb29d9ee571 459
Wolfgang Betz 0:4fb29d9ee571 460 /* Writes the value on the PROTOCOL1 register */
Wolfgang Betz 0:4fb29d9ee571 461 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 462
Wolfgang Betz 0:4fb29d9ee571 463 }
Wolfgang Betz 0:4fb29d9ee571 464
Wolfgang Betz 0:4fb29d9ee571 465
Wolfgang Betz 0:4fb29d9ee571 466 /**
Wolfgang Betz 0:4fb29d9ee571 467 * @brief Sets the address length for SPIRIT STack packets (always 2).
Wolfgang Betz 0:4fb29d9ee571 468 * @param None.
Wolfgang Betz 0:4fb29d9ee571 469 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 470 */
Wolfgang Betz 0:4fb29d9ee571 471 void SpiritPktStackSetAddressLength(void)
Wolfgang Betz 0:4fb29d9ee571 472 {
Wolfgang Betz 0:4fb29d9ee571 473 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 474
Wolfgang Betz 0:4fb29d9ee571 475 /* Reads the PCKTCTRL4 register value */
Wolfgang Betz 0:4fb29d9ee571 476 g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 477
Wolfgang Betz 0:4fb29d9ee571 478 /* Build the new value */
Wolfgang Betz 0:4fb29d9ee571 479 tempRegValue &= ~PCKTCTRL4_ADDRESS_LEN_MASK;
Wolfgang Betz 0:4fb29d9ee571 480 tempRegValue |= ((uint8_t)0x10);
Wolfgang Betz 0:4fb29d9ee571 481
Wolfgang Betz 0:4fb29d9ee571 482 /* Writes the value on the PCKTCTRL4 register */
Wolfgang Betz 0:4fb29d9ee571 483 g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 484
Wolfgang Betz 0:4fb29d9ee571 485 }
Wolfgang Betz 0:4fb29d9ee571 486
Wolfgang Betz 0:4fb29d9ee571 487
Wolfgang Betz 0:4fb29d9ee571 488 /**
Wolfgang Betz 0:4fb29d9ee571 489 * @brief Sets the payload length for SPIRIT STack packets. Since the packet length
Wolfgang Betz 0:4fb29d9ee571 490 * depends from the address (always 2 for this packet format)
Wolfgang Betz 0:4fb29d9ee571 491 * and the control field size, this function reads the control length register
Wolfgang Betz 0:4fb29d9ee571 492 * content in order to determine the correct packet length to be written.
Wolfgang Betz 0:4fb29d9ee571 493 * @param nPayloadLength payload length in bytes.
Wolfgang Betz 0:4fb29d9ee571 494 * This parameter can be any value of uint16_t.
Wolfgang Betz 0:4fb29d9ee571 495 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 496 */
Wolfgang Betz 0:4fb29d9ee571 497 void SpiritPktStackSetPayloadLength(uint16_t nPayloadLength)
Wolfgang Betz 0:4fb29d9ee571 498 {
Wolfgang Betz 0:4fb29d9ee571 499 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 500
Wolfgang Betz 0:4fb29d9ee571 501 /* Computes the oversize (address + control) size */
Wolfgang Betz 0:4fb29d9ee571 502 uint16_t overSize = 2 + (uint16_t) SpiritPktStackGetControlLength();
Wolfgang Betz 0:4fb29d9ee571 503
Wolfgang Betz 0:4fb29d9ee571 504 /* Computes PCKTLEN0 value from lPayloadLength */
Wolfgang Betz 0:4fb29d9ee571 505 tempRegValue[1]=STACK_BUILD_PCKTLEN0(nPayloadLength+overSize);
Wolfgang Betz 0:4fb29d9ee571 506 /* Computes PCKTLEN1 value from lPayloadLength */
Wolfgang Betz 0:4fb29d9ee571 507 tempRegValue[0]=STACK_BUILD_PCKTLEN1(nPayloadLength+overSize);
Wolfgang Betz 0:4fb29d9ee571 508
Wolfgang Betz 0:4fb29d9ee571 509 /* Writes the value on the PCKTLENx registers */
Wolfgang Betz 0:4fb29d9ee571 510 g_xStatus = SpiritSpiWriteRegisters(PCKTLEN1_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 511
Wolfgang Betz 0:4fb29d9ee571 512 }
Wolfgang Betz 0:4fb29d9ee571 513
Wolfgang Betz 0:4fb29d9ee571 514
Wolfgang Betz 0:4fb29d9ee571 515 /**
Wolfgang Betz 0:4fb29d9ee571 516 * @brief Returns the payload length for SPIRIT STack packets. Since the
Wolfgang Betz 0:4fb29d9ee571 517 * packet length depends from the address and the control
Wolfgang Betz 0:4fb29d9ee571 518 * field size, this function reads the correspondent
Wolfgang Betz 0:4fb29d9ee571 519 * registers in order to determine the correct payload length
Wolfgang Betz 0:4fb29d9ee571 520 * to be returned.
Wolfgang Betz 0:4fb29d9ee571 521 * @param None.
Wolfgang Betz 0:4fb29d9ee571 522 * @retval uint16_t Payload length.
Wolfgang Betz 0:4fb29d9ee571 523 */
Wolfgang Betz 0:4fb29d9ee571 524 uint16_t SpiritPktStackGetPayloadLength(void)
Wolfgang Betz 0:4fb29d9ee571 525 {
Wolfgang Betz 0:4fb29d9ee571 526 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 527 /* Computes the oversize (address + control) size */
Wolfgang Betz 0:4fb29d9ee571 528 uint16_t overSize = 2 + (uint16_t) SpiritPktStackGetControlLength();
Wolfgang Betz 0:4fb29d9ee571 529
Wolfgang Betz 0:4fb29d9ee571 530 /* Reads the PCKTLEN1 registers value */
Wolfgang Betz 0:4fb29d9ee571 531 g_xStatus = SpiritSpiReadRegisters(PCKTLEN1_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 532
Wolfgang Betz 0:4fb29d9ee571 533 /* Rebuild and return the payload length value */
Wolfgang Betz 0:4fb29d9ee571 534 return ((((uint16_t) tempRegValue[1])<<8) + (uint16_t) tempRegValue[0] - overSize);
Wolfgang Betz 0:4fb29d9ee571 535
Wolfgang Betz 0:4fb29d9ee571 536 }
Wolfgang Betz 0:4fb29d9ee571 537
Wolfgang Betz 0:4fb29d9ee571 538
Wolfgang Betz 0:4fb29d9ee571 539 /**
Wolfgang Betz 0:4fb29d9ee571 540 * @brief Computes and sets the variable payload length for SPIRIT STack packets.
Wolfgang Betz 0:4fb29d9ee571 541 * @param nMaxPayloadLength payload length in bytes.
Wolfgang Betz 0:4fb29d9ee571 542 * This parameter is an uint16_t.
Wolfgang Betz 0:4fb29d9ee571 543 * @param xControlLength control length in bytes.
Wolfgang Betz 0:4fb29d9ee571 544 * This parameter can be any value of @ref StackControlLength.
Wolfgang Betz 0:4fb29d9ee571 545 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 546 */
Wolfgang Betz 0:4fb29d9ee571 547 void SpiritPktStackSetVarLengthWidth(uint16_t nMaxPayloadLength, StackControlLength xControlLength)
Wolfgang Betz 0:4fb29d9ee571 548 {
Wolfgang Betz 0:4fb29d9ee571 549 uint8_t tempRegValue,
Wolfgang Betz 0:4fb29d9ee571 550 i;
Wolfgang Betz 0:4fb29d9ee571 551 uint32_t packetLength;
Wolfgang Betz 0:4fb29d9ee571 552
Wolfgang Betz 0:4fb29d9ee571 553
Wolfgang Betz 0:4fb29d9ee571 554 /* packet length = payload length + address length (2) + control length */
Wolfgang Betz 0:4fb29d9ee571 555 packetLength=nMaxPayloadLength+2+xControlLength;
Wolfgang Betz 0:4fb29d9ee571 556
Wolfgang Betz 0:4fb29d9ee571 557 /* Computes the number of bits */
Wolfgang Betz 0:4fb29d9ee571 558 for(i=0;i<16;i++)
Wolfgang Betz 0:4fb29d9ee571 559 {
Wolfgang Betz 0:4fb29d9ee571 560 if(packetLength == 0)
Wolfgang Betz 0:4fb29d9ee571 561 {
Wolfgang Betz 0:4fb29d9ee571 562 break;
Wolfgang Betz 0:4fb29d9ee571 563 }
Wolfgang Betz 0:4fb29d9ee571 564 packetLength >>= 1;
Wolfgang Betz 0:4fb29d9ee571 565 }
Wolfgang Betz 0:4fb29d9ee571 566 i==0 ? i=1 : i;
Wolfgang Betz 0:4fb29d9ee571 567
Wolfgang Betz 0:4fb29d9ee571 568 /* Reads the PCKTCTRL3 register value */
Wolfgang Betz 0:4fb29d9ee571 569 g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 570
Wolfgang Betz 0:4fb29d9ee571 571 /* Build the register value */
Wolfgang Betz 0:4fb29d9ee571 572 tempRegValue &= ~PCKTCTRL3_LEN_WID_MASK;
Wolfgang Betz 0:4fb29d9ee571 573 tempRegValue |= ((uint8_t)(i-1));
Wolfgang Betz 0:4fb29d9ee571 574
Wolfgang Betz 0:4fb29d9ee571 575 /* Writes the PCKTCTRL3 register value */
Wolfgang Betz 0:4fb29d9ee571 576 g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 577
Wolfgang Betz 0:4fb29d9ee571 578 }
Wolfgang Betz 0:4fb29d9ee571 579
Wolfgang Betz 0:4fb29d9ee571 580
Wolfgang Betz 0:4fb29d9ee571 581 /**
Wolfgang Betz 0:4fb29d9ee571 582 * @brief Rx packet source mask. Used to mask the address of the accepted packets. If 0 -> no filtering.
Wolfgang Betz 0:4fb29d9ee571 583 * @param cMask Rx source mask.
Wolfgang Betz 0:4fb29d9ee571 584 * This parameter is an uint8_t.
Wolfgang Betz 0:4fb29d9ee571 585 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 586 */
Wolfgang Betz 0:4fb29d9ee571 587 void SpiritPktStackSetRxSourceMask(uint8_t cMask)
Wolfgang Betz 0:4fb29d9ee571 588 {
Wolfgang Betz 0:4fb29d9ee571 589 /* Writes value on the register PCKT_FLT_GOALS_SOURCE_MASK */
Wolfgang Betz 0:4fb29d9ee571 590 g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_SOURCE_MASK_BASE, 1, &cMask);
Wolfgang Betz 0:4fb29d9ee571 591
Wolfgang Betz 0:4fb29d9ee571 592 }
Wolfgang Betz 0:4fb29d9ee571 593
Wolfgang Betz 0:4fb29d9ee571 594
Wolfgang Betz 0:4fb29d9ee571 595 /**
Wolfgang Betz 0:4fb29d9ee571 596 * @brief Returns the Rx packet source mask. Used to mask the address of the accepted packets. If 0 -> no filtering.
Wolfgang Betz 0:4fb29d9ee571 597 * @param None.
Wolfgang Betz 0:4fb29d9ee571 598 * @retval uint8_t Rx source mask.
Wolfgang Betz 0:4fb29d9ee571 599 */
Wolfgang Betz 0:4fb29d9ee571 600 uint8_t SpiritPktStackGetRxSourceMask(void)
Wolfgang Betz 0:4fb29d9ee571 601 {
Wolfgang Betz 0:4fb29d9ee571 602 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 603
Wolfgang Betz 0:4fb29d9ee571 604 /* Writes value on the PCKT_FLT_GOALS_SOURCE_MASK register */
Wolfgang Betz 0:4fb29d9ee571 605 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_SOURCE_MASK_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 606
Wolfgang Betz 0:4fb29d9ee571 607 /* Return the read value */
Wolfgang Betz 0:4fb29d9ee571 608 return tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 609
Wolfgang Betz 0:4fb29d9ee571 610 }
Wolfgang Betz 0:4fb29d9ee571 611
Wolfgang Betz 0:4fb29d9ee571 612 /**
Wolfgang Betz 0:4fb29d9ee571 613 * @brief Returns the packet length field of the received packet.
Wolfgang Betz 0:4fb29d9ee571 614 * @param None.
Wolfgang Betz 0:4fb29d9ee571 615 * @retval uint16_t Packet length.
Wolfgang Betz 0:4fb29d9ee571 616 */
Wolfgang Betz 0:4fb29d9ee571 617 uint16_t SpiritPktStackGetReceivedPktLength(void)
Wolfgang Betz 0:4fb29d9ee571 618 {
Wolfgang Betz 0:4fb29d9ee571 619 uint8_t tempRegValue[2];
Wolfgang Betz 0:4fb29d9ee571 620 uint16_t tempLength;
Wolfgang Betz 0:4fb29d9ee571 621
Wolfgang Betz 0:4fb29d9ee571 622 /* Reads the RX_PCKT_LENx registers value */
Wolfgang Betz 0:4fb29d9ee571 623 g_xStatus = SpiritSpiReadRegisters(RX_PCKT_LEN1_BASE, 2, tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 624
Wolfgang Betz 0:4fb29d9ee571 625 /* Rebuild and return the the length field */
Wolfgang Betz 0:4fb29d9ee571 626 tempLength = ((((uint16_t) tempRegValue[0]) << 8) + (uint16_t) tempRegValue[1]);
Wolfgang Betz 0:4fb29d9ee571 627
Wolfgang Betz 0:4fb29d9ee571 628 /* Computes the oversize (address + control) size */
Wolfgang Betz 0:4fb29d9ee571 629 tempLength -= 2 + (uint16_t) SpiritPktStackGetControlLength();
Wolfgang Betz 0:4fb29d9ee571 630
Wolfgang Betz 0:4fb29d9ee571 631 return tempLength;
Wolfgang Betz 0:4fb29d9ee571 632
Wolfgang Betz 0:4fb29d9ee571 633 }
Wolfgang Betz 0:4fb29d9ee571 634
Wolfgang Betz 0:4fb29d9ee571 635
Wolfgang Betz 0:4fb29d9ee571 636 /**
Wolfgang Betz 0:4fb29d9ee571 637 * @brief If enabled RX packet is accepted only if the masked source address field matches the
Wolfgang Betz 0:4fb29d9ee571 638 * masked source address field reference (SOURCE_MASK & SOURCE_FIELD_REF == SOURCE_MASK & RX_SOURCE_FIELD).
Wolfgang Betz 0:4fb29d9ee571 639 * @param xNewState new state for Source address filtering enable bit.
Wolfgang Betz 0:4fb29d9ee571 640 * This parameter can be S_ENABLE or S_DISABLE.
Wolfgang Betz 0:4fb29d9ee571 641 * @retval None.
Wolfgang Betz 0:4fb29d9ee571 642 * @note This filtering control is enabled by default but the source address mask is by default set to 0.
Wolfgang Betz 0:4fb29d9ee571 643 * As a matter of fact the user has to enable the source filtering bit after the packet initialization
Wolfgang Betz 0:4fb29d9ee571 644 * because the PktInit routine disables it.
Wolfgang Betz 0:4fb29d9ee571 645 */
Wolfgang Betz 0:4fb29d9ee571 646 void SpiritPktStackFilterOnSourceAddress(SpiritFunctionalState xNewState)
Wolfgang Betz 0:4fb29d9ee571 647 {
Wolfgang Betz 0:4fb29d9ee571 648 uint8_t tempRegValue;
Wolfgang Betz 0:4fb29d9ee571 649
Wolfgang Betz 0:4fb29d9ee571 650 /* Check the parameters */
Wolfgang Betz 0:4fb29d9ee571 651 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
Wolfgang Betz 0:4fb29d9ee571 652
Wolfgang Betz 0:4fb29d9ee571 653
Wolfgang Betz 0:4fb29d9ee571 654 /* Modify the register value: set or reset the source bit filtering */
Wolfgang Betz 0:4fb29d9ee571 655 g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 656
Wolfgang Betz 0:4fb29d9ee571 657 /* Set or reset the SOURCE ADDRESS filtering enabling bit */
Wolfgang Betz 0:4fb29d9ee571 658 if(xNewState == S_ENABLE)
Wolfgang Betz 0:4fb29d9ee571 659 {
Wolfgang Betz 0:4fb29d9ee571 660 tempRegValue |= PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK;
Wolfgang Betz 0:4fb29d9ee571 661 }
Wolfgang Betz 0:4fb29d9ee571 662 else
Wolfgang Betz 0:4fb29d9ee571 663 {
Wolfgang Betz 0:4fb29d9ee571 664 tempRegValue &= ~PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK;
Wolfgang Betz 0:4fb29d9ee571 665 }
Wolfgang Betz 0:4fb29d9ee571 666
Wolfgang Betz 0:4fb29d9ee571 667 /* Writes the new value on the PCKT_FLT_OPTIONS register */
Wolfgang Betz 0:4fb29d9ee571 668 g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue);
Wolfgang Betz 0:4fb29d9ee571 669
Wolfgang Betz 0:4fb29d9ee571 670 }
Wolfgang Betz 0:4fb29d9ee571 671
Wolfgang Betz 0:4fb29d9ee571 672 /**
Wolfgang Betz 0:4fb29d9ee571 673 *@}
Wolfgang Betz 0:4fb29d9ee571 674 */
Wolfgang Betz 0:4fb29d9ee571 675
Wolfgang Betz 0:4fb29d9ee571 676 /**
Wolfgang Betz 0:4fb29d9ee571 677 *@}
Wolfgang Betz 0:4fb29d9ee571 678 */
Wolfgang Betz 0:4fb29d9ee571 679
Wolfgang Betz 0:4fb29d9ee571 680
Wolfgang Betz 0:4fb29d9ee571 681 /**
Wolfgang Betz 0:4fb29d9ee571 682 *@}
Wolfgang Betz 0:4fb29d9ee571 683 */
Wolfgang Betz 0:4fb29d9ee571 684
Wolfgang Betz 0:4fb29d9ee571 685
Wolfgang Betz 0:4fb29d9ee571 686
Wolfgang Betz 0:4fb29d9ee571 687 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/