SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

Committer:
GregCr
Date:
Mon Sep 04 15:16:44 2017 +0000
Revision:
4:c6ef863d0b07
Parent:
3:7e3595a9ebe0
Child:
5:e488e6f185f3
Candidate release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:deaafdfde3bb 1 /*
GregCr 4:c6ef863d0b07 2 ______ _
GregCr 0:deaafdfde3bb 3 / _____) _ | |
GregCr 0:deaafdfde3bb 4 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:deaafdfde3bb 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:deaafdfde3bb 6 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:deaafdfde3bb 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
GregCr 4:c6ef863d0b07 8 (C)2017 Semtech
GregCr 0:deaafdfde3bb 9
GregCr 4:c6ef863d0b07 10 Description: Generic SX126x driver implementation
GregCr 0:deaafdfde3bb 11
GregCr 0:deaafdfde3bb 12 License: Revised BSD License, see LICENSE.TXT file include in the project
GregCr 0:deaafdfde3bb 13
GregCr 4:c6ef863d0b07 14 Authors: Miguel Luis, Gregory Cristian
GregCr 0:deaafdfde3bb 15 */
GregCr 2:4ff11ea92fbe 16 #ifndef __SX126x_H__
GregCr 2:4ff11ea92fbe 17 #define __SX126x_H__
GregCr 0:deaafdfde3bb 18
GregCr 0:deaafdfde3bb 19 #include "radio.h"
GregCr 0:deaafdfde3bb 20
GregCr 0:deaafdfde3bb 21 /*!
GregCr 0:deaafdfde3bb 22 * \brief Enables/disables driver debug features
GregCr 0:deaafdfde3bb 23 */
GregCr 2:4ff11ea92fbe 24 #define SX126x_DEBUG 0
GregCr 0:deaafdfde3bb 25
GregCr 0:deaafdfde3bb 26
GregCr 0:deaafdfde3bb 27
GregCr 0:deaafdfde3bb 28 /*!
GregCr 0:deaafdfde3bb 29 * \brief Hardware IO IRQ callback function definition
GregCr 0:deaafdfde3bb 30 */
GregCr 2:4ff11ea92fbe 31 class SX126x;
GregCr 2:4ff11ea92fbe 32 typedef void ( SX126x::*DioIrqHandler )( void );
GregCr 0:deaafdfde3bb 33
GregCr 0:deaafdfde3bb 34 /*!
GregCr 0:deaafdfde3bb 35 * \brief IRQ triggers callback function definition
GregCr 0:deaafdfde3bb 36 */
GregCr 2:4ff11ea92fbe 37 class SX126xHal;
GregCr 2:4ff11ea92fbe 38 typedef void ( SX126xHal::*Trigger )( void );
GregCr 0:deaafdfde3bb 39
GregCr 0:deaafdfde3bb 40 /*!
GregCr 0:deaafdfde3bb 41 * \brief Provides the frequency of the chip running on the radio and the frequency step
GregCr 0:deaafdfde3bb 42 *
GregCr 0:deaafdfde3bb 43 * \remark These defines are used for computing the frequency divider to set the RF frequency
GregCr 0:deaafdfde3bb 44 */
GregCr 0:deaafdfde3bb 45 #define XTAL_FREQ 32000000
GregCr 4:c6ef863d0b07 46 #define FREQ_DIV 33554432
GregCr 4:c6ef863d0b07 47 #define FREQ_STEP 0.95367431640625 // ( ( double )( XTAL_FREQ / ( double )FREQ_DIV ) )
GregCr 4:c6ef863d0b07 48 #define FREQ_ERR 0.47683715820312
GregCr 0:deaafdfde3bb 49
GregCr 0:deaafdfde3bb 50 /*!
GregCr 0:deaafdfde3bb 51 * \brief Compensation delay for SetAutoTx/Rx functions in 15.625 microseconds
GregCr 0:deaafdfde3bb 52 */
GregCr 0:deaafdfde3bb 53 #define AUTO_RX_TX_OFFSET 2
GregCr 0:deaafdfde3bb 54
GregCr 0:deaafdfde3bb 55 /*!
GregCr 3:7e3595a9ebe0 56 * \brief LFSR initial value to compute IBM type CRC
GregCr 3:7e3595a9ebe0 57 */
GregCr 3:7e3595a9ebe0 58 #define CRC_IBM_SEED 0xFFFF
GregCr 3:7e3595a9ebe0 59
GregCr 3:7e3595a9ebe0 60 /*!
GregCr 3:7e3595a9ebe0 61 * \brief LFSR initial value to compute CCIT type CRC
GregCr 3:7e3595a9ebe0 62 */
GregCr 3:7e3595a9ebe0 63 #define CRC_CCITT_SEED 0x1D0F
GregCr 3:7e3595a9ebe0 64
GregCr 3:7e3595a9ebe0 65 /*!
GregCr 3:7e3595a9ebe0 66 * \brief Polynomial used to compute IBM CRC
GregCr 3:7e3595a9ebe0 67 */
GregCr 3:7e3595a9ebe0 68 #define CRC_POLYNOMIAL_IBM 0x8005
GregCr 3:7e3595a9ebe0 69
GregCr 3:7e3595a9ebe0 70 /*!
GregCr 3:7e3595a9ebe0 71 * \brief Polynomial used to compute CCIT CRC
GregCr 3:7e3595a9ebe0 72 */
GregCr 3:7e3595a9ebe0 73 #define CRC_POLYNOMIAL_CCITT 0x1021
GregCr 3:7e3595a9ebe0 74
GregCr 3:7e3595a9ebe0 75 /*!
GregCr 0:deaafdfde3bb 76 * \brief The address of the register holding the first byte defining the CRC seed
GregCr 0:deaafdfde3bb 77 *
GregCr 0:deaafdfde3bb 78 */
GregCr 4:c6ef863d0b07 79 #define REG_LR_CRCSEEDBASEADDR 0x06BC
GregCr 0:deaafdfde3bb 80
GregCr 0:deaafdfde3bb 81 /*!
GregCr 0:deaafdfde3bb 82 * \brief The address of the register holding the first byte defining the CRC polynomial
GregCr 0:deaafdfde3bb 83 */
GregCr 4:c6ef863d0b07 84 #define REG_LR_CRCPOLYBASEADDR 0x06BE
GregCr 0:deaafdfde3bb 85
GregCr 0:deaafdfde3bb 86 /*!
GregCr 0:deaafdfde3bb 87 * \brief The address of the register holding the first byte defining the whitening seed
GregCr 0:deaafdfde3bb 88 */
GregCr 4:c6ef863d0b07 89 #define REG_LR_WHITSEEDBASEADDR_MSB 0x06B8
GregCr 4:c6ef863d0b07 90 #define REG_LR_WHITSEEDBASEADDR_LSB 0x06B9
GregCr 0:deaafdfde3bb 91
GregCr 0:deaafdfde3bb 92 /*!
GregCr 4:c6ef863d0b07 93 * \brief The address of the register holding the packet configuration
GregCr 0:deaafdfde3bb 94 */
GregCr 4:c6ef863d0b07 95 #define REG_LR_PACKETPARAMS 0x0704
GregCr 4:c6ef863d0b07 96
GregCr 4:c6ef863d0b07 97 /*!
GregCr 4:c6ef863d0b07 98 * \brief The address of the register holding the payload size
GregCr 4:c6ef863d0b07 99 */
GregCr 4:c6ef863d0b07 100 #define REG_LR_PAYLOADLENGTH 0x0702
GregCr 0:deaafdfde3bb 101
GregCr 0:deaafdfde3bb 102 /*!
GregCr 0:deaafdfde3bb 103 * \brief The addresses of the registers holding SyncWords values
GregCr 0:deaafdfde3bb 104 */
GregCr 4:c6ef863d0b07 105 #define REG_LR_SYNCWORDBASEADDRESS 0x06C0
GregCr 4:c6ef863d0b07 106
GregCr 4:c6ef863d0b07 107 /*!
GregCr 4:c6ef863d0b07 108 * \brief The addresses of the register holding LoRa Modem SyncWord value
GregCr 4:c6ef863d0b07 109 */
GregCr 4:c6ef863d0b07 110 #define REG_LR_SYNCWORD 0x0740
GregCr 4:c6ef863d0b07 111
GregCr 4:c6ef863d0b07 112 /*!
GregCr 4:c6ef863d0b07 113 * Syncword for Private LoRa networks
GregCr 4:c6ef863d0b07 114 */
GregCr 4:c6ef863d0b07 115 #define LORA_MAC_PRIVATE_SYNCWORD 0x1424
GregCr 4:c6ef863d0b07 116
GregCr 4:c6ef863d0b07 117 /*!
GregCr 4:c6ef863d0b07 118 * Syncword for Public LoRa networks
GregCr 4:c6ef863d0b07 119 */
GregCr 4:c6ef863d0b07 120 #define LORA_MAC_PUBLIC_SYNCWORD 0x3444
GregCr 0:deaafdfde3bb 121
GregCr 4:c6ef863d0b07 122 /*!
GregCr 4:c6ef863d0b07 123 * The address of the register giving a 4 bytes random number
GregCr 4:c6ef863d0b07 124 */
GregCr 4:c6ef863d0b07 125 #define RANDOM_NUMBER_GENERATORBASEADDR 0x0819
GregCr 0:deaafdfde3bb 126
GregCr 0:deaafdfde3bb 127 /*!
GregCr 4:c6ef863d0b07 128 * The address of the register holding RX Gain value (0x94: power saving, 0x96: rx boosted)
GregCr 4:c6ef863d0b07 129 */
GregCr 4:c6ef863d0b07 130 #define REG_RX_GAIN 0x08AC
GregCr 4:c6ef863d0b07 131
GregCr 4:c6ef863d0b07 132 /*!
GregCr 4:c6ef863d0b07 133 * The address of the register holding Bit Sync configuration
GregCr 4:c6ef863d0b07 134 */
GregCr 4:c6ef863d0b07 135 #define REG_BIT_SYNC 0x06AC
GregCr 4:c6ef863d0b07 136
GregCr 4:c6ef863d0b07 137 /*!
GregCr 4:c6ef863d0b07 138 * Change the value on the device internal trimming capacitor
GregCr 4:c6ef863d0b07 139 */
GregCr 4:c6ef863d0b07 140 #define REG_XTA_TRIM 0x0911
GregCr 4:c6ef863d0b07 141 /*!
GregCr 0:deaafdfde3bb 142 * \brief Represents the states of the radio
GregCr 0:deaafdfde3bb 143 */
GregCr 4:c6ef863d0b07 144 typedef enum
GregCr 0:deaafdfde3bb 145 {
GregCr 4:c6ef863d0b07 146 RF_IDLE = 0x00, //!< The radio is idle
GregCr 0:deaafdfde3bb 147 RF_RX_RUNNING, //!< The radio is in reception state
GregCr 0:deaafdfde3bb 148 RF_TX_RUNNING, //!< The radio is in transmission state
GregCr 0:deaafdfde3bb 149 RF_CAD, //!< The radio is doing channel activity detection
GregCr 4:c6ef863d0b07 150 }RadioStates_t;
GregCr 0:deaafdfde3bb 151
GregCr 0:deaafdfde3bb 152 /*!
GregCr 0:deaafdfde3bb 153 * \brief Represents the operating mode the radio is actually running
GregCr 0:deaafdfde3bb 154 */
GregCr 4:c6ef863d0b07 155 typedef enum
GregCr 0:deaafdfde3bb 156 {
GregCr 4:c6ef863d0b07 157 MODE_SLEEP = 0x00, //! The radio is in sleep mode
GregCr 0:deaafdfde3bb 158 MODE_STDBY_RC, //! The radio is in standby mode with RC oscillator
GregCr 0:deaafdfde3bb 159 MODE_STDBY_XOSC, //! The radio is in standby mode with XOSC oscillator
GregCr 0:deaafdfde3bb 160 MODE_FS, //! The radio is in frequency synthesis mode
GregCr 0:deaafdfde3bb 161 MODE_TX, //! The radio is in transmit mode
GregCr 0:deaafdfde3bb 162 MODE_RX, //! The radio is in receive mode
GregCr 4:c6ef863d0b07 163 MODE_RX_DC, //! The radio is in receive duty cycle mode
GregCr 0:deaafdfde3bb 164 MODE_CAD //! The radio is in channel activity detection mode
GregCr 4:c6ef863d0b07 165 }RadioOperatingModes_t;
GregCr 0:deaafdfde3bb 166
GregCr 0:deaafdfde3bb 167 /*!
GregCr 0:deaafdfde3bb 168 * \brief Declares the oscillator in use while in standby mode
GregCr 0:deaafdfde3bb 169 *
GregCr 0:deaafdfde3bb 170 * Using the STDBY_RC standby mode allow to reduce the energy consumption
GregCr 0:deaafdfde3bb 171 * STDBY_XOSC should be used for time critical applications
GregCr 0:deaafdfde3bb 172 */
GregCr 4:c6ef863d0b07 173 typedef enum
GregCr 0:deaafdfde3bb 174 {
GregCr 4:c6ef863d0b07 175 STDBY_RC = 0x00,
GregCr 4:c6ef863d0b07 176 STDBY_XOSC = 0x01,
GregCr 4:c6ef863d0b07 177 }RadioStandbyModes_t;
GregCr 4:c6ef863d0b07 178
GregCr 3:7e3595a9ebe0 179 /*!
GregCr 3:7e3595a9ebe0 180 * \brief Declares the power regulation used to power the device
GregCr 3:7e3595a9ebe0 181 *
GregCr 3:7e3595a9ebe0 182 * This command allows the user to specify if DC-DC or LDO is used for power regulation.
GregCr 3:7e3595a9ebe0 183 * Using only LDO implies that the Rx or Tx current is doubled
GregCr 3:7e3595a9ebe0 184 */
GregCr 4:c6ef863d0b07 185 typedef enum
GregCr 3:7e3595a9ebe0 186 {
GregCr 4:c6ef863d0b07 187 USE_LDO = 0x00, // default
GregCr 4:c6ef863d0b07 188 USE_DCDC = 0x01,
GregCr 4:c6ef863d0b07 189 }RadioRegulatorMode_t;
GregCr 0:deaafdfde3bb 190
GregCr 0:deaafdfde3bb 191 /*!
GregCr 0:deaafdfde3bb 192 * \brief Represents the possible packet type (i.e. modem) used
GregCr 0:deaafdfde3bb 193 */
GregCr 4:c6ef863d0b07 194 typedef enum
GregCr 0:deaafdfde3bb 195 {
GregCr 4:c6ef863d0b07 196 PACKET_TYPE_GFSK = 0x00,
GregCr 4:c6ef863d0b07 197 PACKET_TYPE_LORA = 0x01,
GregCr 4:c6ef863d0b07 198 PACKET_TYPE_NONE = 0x0F,
GregCr 4:c6ef863d0b07 199 }RadioPacketTypes_t;
GregCr 0:deaafdfde3bb 200
GregCr 0:deaafdfde3bb 201 /*!
GregCr 0:deaafdfde3bb 202 * \brief Represents the ramping time for power amplifier
GregCr 0:deaafdfde3bb 203 */
GregCr 4:c6ef863d0b07 204 typedef enum
GregCr 0:deaafdfde3bb 205 {
GregCr 4:c6ef863d0b07 206 RADIO_RAMP_10_US = 0x00,
GregCr 4:c6ef863d0b07 207 RADIO_RAMP_20_US = 0x01,
GregCr 4:c6ef863d0b07 208 RADIO_RAMP_40_US = 0x02,
GregCr 4:c6ef863d0b07 209 RADIO_RAMP_80_US = 0x03,
GregCr 4:c6ef863d0b07 210 RADIO_RAMP_200_US = 0x04,
GregCr 4:c6ef863d0b07 211 RADIO_RAMP_800_US = 0x05,
GregCr 4:c6ef863d0b07 212 RADIO_RAMP_1700_US = 0x06,
GregCr 4:c6ef863d0b07 213 RADIO_RAMP_3400_US = 0x07,
GregCr 4:c6ef863d0b07 214 }RadioRampTimes_t;
GregCr 0:deaafdfde3bb 215
GregCr 0:deaafdfde3bb 216 /*!
GregCr 0:deaafdfde3bb 217 * \brief Represents the number of symbols to be used for channel activity detection operation
GregCr 0:deaafdfde3bb 218 */
GregCr 4:c6ef863d0b07 219 typedef enum
GregCr 0:deaafdfde3bb 220 {
GregCr 0:deaafdfde3bb 221 LORA_CAD_01_SYMBOL = 0x00,
GregCr 0:deaafdfde3bb 222 LORA_CAD_02_SYMBOL = 0x01,
GregCr 0:deaafdfde3bb 223 LORA_CAD_04_SYMBOL = 0x02,
GregCr 0:deaafdfde3bb 224 LORA_CAD_08_SYMBOL = 0x03,
GregCr 0:deaafdfde3bb 225 LORA_CAD_16_SYMBOL = 0x04,
GregCr 4:c6ef863d0b07 226 }RadioLoRaCadSymbols_t;
GregCr 0:deaafdfde3bb 227
GregCr 4:c6ef863d0b07 228 /*!
GregCr 4:c6ef863d0b07 229 * \brief Represents the Channel Activity Detection actions after the CAD operation is finished
GregCr 4:c6ef863d0b07 230 */
GregCr 4:c6ef863d0b07 231 typedef enum
GregCr 4:c6ef863d0b07 232 {
GregCr 4:c6ef863d0b07 233 LORA_CAD_ONLY = 0x00,
GregCr 4:c6ef863d0b07 234 LORA_CAD_RX = 0x01,
GregCr 4:c6ef863d0b07 235 LORA_CAD_LBT = 0x10,
GregCr 4:c6ef863d0b07 236 }RadioCadExitModes_t;
GregCr 0:deaafdfde3bb 237
GregCr 0:deaafdfde3bb 238 /*!
GregCr 0:deaafdfde3bb 239 * \brief Represents the modulation shaping parameter
GregCr 0:deaafdfde3bb 240 */
GregCr 4:c6ef863d0b07 241 typedef enum
GregCr 0:deaafdfde3bb 242 {
GregCr 4:c6ef863d0b07 243 MOD_SHAPING_OFF = 0x00,
GregCr 3:7e3595a9ebe0 244 MOD_SHAPING_G_BT_03 = 0x08,
GregCr 3:7e3595a9ebe0 245 MOD_SHAPING_G_BT_05 = 0x09,
GregCr 3:7e3595a9ebe0 246 MOD_SHAPING_G_BT_07 = 0x0A,
GregCr 3:7e3595a9ebe0 247 MOD_SHAPING_G_BT_1 = 0x0B,
GregCr 4:c6ef863d0b07 248 }RadioModShapings_t;
GregCr 3:7e3595a9ebe0 249
GregCr 3:7e3595a9ebe0 250 /*!
GregCr 3:7e3595a9ebe0 251 * \brief Represents the modulation shaping parameter
GregCr 3:7e3595a9ebe0 252 */
GregCr 4:c6ef863d0b07 253 typedef enum
GregCr 3:7e3595a9ebe0 254 {
GregCr 3:7e3595a9ebe0 255 RX_BW_4800 = 0x1F,
GregCr 3:7e3595a9ebe0 256 RX_BW_5800 = 0x17,
GregCr 3:7e3595a9ebe0 257 RX_BW_7300 = 0x0F,
GregCr 3:7e3595a9ebe0 258 RX_BW_9700 = 0x1E,
GregCr 3:7e3595a9ebe0 259 RX_BW_11700 = 0x16,
GregCr 3:7e3595a9ebe0 260 RX_BW_14600 = 0x0E,
GregCr 3:7e3595a9ebe0 261 RX_BW_19500 = 0x1D,
GregCr 3:7e3595a9ebe0 262 RX_BW_23400 = 0x15,
GregCr 3:7e3595a9ebe0 263 RX_BW_29300 = 0x0D,
GregCr 3:7e3595a9ebe0 264 RX_BW_39000 = 0x1C,
GregCr 3:7e3595a9ebe0 265 RX_BW_46900 = 0x14,
GregCr 3:7e3595a9ebe0 266 RX_BW_58600 = 0x0C,
GregCr 3:7e3595a9ebe0 267 RX_BW_78200 = 0x1B,
GregCr 3:7e3595a9ebe0 268 RX_BW_93800 = 0x13,
GregCr 3:7e3595a9ebe0 269 RX_BW_117300 = 0x0B,
GregCr 3:7e3595a9ebe0 270 RX_BW_156200 = 0x1A,
GregCr 3:7e3595a9ebe0 271 RX_BW_187200 = 0x12,
GregCr 3:7e3595a9ebe0 272 RX_BW_234300 = 0x0A,
GregCr 4:c6ef863d0b07 273 RX_BW_312000 = 0x19,
GregCr 3:7e3595a9ebe0 274 RX_BW_373600 = 0x11,
GregCr 4:c6ef863d0b07 275 RX_BW_467000 = 0x09,
GregCr 4:c6ef863d0b07 276 }RadioRxBandwidth_t;
GregCr 0:deaafdfde3bb 277
GregCr 0:deaafdfde3bb 278 /*!
GregCr 0:deaafdfde3bb 279 * \brief Represents the possible spreading factor values in LoRa packet types
GregCr 0:deaafdfde3bb 280 */
GregCr 4:c6ef863d0b07 281 typedef enum
GregCr 0:deaafdfde3bb 282 {
GregCr 0:deaafdfde3bb 283 LORA_SF5 = 0x05,
GregCr 0:deaafdfde3bb 284 LORA_SF6 = 0x06,
GregCr 0:deaafdfde3bb 285 LORA_SF7 = 0x07,
GregCr 0:deaafdfde3bb 286 LORA_SF8 = 0x08,
GregCr 0:deaafdfde3bb 287 LORA_SF9 = 0x09,
GregCr 0:deaafdfde3bb 288 LORA_SF10 = 0x0A,
GregCr 0:deaafdfde3bb 289 LORA_SF11 = 0x0B,
GregCr 0:deaafdfde3bb 290 LORA_SF12 = 0x0C,
GregCr 4:c6ef863d0b07 291 }RadioLoRaSpreadingFactors_t;
GregCr 0:deaafdfde3bb 292
GregCr 0:deaafdfde3bb 293 /*!
GregCr 0:deaafdfde3bb 294 * \brief Represents the bandwidth values for LoRa packet type
GregCr 0:deaafdfde3bb 295 */
GregCr 4:c6ef863d0b07 296 typedef enum
GregCr 0:deaafdfde3bb 297 {
GregCr 3:7e3595a9ebe0 298 LORA_BW_500 = 6,
GregCr 3:7e3595a9ebe0 299 LORA_BW_250 = 5,
GregCr 3:7e3595a9ebe0 300 LORA_BW_125 = 4,
GregCr 3:7e3595a9ebe0 301 LORA_BW_062 = 3,
GregCr 3:7e3595a9ebe0 302 LORA_BW_041 = 10,
GregCr 3:7e3595a9ebe0 303 LORA_BW_031 = 2,
GregCr 3:7e3595a9ebe0 304 LORA_BW_020 = 9,
GregCr 3:7e3595a9ebe0 305 LORA_BW_015 = 1,
GregCr 3:7e3595a9ebe0 306 LORA_BW_010 = 8,
GregCr 4:c6ef863d0b07 307 LORA_BW_007 = 0,
GregCr 4:c6ef863d0b07 308 }RadioLoRaBandwidths_t;
GregCr 0:deaafdfde3bb 309
GregCr 0:deaafdfde3bb 310 /*!
GregCr 0:deaafdfde3bb 311 * \brief Represents the coding rate values for LoRa packet type
GregCr 0:deaafdfde3bb 312 */
GregCr 4:c6ef863d0b07 313 typedef enum
GregCr 0:deaafdfde3bb 314 {
GregCr 0:deaafdfde3bb 315 LORA_CR_4_5 = 0x01,
GregCr 0:deaafdfde3bb 316 LORA_CR_4_6 = 0x02,
GregCr 0:deaafdfde3bb 317 LORA_CR_4_7 = 0x03,
GregCr 0:deaafdfde3bb 318 LORA_CR_4_8 = 0x04,
GregCr 4:c6ef863d0b07 319 }RadioLoRaCodingRates_t;
GregCr 0:deaafdfde3bb 320
GregCr 3:7e3595a9ebe0 321 /*!
GregCr 3:7e3595a9ebe0 322 * \brief Represents the preamble length used to detect the packet on Rx side
GregCr 3:7e3595a9ebe0 323 */
GregCr 4:c6ef863d0b07 324 typedef enum
GregCr 3:7e3595a9ebe0 325 {
GregCr 3:7e3595a9ebe0 326 RADIO_PREAMBLE_DETECTOR_OFF = 0x00, //!< Preamble detection length off
GregCr 3:7e3595a9ebe0 327 RADIO_PREAMBLE_DETECTOR_08_BITS = 0x04, //!< Preamble detection length 8 bits
GregCr 4:c6ef863d0b07 328 RADIO_PREAMBLE_DETECTOR_16_BITS = 0x05, //!< Preamble detection length 16 bits
GregCr 4:c6ef863d0b07 329 RADIO_PREAMBLE_DETECTOR_24_BITS = 0x06, //!< Preamble detection length 24 bits
GregCr 4:c6ef863d0b07 330 RADIO_PREAMBLE_DETECTOR_32_BITS = 0x07, //!< Preamble detection length 32 bit
GregCr 4:c6ef863d0b07 331 }RadioPreambleDetection_t;
GregCr 0:deaafdfde3bb 332
GregCr 0:deaafdfde3bb 333 /*!
GregCr 0:deaafdfde3bb 334 * \brief Represents the possible combinations of SyncWord correlators activated
GregCr 0:deaafdfde3bb 335 */
GregCr 4:c6ef863d0b07 336 typedef enum
GregCr 0:deaafdfde3bb 337 {
GregCr 0:deaafdfde3bb 338 RADIO_ADDRESSCOMP_FILT_OFF = 0x00, //!< No correlator turned on, i.e. do not search for SyncWord
GregCr 0:deaafdfde3bb 339 RADIO_ADDRESSCOMP_FILT_NODE = 0x01,
GregCr 0:deaafdfde3bb 340 RADIO_ADDRESSCOMP_FILT_NODE_BROAD = 0x02,
GregCr 4:c6ef863d0b07 341 }RadioAddressComp_t;
GregCr 0:deaafdfde3bb 342
GregCr 0:deaafdfde3bb 343 /*!
GregCr 0:deaafdfde3bb 344 * \brief Radio packet length mode
GregCr 0:deaafdfde3bb 345 */
GregCr 4:c6ef863d0b07 346 typedef enum
GregCr 0:deaafdfde3bb 347 {
GregCr 0:deaafdfde3bb 348 RADIO_PACKET_FIXED_LENGTH = 0x00, //!< The packet is known on both sides, no header included in the packet
GregCr 0:deaafdfde3bb 349 RADIO_PACKET_VARIABLE_LENGTH = 0x01, //!< The packet is on variable size, header included
GregCr 4:c6ef863d0b07 350 }RadioPacketLengthModes_t;
GregCr 0:deaafdfde3bb 351
GregCr 0:deaafdfde3bb 352 /*!
GregCr 0:deaafdfde3bb 353 * \brief Represents the CRC length
GregCr 0:deaafdfde3bb 354 */
GregCr 4:c6ef863d0b07 355 typedef enum
GregCr 0:deaafdfde3bb 356 {
GregCr 0:deaafdfde3bb 357 RADIO_CRC_OFF = 0x01, //!< No CRC in use
GregCr 0:deaafdfde3bb 358 RADIO_CRC_1_BYTES = 0x00,
GregCr 0:deaafdfde3bb 359 RADIO_CRC_2_BYTES = 0x02,
GregCr 0:deaafdfde3bb 360 RADIO_CRC_1_BYTES_INV = 0x04,
GregCr 0:deaafdfde3bb 361 RADIO_CRC_2_BYTES_INV = 0x06,
GregCr 4:c6ef863d0b07 362 RADIO_CRC_2_BYTES_IBM = 0xF1,
GregCr 4:c6ef863d0b07 363 RADIO_CRC_2_BYTES_CCIT = 0xF2,
GregCr 4:c6ef863d0b07 364 }RadioCrcTypes_t;
GregCr 0:deaafdfde3bb 365
GregCr 0:deaafdfde3bb 366 /*!
GregCr 0:deaafdfde3bb 367 * \brief Radio whitening mode activated or deactivated
GregCr 0:deaafdfde3bb 368 */
GregCr 4:c6ef863d0b07 369 typedef enum
GregCr 0:deaafdfde3bb 370 {
GregCr 0:deaafdfde3bb 371 RADIO_DC_FREE_OFF = 0x00,
GregCr 0:deaafdfde3bb 372 RADIO_DC_FREEWHITENING = 0x01,
GregCr 4:c6ef863d0b07 373 }RadioDcFree_t;
GregCr 0:deaafdfde3bb 374
GregCr 0:deaafdfde3bb 375 /*!
GregCr 0:deaafdfde3bb 376 * \brief Holds the lengths mode of a LoRa packet type
GregCr 0:deaafdfde3bb 377 */
GregCr 4:c6ef863d0b07 378 typedef enum
GregCr 0:deaafdfde3bb 379 {
GregCr 0:deaafdfde3bb 380 LORA_PACKET_VARIABLE_LENGTH = 0x00, //!< The packet is on variable size, header included
GregCr 0:deaafdfde3bb 381 LORA_PACKET_FIXED_LENGTH = 0x01, //!< The packet is known on both sides, no header included in the packet
GregCr 0:deaafdfde3bb 382 LORA_PACKET_EXPLICIT = LORA_PACKET_VARIABLE_LENGTH,
GregCr 0:deaafdfde3bb 383 LORA_PACKET_IMPLICIT = LORA_PACKET_FIXED_LENGTH,
GregCr 4:c6ef863d0b07 384 }RadioLoRaPacketLengthsMode_t;
GregCr 0:deaafdfde3bb 385
GregCr 0:deaafdfde3bb 386 /*!
GregCr 0:deaafdfde3bb 387 * \brief Represents the CRC mode for LoRa packet type
GregCr 0:deaafdfde3bb 388 */
GregCr 4:c6ef863d0b07 389 typedef enum
GregCr 0:deaafdfde3bb 390 {
GregCr 0:deaafdfde3bb 391 LORA_CRC_ON = 0x01, //!< CRC activated
GregCr 0:deaafdfde3bb 392 LORA_CRC_OFF = 0x00, //!< CRC not used
GregCr 4:c6ef863d0b07 393 }RadioLoRaCrcModes_t;
GregCr 0:deaafdfde3bb 394
GregCr 0:deaafdfde3bb 395 /*!
GregCr 0:deaafdfde3bb 396 * \brief Represents the IQ mode for LoRa packet type
GregCr 0:deaafdfde3bb 397 */
GregCr 4:c6ef863d0b07 398 typedef enum
GregCr 0:deaafdfde3bb 399 {
GregCr 0:deaafdfde3bb 400 LORA_IQ_NORMAL = 0x00,
GregCr 0:deaafdfde3bb 401 LORA_IQ_INVERTED = 0x01,
GregCr 4:c6ef863d0b07 402 }RadioLoRaIQModes_t;
GregCr 4:c6ef863d0b07 403
GregCr 4:c6ef863d0b07 404 /*!
GregCr 4:c6ef863d0b07 405 * \brief Represents the volatge used to control the TCXO on/off from DIO3
GregCr 4:c6ef863d0b07 406 */
GregCr 4:c6ef863d0b07 407 typedef enum
GregCr 4:c6ef863d0b07 408 {
GregCr 4:c6ef863d0b07 409 TCXO_CTRL_1_6V = 0x00,
GregCr 4:c6ef863d0b07 410 TCXO_CTRL_1_7V = 0x01,
GregCr 4:c6ef863d0b07 411 TCXO_CTRL_1_8V = 0x02,
GregCr 4:c6ef863d0b07 412 TCXO_CTRL_2_2V = 0x03,
GregCr 4:c6ef863d0b07 413 TCXO_CTRL_2_4V = 0x04,
GregCr 4:c6ef863d0b07 414 TCXO_CTRL_2_7V = 0x05,
GregCr 4:c6ef863d0b07 415 TCXO_CTRL_3_0V = 0x06,
GregCr 4:c6ef863d0b07 416 TCXO_CTRL_3_3V = 0x07,
GregCr 4:c6ef863d0b07 417 }RadioTcxoCtrlVoltage_t;
GregCr 0:deaafdfde3bb 418
GregCr 0:deaafdfde3bb 419 /*!
GregCr 0:deaafdfde3bb 420 * \brief Represents the interruption masks available for the radio
GregCr 0:deaafdfde3bb 421 *
GregCr 0:deaafdfde3bb 422 * \remark Note that not all these interruptions are available for all packet types
GregCr 0:deaafdfde3bb 423 */
GregCr 4:c6ef863d0b07 424 typedef enum
GregCr 0:deaafdfde3bb 425 {
GregCr 0:deaafdfde3bb 426 IRQ_RADIO_NONE = 0x0000,
GregCr 0:deaafdfde3bb 427 IRQ_TX_DONE = 0x0001,
GregCr 0:deaafdfde3bb 428 IRQ_RX_DONE = 0x0002,
GregCr 0:deaafdfde3bb 429 IRQ_PREAMBLE_DETECTED = 0x0004,
GregCr 0:deaafdfde3bb 430 IRQ_SYNCWORD_VALID = 0x0008,
GregCr 0:deaafdfde3bb 431 IRQ_HEADER_VALID = 0x0010,
GregCr 4:c6ef863d0b07 432 IRQ_HEADER_ERROR = 0x0020,
GregCr 3:7e3595a9ebe0 433 IRQ_CRC_ERROR = 0x0040,
GregCr 0:deaafdfde3bb 434 IRQ_CAD_DONE = 0x0080,
GregCr 0:deaafdfde3bb 435 IRQ_CAD_ACTIVITY_DETECTED = 0x0100,
GregCr 0:deaafdfde3bb 436 IRQ_RX_TX_TIMEOUT = 0x0200,
GregCr 0:deaafdfde3bb 437 IRQ_RADIO_ALL = 0xFFFF,
GregCr 4:c6ef863d0b07 438 }RadioIrqMasks_t;
GregCr 0:deaafdfde3bb 439
GregCr 0:deaafdfde3bb 440 /*!
GregCr 0:deaafdfde3bb 441 * \brief Represents all possible opcode understood by the radio
GregCr 0:deaafdfde3bb 442 */
GregCr 4:c6ef863d0b07 443 typedef enum RadioCommands_e
GregCr 0:deaafdfde3bb 444 {
GregCr 0:deaafdfde3bb 445 RADIO_GET_STATUS = 0xC0,
GregCr 0:deaafdfde3bb 446 RADIO_WRITE_REGISTER = 0x0D,
GregCr 4:c6ef863d0b07 447 RADIO_READ_REGISTER = 0x1D,
GregCr 0:deaafdfde3bb 448 RADIO_WRITE_BUFFER = 0x0E,
GregCr 4:c6ef863d0b07 449 RADIO_READ_BUFFER = 0x1E,
GregCr 0:deaafdfde3bb 450 RADIO_SET_SLEEP = 0x84,
GregCr 0:deaafdfde3bb 451 RADIO_SET_STANDBY = 0x80,
GregCr 0:deaafdfde3bb 452 RADIO_SET_FS = 0xC1,
GregCr 0:deaafdfde3bb 453 RADIO_SET_TX = 0x83,
GregCr 0:deaafdfde3bb 454 RADIO_SET_RX = 0x82,
GregCr 0:deaafdfde3bb 455 RADIO_SET_RXDUTYCYCLE = 0x94,
GregCr 0:deaafdfde3bb 456 RADIO_SET_CAD = 0xC5,
GregCr 0:deaafdfde3bb 457 RADIO_SET_TXCONTINUOUSWAVE = 0xD1,
GregCr 0:deaafdfde3bb 458 RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2,
GregCr 0:deaafdfde3bb 459 RADIO_SET_PACKETTYPE = 0x8A,
GregCr 0:deaafdfde3bb 460 RADIO_GET_PACKETTYPE = 0x11,
GregCr 0:deaafdfde3bb 461 RADIO_SET_RFFREQUENCY = 0x86,
GregCr 0:deaafdfde3bb 462 RADIO_SET_TXPARAMS = 0x8E,
GregCr 4:c6ef863d0b07 463 RADIO_SET_PACONFIG = 0x95,
GregCr 0:deaafdfde3bb 464 RADIO_SET_CADPARAMS = 0x88,
GregCr 0:deaafdfde3bb 465 RADIO_SET_BUFFERBASEADDRESS = 0x8F,
GregCr 0:deaafdfde3bb 466 RADIO_SET_MODULATIONPARAMS = 0x8B,
GregCr 0:deaafdfde3bb 467 RADIO_SET_PACKETPARAMS = 0x8C,
GregCr 0:deaafdfde3bb 468 RADIO_GET_RXBUFFERSTATUS = 0x13,
GregCr 0:deaafdfde3bb 469 RADIO_GET_PACKETSTATUS = 0x14,
GregCr 0:deaafdfde3bb 470 RADIO_GET_RSSIINST = 0x15,
GregCr 0:deaafdfde3bb 471 RADIO_GET_STATS = 0x10,
GregCr 4:c6ef863d0b07 472 RADIO_RESET_STATS = 0x00,
GregCr 4:c6ef863d0b07 473 RADIO_CFG_DIOIRQ = 0x08,
GregCr 0:deaafdfde3bb 474 RADIO_GET_IRQSTATUS = 0x12,
GregCr 0:deaafdfde3bb 475 RADIO_CLR_IRQSTATUS = 0x02,
GregCr 0:deaafdfde3bb 476 RADIO_CALIBRATE = 0x89,
GregCr 0:deaafdfde3bb 477 RADIO_SET_REGULATORMODE = 0x96,
GregCr 0:deaafdfde3bb 478 RADIO_SET_PRAMSWAPCMD = 0x8D,
GregCr 0:deaafdfde3bb 479 RADIO_GET_ERROR = 0x17,
GregCr 4:c6ef863d0b07 480 RADIO_SET_TCXOMODE = 0x97,
GregCr 0:deaafdfde3bb 481 RADIO_SET_TXFALLBACKMODE = 0x93,
GregCr 4:c6ef863d0b07 482 RADIO_SET_RFSWITCHMODE = 0x9D,
GregCr 4:c6ef863d0b07 483 RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F,
GregCr 4:c6ef863d0b07 484 RADIO_SET_LONGPREAMBLE = 0x90,
GregCr 4:c6ef863d0b07 485 RADIO_SET_LORASYMBTIMEOUT = 0xA0,
GregCr 4:c6ef863d0b07 486 }RadioCommands_t;
GregCr 0:deaafdfde3bb 487
GregCr 0:deaafdfde3bb 488 /*!
GregCr 0:deaafdfde3bb 489 * \brief The type describing the modulation parameters for every packet types
GregCr 0:deaafdfde3bb 490 */
GregCr 0:deaafdfde3bb 491 typedef struct
GregCr 0:deaafdfde3bb 492 {
GregCr 4:c6ef863d0b07 493 RadioPacketTypes_t PacketType; //!< Packet to which the modulation parameters are referring to.
GregCr 4:c6ef863d0b07 494 struct
GregCr 0:deaafdfde3bb 495 {
GregCr 0:deaafdfde3bb 496 struct
GregCr 0:deaafdfde3bb 497 {
GregCr 3:7e3595a9ebe0 498 uint32_t BitRate;
GregCr 3:7e3595a9ebe0 499 uint32_t Fdev;
GregCr 4:c6ef863d0b07 500 RadioModShapings_t ModulationShaping;
GregCr 4:c6ef863d0b07 501 uint8_t Bandwidth;
GregCr 3:7e3595a9ebe0 502 }Gfsk;
GregCr 0:deaafdfde3bb 503 struct
GregCr 0:deaafdfde3bb 504 {
GregCr 0:deaafdfde3bb 505 RadioLoRaSpreadingFactors_t SpreadingFactor; //!< Spreading Factor for the LoRa modulation
GregCr 0:deaafdfde3bb 506 RadioLoRaBandwidths_t Bandwidth; //!< Bandwidth for the LoRa modulation
GregCr 0:deaafdfde3bb 507 RadioLoRaCodingRates_t CodingRate; //!< Coding rate for the LoRa modulation
GregCr 4:c6ef863d0b07 508 uint8_t LowDatarateOptimize; //!< Indicates if the modem uses the low datarate optimization
GregCr 0:deaafdfde3bb 509 }LoRa;
GregCr 0:deaafdfde3bb 510 }Params; //!< Holds the modulation parameters structure
GregCr 0:deaafdfde3bb 511 }ModulationParams_t;
GregCr 0:deaafdfde3bb 512
GregCr 0:deaafdfde3bb 513 /*!
GregCr 0:deaafdfde3bb 514 * \brief The type describing the packet parameters for every packet types
GregCr 0:deaafdfde3bb 515 */
GregCr 0:deaafdfde3bb 516 typedef struct
GregCr 0:deaafdfde3bb 517 {
GregCr 4:c6ef863d0b07 518 RadioPacketTypes_t PacketType; //!< Packet to which the packet parameters are referring to.
GregCr 4:c6ef863d0b07 519 struct
GregCr 0:deaafdfde3bb 520 {
GregCr 0:deaafdfde3bb 521 /*!
GregCr 0:deaafdfde3bb 522 * \brief Holds the GFSK packet parameters
GregCr 0:deaafdfde3bb 523 */
GregCr 0:deaafdfde3bb 524 struct
GregCr 0:deaafdfde3bb 525 {
GregCr 4:c6ef863d0b07 526 uint16_t PreambleLength; //!< The preamble Tx length for GFSK packet type in bit
GregCr 4:c6ef863d0b07 527 RadioPreambleDetection_t PreambleMinDetect; //!< The preamble Rx length minimal for GFSK packet type
GregCr 4:c6ef863d0b07 528 uint8_t SyncWordLength; //!< The synchronization word length for GFSK packet type
GregCr 4:c6ef863d0b07 529 RadioAddressComp_t AddrComp; //!< Activated SyncWord correlators
GregCr 0:deaafdfde3bb 530 RadioPacketLengthModes_t HeaderType; //!< If the header is explicit, it will be transmitted in the GFSK packet. If the header is implicit, it will not be transmitted
GregCr 0:deaafdfde3bb 531 uint8_t PayloadLength; //!< Size of the payload in the GFSK packet
GregCr 0:deaafdfde3bb 532 RadioCrcTypes_t CrcLength; //!< Size of the CRC block in the GFSK packet
GregCr 4:c6ef863d0b07 533 RadioDcFree_t DcFree;
GregCr 0:deaafdfde3bb 534 }Gfsk;
GregCr 0:deaafdfde3bb 535 /*!
GregCr 0:deaafdfde3bb 536 * \brief Holds the LoRa packet parameters
GregCr 0:deaafdfde3bb 537 */
GregCr 0:deaafdfde3bb 538 struct
GregCr 0:deaafdfde3bb 539 {
GregCr 4:c6ef863d0b07 540 uint16_t PreambleLength; //!< The preamble length is the number of LoRa symbols in the preamble
GregCr 0:deaafdfde3bb 541 RadioLoRaPacketLengthsMode_t HeaderType; //!< If the header is explicit, it will be transmitted in the LoRa packet. If the header is implicit, it will not be transmitted
GregCr 0:deaafdfde3bb 542 uint8_t PayloadLength; //!< Size of the payload in the LoRa packet
GregCr 0:deaafdfde3bb 543 RadioLoRaCrcModes_t CrcMode; //!< Size of CRC block in LoRa packet
GregCr 0:deaafdfde3bb 544 RadioLoRaIQModes_t InvertIQ; //!< Allows to swap IQ for LoRa packet
GregCr 0:deaafdfde3bb 545 }LoRa;
GregCr 0:deaafdfde3bb 546 }Params; //!< Holds the packet parameters structure
GregCr 0:deaafdfde3bb 547 }PacketParams_t;
GregCr 0:deaafdfde3bb 548
GregCr 0:deaafdfde3bb 549 /*!
GregCr 0:deaafdfde3bb 550 * \brief Represents the packet status for every packet type
GregCr 0:deaafdfde3bb 551 */
GregCr 0:deaafdfde3bb 552 typedef struct
GregCr 0:deaafdfde3bb 553 {
GregCr 4:c6ef863d0b07 554 RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to.
GregCr 4:c6ef863d0b07 555 struct
GregCr 0:deaafdfde3bb 556 {
GregCr 0:deaafdfde3bb 557 struct
GregCr 0:deaafdfde3bb 558 {
GregCr 0:deaafdfde3bb 559 uint8_t RxStatus;
GregCr 0:deaafdfde3bb 560 int8_t RssiAvg; //!< The averaged RSSI
GregCr 0:deaafdfde3bb 561 int8_t RssiSync; //!< The RSSI measured on last packet
GregCr 4:c6ef863d0b07 562 uint32_t FreqError;
GregCr 0:deaafdfde3bb 563 }Gfsk;
GregCr 0:deaafdfde3bb 564 struct
GregCr 0:deaafdfde3bb 565 {
GregCr 0:deaafdfde3bb 566 int8_t RssiPkt; //!< The RSSI of the last packet
GregCr 0:deaafdfde3bb 567 int8_t SnrPkt; //!< The SNR of the last packet
GregCr 0:deaafdfde3bb 568 int8_t SignalRssiPkt;
GregCr 4:c6ef863d0b07 569 uint32_t FreqError;
GregCr 0:deaafdfde3bb 570 }LoRa;
GregCr 4:c6ef863d0b07 571 }Params;
GregCr 0:deaafdfde3bb 572 }PacketStatus_t;
GregCr 0:deaafdfde3bb 573
GregCr 0:deaafdfde3bb 574 /*!
GregCr 0:deaafdfde3bb 575 * \brief Represents the Rx internal counters values when GFSK or LoRa packet type is used
GregCr 0:deaafdfde3bb 576 */
GregCr 0:deaafdfde3bb 577 typedef struct
GregCr 0:deaafdfde3bb 578 {
GregCr 4:c6ef863d0b07 579 RadioPacketTypes_t packetType; //!< Packet to which the packet status are referring to.
GregCr 4:c6ef863d0b07 580 uint16_t PacketReceived;
GregCr 4:c6ef863d0b07 581 uint16_t CrcOk;
GregCr 4:c6ef863d0b07 582 uint16_t LengthError;
GregCr 0:deaafdfde3bb 583 }RxCounter_t;
GregCr 0:deaafdfde3bb 584
GregCr 0:deaafdfde3bb 585 /*!
GregCr 0:deaafdfde3bb 586 * \brief Represents a calibration configuration
GregCr 0:deaafdfde3bb 587 */
GregCr 0:deaafdfde3bb 588 typedef union
GregCr 0:deaafdfde3bb 589 {
GregCr 0:deaafdfde3bb 590 struct
GregCr 0:deaafdfde3bb 591 {
GregCr 4:c6ef863d0b07 592 uint8_t RC64KEnable : 1; //!< Calibrate RC64K clock
GregCr 4:c6ef863d0b07 593 uint8_t RC13MEnable : 1; //!< Calibrate RC13M clock
GregCr 4:c6ef863d0b07 594 uint8_t PLLEnable : 1; //!< Calibrate PLL
GregCr 0:deaafdfde3bb 595 uint8_t ADCPulseEnable : 1; //!< Calibrate ADC Pulse
GregCr 4:c6ef863d0b07 596 uint8_t ADCBulkNEnable : 1; //!< Calibrate ADC bulkN
GregCr 4:c6ef863d0b07 597 uint8_t ADCBulkPEnable : 1; //!< Calibrate ADC bulkP
GregCr 4:c6ef863d0b07 598 uint8_t ImgEnable : 1;
GregCr 4:c6ef863d0b07 599 uint8_t : 1;
GregCr 4:c6ef863d0b07 600 }Fields;
GregCr 4:c6ef863d0b07 601 uint8_t Value;
GregCr 0:deaafdfde3bb 602 }CalibrationParams_t;
GregCr 0:deaafdfde3bb 603
GregCr 0:deaafdfde3bb 604 /*!
GregCr 0:deaafdfde3bb 605 * \brief Represents a sleep mode configuration
GregCr 0:deaafdfde3bb 606 */
GregCr 0:deaafdfde3bb 607 typedef union
GregCr 0:deaafdfde3bb 608 {
GregCr 0:deaafdfde3bb 609 struct
GregCr 0:deaafdfde3bb 610 {
GregCr 3:7e3595a9ebe0 611 uint8_t WakeUpRTC : 1; //!< Get out of sleep mode if wakeup signal received from RTC
GregCr 3:7e3595a9ebe0 612 uint8_t Reset : 1;
GregCr 0:deaafdfde3bb 613 uint8_t WarmStart : 1;
GregCr 3:7e3595a9ebe0 614 uint8_t Reserved : 5;
GregCr 4:c6ef863d0b07 615 }Fields;
GregCr 4:c6ef863d0b07 616 uint8_t Value;
GregCr 0:deaafdfde3bb 617 }SleepParams_t;
GregCr 0:deaafdfde3bb 618
GregCr 4:c6ef863d0b07 619 /*!
GregCr 4:c6ef863d0b07 620 * \brief Represents the possible radio system error states
GregCr 4:c6ef863d0b07 621 */
GregCr 4:c6ef863d0b07 622 typedef union
GregCr 4:c6ef863d0b07 623 {
GregCr 4:c6ef863d0b07 624 struct
GregCr 4:c6ef863d0b07 625 {
GregCr 4:c6ef863d0b07 626 uint8_t Rc64kCalib : 1; //!< RC 64kHz oscillator calibration failed
GregCr 4:c6ef863d0b07 627 uint8_t Rc13mCalib : 1; //!< RC 13MHz oscillator calibration failed
GregCr 4:c6ef863d0b07 628 uint8_t PllCalib : 1; //!< PLL calibration failed
GregCr 4:c6ef863d0b07 629 uint8_t AdcCalib : 1; //!< ADC calibration failed
GregCr 4:c6ef863d0b07 630 uint8_t ImgCalib : 1; //!< Image calibration failed
GregCr 4:c6ef863d0b07 631 uint8_t XoscStart : 1; //!< XOSC oscillator failed to start
GregCr 4:c6ef863d0b07 632 uint8_t PllLock : 1; //!< PLL lock failed
GregCr 4:c6ef863d0b07 633 uint8_t BuckStart : 1; //!< Buck converter failed to start
GregCr 4:c6ef863d0b07 634 uint8_t PaRamp : 1; //!< PA ramp failed
GregCr 4:c6ef863d0b07 635 uint8_t : 7; //!< Reserved
GregCr 4:c6ef863d0b07 636 }Fields;
GregCr 4:c6ef863d0b07 637 uint16_t Value;
GregCr 4:c6ef863d0b07 638 }RadioError_t;
GregCr 0:deaafdfde3bb 639
GregCr 0:deaafdfde3bb 640 /*!
GregCr 2:4ff11ea92fbe 641 * \brief Represents the SX126x and its features
GregCr 0:deaafdfde3bb 642 *
GregCr 2:4ff11ea92fbe 643 * It implements the commands the SX126x can understands
GregCr 0:deaafdfde3bb 644 */
GregCr 2:4ff11ea92fbe 645 class SX126x : public Radio
GregCr 0:deaafdfde3bb 646 {
GregCr 0:deaafdfde3bb 647 public:
GregCr 0:deaafdfde3bb 648 /*!
GregCr 2:4ff11ea92fbe 649 * \brief Instantiates a SX126x object and provides API functions to communicates with the radio
GregCr 4:c6ef863d0b07 650 * \param [in] callbacks Pointer to the callbacks structure defining
GregCr 4:c6ef863d0b07 651 * all callbacks function pointers
GregCr 0:deaafdfde3bb 652 */
GregCr 4:c6ef863d0b07 653 SX126x( RadioCallbacks_t *callbacks ):
GregCr 4:c6ef863d0b07 654 Radio( callbacks )
GregCr 0:deaafdfde3bb 655 {
GregCr 4:c6ef863d0b07 656 this->dioIrq = &SX126x::OnDioIrq;
GregCr 4:c6ef863d0b07 657 this->PacketType = PACKET_TYPE_NONE;
GregCr 4:c6ef863d0b07 658 this->PollingMode = false;
GregCr 4:c6ef863d0b07 659 this->IrqState = false;
GregCr 0:deaafdfde3bb 660 }
GregCr 0:deaafdfde3bb 661
GregCr 2:4ff11ea92fbe 662 virtual ~SX126x( )
GregCr 0:deaafdfde3bb 663 {
GregCr 0:deaafdfde3bb 664 }
GregCr 0:deaafdfde3bb 665
GregCr 4:c6ef863d0b07 666 private:
GregCr 0:deaafdfde3bb 667 /*!
GregCr 0:deaafdfde3bb 668 * \brief Holds the internal operating mode of the radio
GregCr 0:deaafdfde3bb 669 */
GregCr 0:deaafdfde3bb 670 RadioOperatingModes_t OperatingMode;
GregCr 0:deaafdfde3bb 671
GregCr 0:deaafdfde3bb 672 /*!
GregCr 0:deaafdfde3bb 673 * \brief Stores the current packet type set in the radio
GregCr 0:deaafdfde3bb 674 */
GregCr 4:c6ef863d0b07 675 RadioPacketTypes_t PacketType;
GregCr 0:deaafdfde3bb 676
GregCr 4:c6ef863d0b07 677 /*!
GregCr 4:c6ef863d0b07 678 * \brief Holds a flag raised on radio interrupt
GregCr 4:c6ef863d0b07 679 */
GregCr 4:c6ef863d0b07 680 bool IrqState;
GregCr 0:deaafdfde3bb 681
GregCr 0:deaafdfde3bb 682 /*!
GregCr 0:deaafdfde3bb 683 * \brief Hardware DIO IRQ functions
GregCr 0:deaafdfde3bb 684 */
GregCr 0:deaafdfde3bb 685 DioIrqHandler dioIrq;
GregCr 0:deaafdfde3bb 686
GregCr 4:c6ef863d0b07 687 /*!
GregCr 4:c6ef863d0b07 688 * \brief Holds the polling state of the driver
GregCr 4:c6ef863d0b07 689 */
GregCr 4:c6ef863d0b07 690 bool PollingMode;
GregCr 0:deaafdfde3bb 691
GregCr 4:c6ef863d0b07 692 protected:
GregCr 0:deaafdfde3bb 693
GregCr 0:deaafdfde3bb 694 /*!
GregCr 0:deaafdfde3bb 695 * \brief Sets a function to be triggered on radio interrupt
GregCr 0:deaafdfde3bb 696 *
GregCr 0:deaafdfde3bb 697 * \param [in] irqHandler A pointer to a function to be run on interrupt
GregCr 0:deaafdfde3bb 698 * from the radio
GregCr 0:deaafdfde3bb 699 */
GregCr 0:deaafdfde3bb 700 virtual void IoIrqInit( DioIrqHandler irqHandler ) = 0;
GregCr 0:deaafdfde3bb 701
GregCr 4:c6ef863d0b07 702 /*!
GregCr 4:c6ef863d0b07 703 * \brief DIOs interrupt callback
GregCr 4:c6ef863d0b07 704 *
GregCr 4:c6ef863d0b07 705 * \remark Called to handle all 3 DIOs pins
GregCr 4:c6ef863d0b07 706 */
GregCr 4:c6ef863d0b07 707 void OnDioIrq( void );
GregCr 0:deaafdfde3bb 708 public:
GregCr 0:deaafdfde3bb 709 /*!
GregCr 0:deaafdfde3bb 710 * \brief Initializes the radio driver
GregCr 0:deaafdfde3bb 711 */
GregCr 0:deaafdfde3bb 712 void Init( void );
GregCr 0:deaafdfde3bb 713
GregCr 0:deaafdfde3bb 714 /*!
GregCr 4:c6ef863d0b07 715 * \brief Gets the current Operation Mode of the Radip
GregCr 4:c6ef863d0b07 716 *
GregCr 4:c6ef863d0b07 717 * \retval RadioOperatingModes_t last operating mode
GregCr 4:c6ef863d0b07 718 */
GregCr 4:c6ef863d0b07 719 virtual RadioOperatingModes_t GetOperatingMode( void );
GregCr 4:c6ef863d0b07 720
GregCr 4:c6ef863d0b07 721 /*!
GregCr 4:c6ef863d0b07 722 * \brief Wakeup the radio if it is in Sleep mode and check that Busy is low
GregCr 4:c6ef863d0b07 723 */
GregCr 4:c6ef863d0b07 724 virtual void CheckDeviceReady( void );
GregCr 4:c6ef863d0b07 725
GregCr 4:c6ef863d0b07 726 /*!
GregCr 4:c6ef863d0b07 727 * \brief Saves the payload to be send in the radio buffer
GregCr 4:c6ef863d0b07 728 *
GregCr 4:c6ef863d0b07 729 * \param [in] payload A pointer to the payload
GregCr 4:c6ef863d0b07 730 * \param [in] size The size of the payload
GregCr 4:c6ef863d0b07 731 */
GregCr 4:c6ef863d0b07 732 void SetPayload( uint8_t *payload, uint8_t size );
GregCr 4:c6ef863d0b07 733
GregCr 4:c6ef863d0b07 734 /*!
GregCr 4:c6ef863d0b07 735 * \brief Reads the payload received. If the received payload is longer
GregCr 4:c6ef863d0b07 736 * than maxSize, then the method returns 1 and do not set size and payload.
GregCr 4:c6ef863d0b07 737 *
GregCr 4:c6ef863d0b07 738 * \param [out] payload A pointer to a buffer into which the payload will be copied
GregCr 4:c6ef863d0b07 739 * \param [out] size A pointer to the size of the payload received
GregCr 4:c6ef863d0b07 740 * \param [in] maxSize The maximal size allowed to copy into the buffer
GregCr 4:c6ef863d0b07 741 */
GregCr 4:c6ef863d0b07 742 uint8_t GetPayload( uint8_t *payload, uint8_t *size, uint8_t maxSize );
GregCr 4:c6ef863d0b07 743
GregCr 4:c6ef863d0b07 744 /*!
GregCr 4:c6ef863d0b07 745 * \brief Sends a payload
GregCr 4:c6ef863d0b07 746 *
GregCr 4:c6ef863d0b07 747 * \param [in] payload A pointer to the payload to send
GregCr 4:c6ef863d0b07 748 * \param [in] size The size of the payload to send
GregCr 4:c6ef863d0b07 749 * \param [in] timeout The timeout for Tx operation
GregCr 4:c6ef863d0b07 750 */
GregCr 4:c6ef863d0b07 751 void SendPayload( uint8_t *payload, uint8_t size, uint32_t timeout );
GregCr 4:c6ef863d0b07 752
GregCr 4:c6ef863d0b07 753 /*!
GregCr 4:c6ef863d0b07 754 * \brief Sets the Sync Word given by index used in GFSK
GregCr 4:c6ef863d0b07 755 *
GregCr 4:c6ef863d0b07 756 * \param [in] syncWord SyncWord bytes ( 8 bytes )
GregCr 4:c6ef863d0b07 757 *
GregCr 4:c6ef863d0b07 758 * \retval status [0: OK, 1: NOK]
GregCr 4:c6ef863d0b07 759 */
GregCr 4:c6ef863d0b07 760 uint8_t SetSyncWord( uint8_t *syncWord );
GregCr 4:c6ef863d0b07 761
GregCr 4:c6ef863d0b07 762 /*!
GregCr 4:c6ef863d0b07 763 * \brief Sets the Initial value for the LFSR used for the CRC calculation
GregCr 4:c6ef863d0b07 764 *
GregCr 4:c6ef863d0b07 765 * \param [in] seed Initial LFSR value ( 2 bytes )
GregCr 4:c6ef863d0b07 766 *
GregCr 4:c6ef863d0b07 767 */
GregCr 4:c6ef863d0b07 768 void SetCrcSeed( uint16_t seed );
GregCr 4:c6ef863d0b07 769
GregCr 4:c6ef863d0b07 770 /*!
GregCr 4:c6ef863d0b07 771 * \brief Sets the seed used for the CRC calculation
GregCr 4:c6ef863d0b07 772 *
GregCr 4:c6ef863d0b07 773 * \param [in] seed The seed value
GregCr 4:c6ef863d0b07 774 *
GregCr 4:c6ef863d0b07 775 */
GregCr 4:c6ef863d0b07 776 void SetCrcPolynomial( uint16_t seed );
GregCr 4:c6ef863d0b07 777
GregCr 4:c6ef863d0b07 778 /*!
GregCr 4:c6ef863d0b07 779 * \brief Sets the Initial value of the LFSR used for the whitening in GFSK protocols
GregCr 4:c6ef863d0b07 780 *
GregCr 4:c6ef863d0b07 781 * \param [in] seed Initial LFSR value
GregCr 4:c6ef863d0b07 782 */
GregCr 4:c6ef863d0b07 783 void SetWhiteningSeed( uint16_t seed );
GregCr 4:c6ef863d0b07 784
GregCr 4:c6ef863d0b07 785 /*!
GregCr 4:c6ef863d0b07 786 * \brief Gets a 32 bits random value generated by the radio
GregCr 4:c6ef863d0b07 787 *
GregCr 4:c6ef863d0b07 788 * \remark The radio must be in reception mode before executing this function
GregCr 4:c6ef863d0b07 789 *
GregCr 4:c6ef863d0b07 790 * \retval randomValue 32 bits random value
GregCr 4:c6ef863d0b07 791 */
GregCr 4:c6ef863d0b07 792 uint32_t GetRandom( void );
GregCr 4:c6ef863d0b07 793
GregCr 4:c6ef863d0b07 794 /*!
GregCr 4:c6ef863d0b07 795 * \brief Sets the radio in sleep mode
GregCr 4:c6ef863d0b07 796 *
GregCr 4:c6ef863d0b07 797 * \param [in] sleepConfig The sleep configuration describing data
GregCr 4:c6ef863d0b07 798 * retention and RTC wake-up
GregCr 4:c6ef863d0b07 799 */
GregCr 4:c6ef863d0b07 800 void SetSleep( SleepParams_t sleepConfig );
GregCr 4:c6ef863d0b07 801
GregCr 4:c6ef863d0b07 802 /*!
GregCr 4:c6ef863d0b07 803 * \brief Sets the radio in configuration mode
GregCr 4:c6ef863d0b07 804 *
GregCr 4:c6ef863d0b07 805 * \param [in] mode The standby mode to put the radio into
GregCr 0:deaafdfde3bb 806 */
GregCr 4:c6ef863d0b07 807 void SetStandby( RadioStandbyModes_t mode );
GregCr 4:c6ef863d0b07 808
GregCr 4:c6ef863d0b07 809 /*!
GregCr 4:c6ef863d0b07 810 * \brief Sets the radio in FS mode
GregCr 4:c6ef863d0b07 811 */
GregCr 4:c6ef863d0b07 812 void SetFs( void );
GregCr 4:c6ef863d0b07 813
GregCr 4:c6ef863d0b07 814 /*!
GregCr 4:c6ef863d0b07 815 * \brief Sets the radio in transmission mode
GregCr 4:c6ef863d0b07 816 *
GregCr 4:c6ef863d0b07 817 * \param [in] timeout Structure describing the transmission timeout value
GregCr 4:c6ef863d0b07 818 */
GregCr 4:c6ef863d0b07 819 void SetTx( uint32_t timeout );
GregCr 4:c6ef863d0b07 820
GregCr 4:c6ef863d0b07 821 /*!
GregCr 4:c6ef863d0b07 822 * \brief Sets the radio in reception Boosted mode
GregCr 4:c6ef863d0b07 823 *
GregCr 4:c6ef863d0b07 824 * \param [in] timeout Structure describing the transmission timeout value
GregCr 4:c6ef863d0b07 825 */
GregCr 4:c6ef863d0b07 826 void SetRxBoosted( uint32_t timeout );
GregCr 4:c6ef863d0b07 827
GregCr 4:c6ef863d0b07 828 /*!
GregCr 4:c6ef863d0b07 829 * \brief Sets the radio in reception mode
GregCr 4:c6ef863d0b07 830 *
GregCr 4:c6ef863d0b07 831 * \param [in] timeout Structure describing the reception timeout value
GregCr 4:c6ef863d0b07 832 */
GregCr 4:c6ef863d0b07 833 void SetRx( uint32_t timeout );
GregCr 4:c6ef863d0b07 834
GregCr 4:c6ef863d0b07 835 /*!
GregCr 4:c6ef863d0b07 836 * \brief Sets the Rx duty cycle management parameters
GregCr 4:c6ef863d0b07 837 *
GregCr 4:c6ef863d0b07 838 * \param [in] rxTime Structure describing reception timeout value
GregCr 4:c6ef863d0b07 839 * \param [in] sleepTime Structure describing sleep timeout value
GregCr 4:c6ef863d0b07 840 */
GregCr 4:c6ef863d0b07 841 void SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime );
GregCr 4:c6ef863d0b07 842
GregCr 4:c6ef863d0b07 843 /*!
GregCr 4:c6ef863d0b07 844 * \brief Sets the radio in CAD mode
GregCr 4:c6ef863d0b07 845 */
GregCr 4:c6ef863d0b07 846 void SetCad( void );
GregCr 4:c6ef863d0b07 847
GregCr 4:c6ef863d0b07 848 /*!
GregCr 4:c6ef863d0b07 849 * \brief Sets the radio in continuous wave transmission mode
GregCr 4:c6ef863d0b07 850 */
GregCr 4:c6ef863d0b07 851 void SetTxContinuousWave( void );
GregCr 4:c6ef863d0b07 852
GregCr 4:c6ef863d0b07 853 /*!
GregCr 4:c6ef863d0b07 854 * \brief Sets the radio in continuous preamble transmission mode
GregCr 4:c6ef863d0b07 855 */
GregCr 4:c6ef863d0b07 856 void SetTxInfinitePreamble( void );
GregCr 4:c6ef863d0b07 857
GregCr 4:c6ef863d0b07 858 /*!
GregCr 4:c6ef863d0b07 859 * \brief Decide which interrupt will stop the internal radio rx timer.
GregCr 4:c6ef863d0b07 860 *
GregCr 4:c6ef863d0b07 861 * \param [in] enable [0: Timer stop after header/syncword detection
GregCr 4:c6ef863d0b07 862 * 1: Timer stop after preamble detection]
GregCr 4:c6ef863d0b07 863 */
GregCr 4:c6ef863d0b07 864 void SetStopRxTimerOnPreambleDetect( bool enable );
GregCr 4:c6ef863d0b07 865
GregCr 4:c6ef863d0b07 866 /*!
GregCr 4:c6ef863d0b07 867 * \brief Set the number of symbol the radio will wait to validate a reception
GregCr 4:c6ef863d0b07 868 *
GregCr 4:c6ef863d0b07 869 * \param [in] SymbNum number of LoRa symbols
GregCr 4:c6ef863d0b07 870 */
GregCr 4:c6ef863d0b07 871 void SetLoRaSymbNumTimeout( uint8_t SymbNum );
GregCr 4:c6ef863d0b07 872
GregCr 4:c6ef863d0b07 873 /*!
GregCr 4:c6ef863d0b07 874 * \brief Sets the power regulators operating mode
GregCr 4:c6ef863d0b07 875 *
GregCr 4:c6ef863d0b07 876 * \param [in] mode [0: LDO, 1:DC_DC]
GregCr 4:c6ef863d0b07 877 */
GregCr 4:c6ef863d0b07 878 void SetRegulatorMode( RadioRegulatorMode_t mode );
GregCr 4:c6ef863d0b07 879
GregCr 4:c6ef863d0b07 880 /*!
GregCr 4:c6ef863d0b07 881 * \brief Calibrates the given radio block
GregCr 4:c6ef863d0b07 882 *
GregCr 4:c6ef863d0b07 883 * \param [in] calibParam The description of blocks to be calibrated
GregCr 4:c6ef863d0b07 884 */
GregCr 4:c6ef863d0b07 885 void Calibrate( CalibrationParams_t calibParam );
GregCr 4:c6ef863d0b07 886
GregCr 4:c6ef863d0b07 887 /*!
GregCr 4:c6ef863d0b07 888 * \brief Activate the extention of the timeout when long preamble is used
GregCr 4:c6ef863d0b07 889 *
GregCr 4:c6ef863d0b07 890 * \param [in] enable The radio will extend the timeout to cope with long preamble
GregCr 4:c6ef863d0b07 891 */
GregCr 4:c6ef863d0b07 892 void SetLongPreamble( uint8_t enable );
GregCr 4:c6ef863d0b07 893
GregCr 4:c6ef863d0b07 894 /*!
GregCr 4:c6ef863d0b07 895 * \brief Sets the transmission parameters
GregCr 4:c6ef863d0b07 896 *
GregCr 4:c6ef863d0b07 897 * \param [in] paDutyCycle Duty Cycle for the PA
GregCr 4:c6ef863d0b07 898 * \param [in] HpMax 0 for sx1261, 7 for sx1262
GregCr 4:c6ef863d0b07 899 * \param [in] deviceSel 1 for sx1261, 0 for sx1262
GregCr 4:c6ef863d0b07 900 * \param [in] paLUT 0 for 14dBm LUT, 1 for 22dBm LUT
GregCr 4:c6ef863d0b07 901 */
GregCr 4:c6ef863d0b07 902 void SetPaConfig( uint8_t paDutyCycle, uint8_t HpMax, uint8_t deviceSel, uint8_t paLUT );
GregCr 0:deaafdfde3bb 903
GregCr 0:deaafdfde3bb 904 /*!
GregCr 4:c6ef863d0b07 905 * \brief Defines into which mode the chip goes after a TX / RX done
GregCr 4:c6ef863d0b07 906 *
GregCr 4:c6ef863d0b07 907 * \param [in] fallbackMode The mode in which the radio goes
GregCr 4:c6ef863d0b07 908 */
GregCr 4:c6ef863d0b07 909 void SetRxTxFallbackMode( uint8_t fallbackMode );
GregCr 4:c6ef863d0b07 910
GregCr 4:c6ef863d0b07 911 /*!
GregCr 4:c6ef863d0b07 912 * \brief Sets the IRQ mask and DIO masks
GregCr 4:c6ef863d0b07 913 *
GregCr 4:c6ef863d0b07 914 * \param [in] irqMask General IRQ mask
GregCr 4:c6ef863d0b07 915 * \param [in] dio1Mask DIO1 mask
GregCr 4:c6ef863d0b07 916 * \param [in] dio2Mask DIO2 mask
GregCr 4:c6ef863d0b07 917 * \param [in] dio3Mask DIO3 mask
GregCr 4:c6ef863d0b07 918 */
GregCr 4:c6ef863d0b07 919 void SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask );
GregCr 4:c6ef863d0b07 920
GregCr 4:c6ef863d0b07 921 /*!
GregCr 4:c6ef863d0b07 922 * \brief Returns the current IRQ status
GregCr 4:c6ef863d0b07 923 *
GregCr 4:c6ef863d0b07 924 * \retval irqStatus IRQ status
GregCr 4:c6ef863d0b07 925 */
GregCr 4:c6ef863d0b07 926 uint16_t GetIrqStatus( void );
GregCr 4:c6ef863d0b07 927
GregCr 4:c6ef863d0b07 928 /*
GregCr 4:c6ef863d0b07 929 * \brief Indicates if DIO2 is used to control an RF Switch
GregCr 4:c6ef863d0b07 930 *
GregCr 4:c6ef863d0b07 931 * \param [in] enable true of false
GregCr 4:c6ef863d0b07 932 */
GregCr 4:c6ef863d0b07 933 void SetDio2AsRfSwitchCtrl( uint8_t enable );
GregCr 4:c6ef863d0b07 934
GregCr 4:c6ef863d0b07 935 /*
GregCr 4:c6ef863d0b07 936 * \brief Indicates if the Radio main clock is supplied from a tcxo
GregCr 4:c6ef863d0b07 937 *
GregCr 4:c6ef863d0b07 938 * \param [in] tcxoVoltage voltage used to control the TCXO
GregCr 4:c6ef863d0b07 939 * \param [in] timeout time given to the TCXO to go to 32MHz
GregCr 4:c6ef863d0b07 940 */
GregCr 4:c6ef863d0b07 941 void SetDio3AsTcxoCtrl( RadioTcxoCtrlVoltage_t tcxoVoltage, uint32_t timeout );
GregCr 4:c6ef863d0b07 942
GregCr 4:c6ef863d0b07 943 /*!
GregCr 4:c6ef863d0b07 944 * \brief Sets the RF frequency
GregCr 4:c6ef863d0b07 945 *
GregCr 4:c6ef863d0b07 946 * \param [in] frequency RF frequency [Hz]
GregCr 4:c6ef863d0b07 947 */
GregCr 4:c6ef863d0b07 948 void SetRfFrequency( uint32_t frequency );
GregCr 4:c6ef863d0b07 949
GregCr 4:c6ef863d0b07 950 /*!
GregCr 4:c6ef863d0b07 951 * \brief Sets the radio for the given protocol
GregCr 4:c6ef863d0b07 952 *
GregCr 4:c6ef863d0b07 953 * \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
GregCr 4:c6ef863d0b07 954 *
GregCr 4:c6ef863d0b07 955 * \remark This method has to be called before SetRfFrequency,
GregCr 4:c6ef863d0b07 956 * SetModulationParams and SetPacketParams
GregCr 4:c6ef863d0b07 957 */
GregCr 4:c6ef863d0b07 958 void SetPacketType( RadioPacketTypes_t packetType );
GregCr 4:c6ef863d0b07 959
GregCr 4:c6ef863d0b07 960 /*!
GregCr 4:c6ef863d0b07 961 * \brief Gets the current radio protocol
GregCr 4:c6ef863d0b07 962 *
GregCr 4:c6ef863d0b07 963 * \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA]
GregCr 4:c6ef863d0b07 964 */
GregCr 4:c6ef863d0b07 965 RadioPacketTypes_t GetPacketType( void );
GregCr 4:c6ef863d0b07 966
GregCr 4:c6ef863d0b07 967 /*!
GregCr 4:c6ef863d0b07 968 * \brief Sets the transmission parameters
GregCr 4:c6ef863d0b07 969 *
GregCr 4:c6ef863d0b07 970 * \param [in] power RF output power [-18..13] dBm
GregCr 4:c6ef863d0b07 971 * \param [in] rampTime Transmission ramp up time
GregCr 4:c6ef863d0b07 972 */
GregCr 4:c6ef863d0b07 973 void SetTxParams( int8_t power, RadioRampTimes_t rampTime );
GregCr 4:c6ef863d0b07 974
GregCr 4:c6ef863d0b07 975 /*!
GregCr 4:c6ef863d0b07 976 * \brief Set the modulation parameters
GregCr 4:c6ef863d0b07 977 *
GregCr 4:c6ef863d0b07 978 * \param [in] modParams A structure describing the modulation parameters
GregCr 4:c6ef863d0b07 979 */
GregCr 4:c6ef863d0b07 980 void SetModulationParams( ModulationParams_t *modParams );
GregCr 4:c6ef863d0b07 981
GregCr 4:c6ef863d0b07 982 /*!
GregCr 4:c6ef863d0b07 983 * \brief Sets the packet parameters
GregCr 4:c6ef863d0b07 984 *
GregCr 4:c6ef863d0b07 985 * \param [in] packetParams A structure describing the packet parameters
GregCr 4:c6ef863d0b07 986 */
GregCr 4:c6ef863d0b07 987 void SetPacketParams( PacketParams_t *packetParams );
GregCr 4:c6ef863d0b07 988
GregCr 4:c6ef863d0b07 989 /*!
GregCr 4:c6ef863d0b07 990 * \brief Sets the Channel Activity Detection (CAD) parameters
GregCr 0:deaafdfde3bb 991 *
GregCr 4:c6ef863d0b07 992 * \param [in] cadSymbolNum The number of symbol to use for CAD operations
GregCr 4:c6ef863d0b07 993 * [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL,
GregCr 4:c6ef863d0b07 994 * LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL,
GregCr 4:c6ef863d0b07 995 * LORA_CAD_16_SYMBOL]
GregCr 4:c6ef863d0b07 996 * \param [in] cadDetPeak Limite for detection of SNR peak used in the CAD
GregCr 4:c6ef863d0b07 997 * \param [in] cadDetMin Set the minimum symbol recognition for CAD
GregCr 4:c6ef863d0b07 998 * \param [in] cadExitMode Operation to be done at the end of CAD action
GregCr 4:c6ef863d0b07 999 * [LORA_CAD_ONLY, LORA_CAD_RX, LORA_CAD_LBT]
GregCr 4:c6ef863d0b07 1000 * \param [in] cadTimeout Defines the timeout value to abort the CAD activity
GregCr 4:c6ef863d0b07 1001 */
GregCr 4:c6ef863d0b07 1002 void SetCadParams( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, RadioCadExitModes_t cadExitMode, uint32_t cadTimeout );
GregCr 4:c6ef863d0b07 1003
GregCr 4:c6ef863d0b07 1004 /*!
GregCr 4:c6ef863d0b07 1005 * \brief Sets the data buffer base address for transmission and reception
GregCr 4:c6ef863d0b07 1006 *
GregCr 4:c6ef863d0b07 1007 * \param [in] txBaseAddress Transmission base address
GregCr 4:c6ef863d0b07 1008 * \param [in] rxBaseAddress Reception base address
GregCr 4:c6ef863d0b07 1009 */
GregCr 4:c6ef863d0b07 1010 void SetBufferBaseAddresses( uint8_t txBaseAddress, uint8_t rxBaseAddress );
GregCr 4:c6ef863d0b07 1011
GregCr 4:c6ef863d0b07 1012 /*!
GregCr 4:c6ef863d0b07 1013 * \brief Gets the current radio status
GregCr 4:c6ef863d0b07 1014 *
GregCr 4:c6ef863d0b07 1015 * \retval status Radio status
GregCr 4:c6ef863d0b07 1016 */
GregCr 4:c6ef863d0b07 1017 virtual RadioStatus_t GetStatus( void );
GregCr 4:c6ef863d0b07 1018
GregCr 4:c6ef863d0b07 1019 /*!
GregCr 4:c6ef863d0b07 1020 * \brief Returns the instantaneous RSSI value for the last packet received
GregCr 4:c6ef863d0b07 1021 *
GregCr 4:c6ef863d0b07 1022 * \retval rssiInst Instantaneous RSSI
GregCr 4:c6ef863d0b07 1023 */
GregCr 4:c6ef863d0b07 1024 int8_t GetRssiInst( void );
GregCr 4:c6ef863d0b07 1025
GregCr 4:c6ef863d0b07 1026 /*!
GregCr 4:c6ef863d0b07 1027 * \brief Gets the last received packet buffer status
GregCr 4:c6ef863d0b07 1028 *
GregCr 4:c6ef863d0b07 1029 * \param [out] payloadLength Last received packet payload length
GregCr 4:c6ef863d0b07 1030 * \param [out] rxStartBuffer Last received packet buffer address pointer
GregCr 4:c6ef863d0b07 1031 */
GregCr 4:c6ef863d0b07 1032 void GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBuffer );
GregCr 4:c6ef863d0b07 1033
GregCr 4:c6ef863d0b07 1034 /*!
GregCr 4:c6ef863d0b07 1035 * \brief Gets the last received packet payload length
GregCr 4:c6ef863d0b07 1036 *
GregCr 4:c6ef863d0b07 1037 * \param [out] pktStatus A structure of packet status
GregCr 4:c6ef863d0b07 1038 */
GregCr 4:c6ef863d0b07 1039 void GetPacketStatus( PacketStatus_t *pktStatus );
GregCr 4:c6ef863d0b07 1040
GregCr 4:c6ef863d0b07 1041 /*!
GregCr 4:c6ef863d0b07 1042 * \brief Returns the possible system erros
GregCr 4:c6ef863d0b07 1043 *
GregCr 4:c6ef863d0b07 1044 * \retval sysErrors Value representing the possible sys failures
GregCr 0:deaafdfde3bb 1045 */
GregCr 4:c6ef863d0b07 1046 RadioError_t GetDeviceErrors( void );
GregCr 4:c6ef863d0b07 1047
GregCr 4:c6ef863d0b07 1048 /*!
GregCr 4:c6ef863d0b07 1049 * \brief Clears the IRQs
GregCr 4:c6ef863d0b07 1050 *
GregCr 4:c6ef863d0b07 1051 * \param [in] irq IRQ(s) to be cleared
GregCr 4:c6ef863d0b07 1052 */
GregCr 4:c6ef863d0b07 1053 void ClearIrqStatus( uint16_t irq );
GregCr 4:c6ef863d0b07 1054
GregCr 4:c6ef863d0b07 1055 /*!
GregCr 4:c6ef863d0b07 1056 * \brief Set the driver in polling mode.
GregCr 4:c6ef863d0b07 1057 *
GregCr 4:c6ef863d0b07 1058 * In polling mode the application is responsible to call ProcessIrqs( ) to
GregCr 4:c6ef863d0b07 1059 * execute callbacks functions.
GregCr 4:c6ef863d0b07 1060 * The default mode is Interrupt Mode.
GregCr 4:c6ef863d0b07 1061 * @code
GregCr 4:c6ef863d0b07 1062 * // Initializations and callbacks declaration/definition
GregCr 4:c6ef863d0b07 1063 * radio = SX126x( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks );
GregCr 4:c6ef863d0b07 1064 * radio.Init( );
GregCr 4:c6ef863d0b07 1065 * radio.SetPollingMode( );
GregCr 4:c6ef863d0b07 1066 *
GregCr 4:c6ef863d0b07 1067 * while( true )
GregCr 4:c6ef863d0b07 1068 * {
GregCr 4:c6ef863d0b07 1069 * // IRQ processing is automatically done
GregCr 4:c6ef863d0b07 1070 * radio.ProcessIrqs( ); // <-- here, as well as callback functions
GregCr 4:c6ef863d0b07 1071 * // calls
GregCr 4:c6ef863d0b07 1072 * // Do some applicative work
GregCr 4:c6ef863d0b07 1073 * }
GregCr 4:c6ef863d0b07 1074 * @endcode
GregCr 4:c6ef863d0b07 1075 *
GregCr 4:c6ef863d0b07 1076 * \see SX126x::SetInterruptMode
GregCr 4:c6ef863d0b07 1077 */
GregCr 4:c6ef863d0b07 1078 void SetPollingMode( void );
GregCr 4:c6ef863d0b07 1079
GregCr 4:c6ef863d0b07 1080 /*!
GregCr 4:c6ef863d0b07 1081 * \brief Set the driver in interrupt mode.
GregCr 4:c6ef863d0b07 1082 *
GregCr 4:c6ef863d0b07 1083 * In interrupt mode, the driver communicate with the radio during the
GregCr 4:c6ef863d0b07 1084 * interruption by direct calls to ProcessIrqs( ). The main advantage is
GregCr 4:c6ef863d0b07 1085 * the possibility to have low power application architecture.
GregCr 4:c6ef863d0b07 1086 * This is the default mode.
GregCr 4:c6ef863d0b07 1087 * @code
GregCr 4:c6ef863d0b07 1088 * // Initializations and callbacks declaration/definition
GregCr 4:c6ef863d0b07 1089 * radio = SX126x( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks );
GregCr 4:c6ef863d0b07 1090 * radio.Init( );
GregCr 4:c6ef863d0b07 1091 * radio.SetInterruptMode( ); // Optionnal. Driver default behavior
GregCr 4:c6ef863d0b07 1092 *
GregCr 4:c6ef863d0b07 1093 * while( true )
GregCr 4:c6ef863d0b07 1094 * {
GregCr 4:c6ef863d0b07 1095 * // Do some applicative work
GregCr 4:c6ef863d0b07 1096 * }
GregCr 4:c6ef863d0b07 1097 * @endcode
GregCr 4:c6ef863d0b07 1098 *
GregCr 4:c6ef863d0b07 1099 * \see SX126x::SetPollingMode
GregCr 4:c6ef863d0b07 1100 */
GregCr 4:c6ef863d0b07 1101 void SetInterruptMode( void );
GregCr 0:deaafdfde3bb 1102
GregCr 0:deaafdfde3bb 1103 /*!
GregCr 0:deaafdfde3bb 1104 * \brief Resets the radio
GregCr 0:deaafdfde3bb 1105 */
GregCr 0:deaafdfde3bb 1106 virtual void Reset( void ) = 0;
GregCr 0:deaafdfde3bb 1107
GregCr 0:deaafdfde3bb 1108 /*!
GregCr 0:deaafdfde3bb 1109 * \brief Wake-ups the radio from Sleep mode
GregCr 0:deaafdfde3bb 1110 */
GregCr 0:deaafdfde3bb 1111 virtual void Wakeup( void ) = 0;
GregCr 0:deaafdfde3bb 1112
GregCr 0:deaafdfde3bb 1113 /*!
GregCr 0:deaafdfde3bb 1114 * \brief Writes the given command to the radio
GregCr 0:deaafdfde3bb 1115 *
GregCr 0:deaafdfde3bb 1116 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 1117 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 1118 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 1119 */
GregCr 0:deaafdfde3bb 1120 virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 1121
GregCr 0:deaafdfde3bb 1122 /*!
GregCr 0:deaafdfde3bb 1123 * \brief Reads the given command from the radio
GregCr 0:deaafdfde3bb 1124 *
GregCr 0:deaafdfde3bb 1125 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 1126 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 1127 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 1128 */
GregCr 0:deaafdfde3bb 1129 virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 1130
GregCr 0:deaafdfde3bb 1131 /*!
GregCr 0:deaafdfde3bb 1132 * \brief Writes multiple radio registers starting at address
GregCr 0:deaafdfde3bb 1133 *
GregCr 0:deaafdfde3bb 1134 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 1135 * \param [in] buffer Buffer containing the new register's values
GregCr 0:deaafdfde3bb 1136 * \param [in] size Number of registers to be written
GregCr 0:deaafdfde3bb 1137 */
GregCr 0:deaafdfde3bb 1138 virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 1139
GregCr 0:deaafdfde3bb 1140 /*!
GregCr 0:deaafdfde3bb 1141 * \brief Writes the radio register at the specified address
GregCr 0:deaafdfde3bb 1142 *
GregCr 0:deaafdfde3bb 1143 * \param [in] address Register address
GregCr 0:deaafdfde3bb 1144 * \param [in] value New register value
GregCr 0:deaafdfde3bb 1145 */
GregCr 4:c6ef863d0b07 1146 virtual void WriteReg( uint16_t address, uint8_t value ) = 0;
GregCr 0:deaafdfde3bb 1147
GregCr 0:deaafdfde3bb 1148 /*!
GregCr 0:deaafdfde3bb 1149 * \brief Reads multiple radio registers starting at address
GregCr 0:deaafdfde3bb 1150 *
GregCr 0:deaafdfde3bb 1151 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 1152 * \param [out] buffer Buffer where to copy the registers data
GregCr 0:deaafdfde3bb 1153 * \param [in] size Number of registers to be read
GregCr 0:deaafdfde3bb 1154 */
GregCr 0:deaafdfde3bb 1155 virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 1156
GregCr 0:deaafdfde3bb 1157 /*!
GregCr 0:deaafdfde3bb 1158 * \brief Reads the radio register at the specified address
GregCr 0:deaafdfde3bb 1159 *
GregCr 0:deaafdfde3bb 1160 * \param [in] address Register address
GregCr 0:deaafdfde3bb 1161 *
GregCr 0:deaafdfde3bb 1162 * \retval data Register value
GregCr 0:deaafdfde3bb 1163 */
GregCr 4:c6ef863d0b07 1164 virtual uint8_t ReadReg( uint16_t address ) = 0;
GregCr 0:deaafdfde3bb 1165
GregCr 0:deaafdfde3bb 1166 /*!
GregCr 0:deaafdfde3bb 1167 * \brief Writes Radio Data Buffer with buffer of size starting at offset.
GregCr 0:deaafdfde3bb 1168 *
GregCr 0:deaafdfde3bb 1169 * \param [in] offset Offset where to start writing
GregCr 0:deaafdfde3bb 1170 * \param [in] buffer Buffer pointer
GregCr 0:deaafdfde3bb 1171 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 1172 */
GregCr 0:deaafdfde3bb 1173 virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 1174
GregCr 0:deaafdfde3bb 1175 /*!
GregCr 0:deaafdfde3bb 1176 * \brief Reads Radio Data Buffer at offset to buffer of size
GregCr 0:deaafdfde3bb 1177 *
GregCr 0:deaafdfde3bb 1178 * \param [in] offset Offset where to start reading
GregCr 0:deaafdfde3bb 1179 * \param [out] buffer Buffer pointer
GregCr 0:deaafdfde3bb 1180 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 1181 */
GregCr 0:deaafdfde3bb 1182 virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 1183
GregCr 0:deaafdfde3bb 1184 /*!
GregCr 0:deaafdfde3bb 1185 * \brief Gets the current status of the radio DIOs
GregCr 0:deaafdfde3bb 1186 *
GregCr 0:deaafdfde3bb 1187 * \retval status [Bit #3: DIO3, Bit #2: DIO2,
GregCr 4:c6ef863d0b07 1188 * Bit #1: DIO1, Bit #0: BUSY]
GregCr 0:deaafdfde3bb 1189 */
GregCr 0:deaafdfde3bb 1190 virtual uint8_t GetDioStatus( void ) = 0;
GregCr 0:deaafdfde3bb 1191
GregCr 0:deaafdfde3bb 1192 /*!
GregCr 4:c6ef863d0b07 1193 * \brief Returns the device type
GregCr 0:deaafdfde3bb 1194 *
GregCr 4:c6ef863d0b07 1195 * \retval 1: SX1261, 0: sx1262
GregCr 0:deaafdfde3bb 1196 */
GregCr 4:c6ef863d0b07 1197 virtual uint8_t GetDeviceType( void ) = 0;
GregCr 0:deaafdfde3bb 1198
GregCr 0:deaafdfde3bb 1199 /*!
GregCr 4:c6ef863d0b07 1200 * \brief RF Switch power on
GregCr 0:deaafdfde3bb 1201 */
GregCr 4:c6ef863d0b07 1202 virtual void AntSwOn( void ) = 0;
GregCr 0:deaafdfde3bb 1203
GregCr 0:deaafdfde3bb 1204 /*!
GregCr 4:c6ef863d0b07 1205 * \brief RF Switch power off
GregCr 0:deaafdfde3bb 1206 */
GregCr 4:c6ef863d0b07 1207 virtual void AntSwOff( void ) = 0;
GregCr 0:deaafdfde3bb 1208
GregCr 0:deaafdfde3bb 1209 /*!
GregCr 4:c6ef863d0b07 1210 * \brief Process the analysis of radio IRQs and calls callback functions
GregCr 4:c6ef863d0b07 1211 * depending on radio state
GregCr 0:deaafdfde3bb 1212 */
GregCr 4:c6ef863d0b07 1213 void ProcessIrqs( void );
GregCr 0:deaafdfde3bb 1214 };
GregCr 0:deaafdfde3bb 1215
GregCr 2:4ff11ea92fbe 1216 #endif // __SX126x_H__