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 Jul 06 11:13:31 2017 +0200
Revision:
67:93bec0baf1de
Parent:
34:edda6a7238ec
Clarify some comments

Who changed what in which revision?

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