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:
Tue Nov 22 11:40:10 2016 +0100
Revision:
34:edda6a7238ec
Child:
67:93bec0baf1de
Perform re-naming

Who changed what in which revision?

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