SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

Committer:
GregCr
Date:
Fri Mar 09 13:19:45 2018 +0000
Revision:
5:e488e6f185f3
Parent:
4:c6ef863d0b07
Child:
6:1e2345700991
Updated to release status

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