SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

Committer:
GregCr
Date:
Wed Jul 18 13:33:42 2018 +0000
Revision:
6:1e2345700991
Parent:
5:e488e6f185f3
added support for sx1268

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