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