f

Committer:
Helmut Tschemernjak
Date:
Mon May 01 18:56:35 2017 +0200
Revision:
33:5db0d1e716b1
Parent:
32:f6f0bff38543
Child:
34:07e89f23c734
Added more typedefs for bandwidth, coding rate, data rate, etc.
This makes the maintenance and debugging much easier.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:e6ceb13d2d05 1 /*
GregCr 0:e6ceb13d2d05 2 / _____) _ | |
GregCr 0:e6ceb13d2d05 3 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:e6ceb13d2d05 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:e6ceb13d2d05 5 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:e6ceb13d2d05 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 22:7f3aab69cca9 7 (C) 2014 Semtech
GregCr 0:e6ceb13d2d05 8
GregCr 0:e6ceb13d2d05 9 Description: Actual implementation of a SX1276 radio, inherits Radio
GregCr 0:e6ceb13d2d05 10
GregCr 0:e6ceb13d2d05 11 License: Revised BSD License, see LICENSE.TXT file include in the project
GregCr 0:e6ceb13d2d05 12
GregCr 0:e6ceb13d2d05 13 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
GregCr 0:e6ceb13d2d05 14 */
GregCr 0:e6ceb13d2d05 15 #ifndef __SX1276_H__
GregCr 0:e6ceb13d2d05 16 #define __SX1276_H__
GregCr 0:e6ceb13d2d05 17
GregCr 0:e6ceb13d2d05 18 #include "radio.h"
GregCr 0:e6ceb13d2d05 19 #include "./registers/sx1276Regs-Fsk.h"
GregCr 0:e6ceb13d2d05 20 #include "./registers/sx1276Regs-LoRa.h"
GregCr 0:e6ceb13d2d05 21 #include "./typedefs/typedefs.h"
GregCr 0:e6ceb13d2d05 22
mluis 16:d447f8d2d2d6 23 /*!
Helmut Tschemernjak 31:e50929bd3f32 24 * Radio wake-up time from sleep
Helmut Tschemernjak 31:e50929bd3f32 25 */
Helmut Tschemernjak 32:f6f0bff38543 26 #define RADIO_WAKEUP_TIME 1 // [ms]
Helmut Tschemernjak 31:e50929bd3f32 27
Helmut Tschemernjak 31:e50929bd3f32 28 /*!
Helmut Tschemernjak 31:e50929bd3f32 29 * Sync word for Private LoRa networks
mluis 16:d447f8d2d2d6 30 */
Helmut Tschemernjak 31:e50929bd3f32 31 #define LORA_MAC_PRIVATE_SYNCWORD 0x12
Helmut Tschemernjak 31:e50929bd3f32 32
Helmut Tschemernjak 31:e50929bd3f32 33 /*!
Helmut Tschemernjak 31:e50929bd3f32 34 * Sync word for Public LoRa networks
Helmut Tschemernjak 31:e50929bd3f32 35 */
Helmut Tschemernjak 31:e50929bd3f32 36 #define LORA_MAC_PUBLIC_SYNCWORD 0x34
Helmut Tschemernjak 31:e50929bd3f32 37
mluis 25:3778e6204cc1 38
mluis 25:3778e6204cc1 39 /*!
mluis 16:d447f8d2d2d6 40 * SX1276 definitions
mluis 16:d447f8d2d2d6 41 */
GregCr 0:e6ceb13d2d05 42 #define XTAL_FREQ 32000000
GregCr 0:e6ceb13d2d05 43 #define FREQ_STEP 61.03515625
GregCr 0:e6ceb13d2d05 44
GregCr 0:e6ceb13d2d05 45 #define RX_BUFFER_SIZE 256
GregCr 0:e6ceb13d2d05 46
GregCr 0:e6ceb13d2d05 47 /*!
GregCr 0:e6ceb13d2d05 48 * Constant values need to compute the RSSI value
GregCr 0:e6ceb13d2d05 49 */
GregCr 0:e6ceb13d2d05 50 #define RSSI_OFFSET_LF -164.0
GregCr 0:e6ceb13d2d05 51 #define RSSI_OFFSET_HF -157.0
GregCr 0:e6ceb13d2d05 52
GregCr 0:e6ceb13d2d05 53 #define RF_MID_BAND_THRESH 525000000
GregCr 0:e6ceb13d2d05 54
Helmut64 27:1a9d7dadb593 55 #ifdef TARGET_STM32L0
Helmut Tschemernjak 28:6d83af9f8563 56 #define MURATA_ANT_SWITCH 1 // STM B-L072Z-LRWAN1 device
Helmut Tschemernjak 28:6d83af9f8563 57 #elif TARGET_STM32L4
Helmut Tschemernjak 28:6d83af9f8563 58 #define RFM95_MODULE 1 // RFM95 modules are SX1276MB1LAS compatible
Helmut64 27:1a9d7dadb593 59 #endif
Helmut64 26:87796ee62589 60
Helmut Tschemernjak 33:5db0d1e716b1 61 typedef enum {
Helmut Tschemernjak 33:5db0d1e716b1 62 LORA_BANKWIDTH_7kHz = 0, // 7.8 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 63 LORA_BANKWIDTH_10kHz = 1, // 10.4 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 64 LORA_BANKWIDTH_15kHz = 2, // 15.6 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 65 LORA_BANKWIDTH_20kHz = 3, // 20.8 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 66 LORA_BANKWIDTH_31kHz = 4, // 31.2 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 67 LORA_BANKWIDTH_41kHz = 5, // 41.4 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 68 LORA_BANKWIDTH_62kHz = 6, // 62.5 kHz requires TCXO
Helmut Tschemernjak 33:5db0d1e716b1 69
Helmut Tschemernjak 33:5db0d1e716b1 70 LORA_BANKWIDTH_125kHz = 7,
Helmut Tschemernjak 33:5db0d1e716b1 71 LORA_BANKWIDTH_250kHz = 8,
Helmut Tschemernjak 33:5db0d1e716b1 72 LORA_BANKWIDTH_500kHz = 9,
Helmut Tschemernjak 33:5db0d1e716b1 73 LORA_BANKWIDTH_RESERVED = 10,
Helmut Tschemernjak 33:5db0d1e716b1 74 } Lora_bandwidth_t;
Helmut Tschemernjak 33:5db0d1e716b1 75
Helmut Tschemernjak 33:5db0d1e716b1 76
Helmut Tschemernjak 33:5db0d1e716b1 77
Helmut Tschemernjak 33:5db0d1e716b1 78 typedef enum {
Helmut Tschemernjak 33:5db0d1e716b1 79 LORA_SF6 = 6, // 64 chips/symbol, SF6 requires an TCXO!
Helmut Tschemernjak 33:5db0d1e716b1 80 LORA_SF7 = 7, // 128 chips/symbol
Helmut Tschemernjak 33:5db0d1e716b1 81 LORA_SF8 = 8, // 256 chips/symbol
Helmut Tschemernjak 33:5db0d1e716b1 82 LORA_SF9 = 9, // 512 chips/symbol
Helmut Tschemernjak 33:5db0d1e716b1 83 LORA_SF10 = 10, // 1024 chips/symbol
Helmut Tschemernjak 33:5db0d1e716b1 84 LORA_SF11 = 11, // 2048 chips/symbol
Helmut Tschemernjak 33:5db0d1e716b1 85 LORA_SF12 = 12, // 4096 chips/symbol
Helmut Tschemernjak 33:5db0d1e716b1 86 } lora_spreading_factor_t;
Helmut Tschemernjak 33:5db0d1e716b1 87
Helmut Tschemernjak 33:5db0d1e716b1 88
Helmut Tschemernjak 33:5db0d1e716b1 89 typedef enum { // cyclic error coding to perform forward error detection and correction
Helmut Tschemernjak 33:5db0d1e716b1 90 LORA_ERROR_CODING_RATE_4_5 = 1, // 1.25x overhead
Helmut Tschemernjak 33:5db0d1e716b1 91 LORA_ERROR_CODING_RATE_4_6 = 2, // 1.50x overhead
Helmut Tschemernjak 33:5db0d1e716b1 92 LORA_ERROR_CODING_RATE_4_7 = 3, // 1.75x overhead
Helmut Tschemernjak 33:5db0d1e716b1 93 LORA_ERROR_CODING_RATE_4_8 = 4, // 2.00x overhead
Helmut Tschemernjak 33:5db0d1e716b1 94 } lora_coding_rate_t;
Helmut Tschemernjak 33:5db0d1e716b1 95
Helmut Tschemernjak 33:5db0d1e716b1 96
Helmut Tschemernjak 33:5db0d1e716b1 97 typedef enum {
Helmut Tschemernjak 33:5db0d1e716b1 98 RF_FREQUENCY_868_0 = 868000000, // Hz
Helmut Tschemernjak 33:5db0d1e716b1 99 RF_FREQUENCY_868_1 = 868100000, // Hz
Helmut Tschemernjak 33:5db0d1e716b1 100 RF_FREQUENCY_868_3 = 868300000, // Hz
Helmut Tschemernjak 33:5db0d1e716b1 101 RF_FREQUENCY_868_5 = 868500000, // Hz
Helmut Tschemernjak 33:5db0d1e716b1 102 } rf_frequency_t;
Helmut Tschemernjak 33:5db0d1e716b1 103
Helmut Tschemernjak 33:5db0d1e716b1 104
Helmut Tschemernjak 33:5db0d1e716b1 105
Helmut Tschemernjak 33:5db0d1e716b1 106 /*!
GregCr 0:e6ceb13d2d05 107 * Actual implementation of a SX1276 radio, inherits Radio
GregCr 0:e6ceb13d2d05 108 */
GregCr 0:e6ceb13d2d05 109 class SX1276 : public Radio
GregCr 0:e6ceb13d2d05 110 {
GregCr 0:e6ceb13d2d05 111 protected:
GregCr 0:e6ceb13d2d05 112 /*!
GregCr 0:e6ceb13d2d05 113 * SPI Interface
GregCr 0:e6ceb13d2d05 114 */
GregCr 0:e6ceb13d2d05 115 SPI spi; // mosi, miso, sclk
GregCr 0:e6ceb13d2d05 116 DigitalOut nss;
GregCr 0:e6ceb13d2d05 117
GregCr 0:e6ceb13d2d05 118 /*!
GregCr 0:e6ceb13d2d05 119 * SX1276 Reset pin
GregCr 0:e6ceb13d2d05 120 */
GregCr 4:f0ce52e94d3f 121 DigitalInOut reset;
GregCr 0:e6ceb13d2d05 122
GregCr 0:e6ceb13d2d05 123 /*!
GregCr 0:e6ceb13d2d05 124 * SX1276 DIO pins
GregCr 0:e6ceb13d2d05 125 */
mluis 13:618826a997e2 126 InterruptIn dio0;
mluis 13:618826a997e2 127 InterruptIn dio1;
mluis 13:618826a997e2 128 InterruptIn dio2;
mluis 13:618826a997e2 129 InterruptIn dio3;
mluis 13:618826a997e2 130 InterruptIn dio4;
mluis 13:618826a997e2 131 DigitalIn dio5;
mluis 25:3778e6204cc1 132
mluis 13:618826a997e2 133 bool isRadioActive;
mluis 25:3778e6204cc1 134
mluis 13:618826a997e2 135 uint8_t boardConnected; //1 = SX1276MB1LAS; 0 = SX1276MB1MAS
mluis 25:3778e6204cc1 136
GregCr 23:1e143575df0f 137 uint8_t *rxtxBuffer;
mluis 13:618826a997e2 138
mluis 13:618826a997e2 139 /*!
mluis 13:618826a997e2 140 * Hardware DIO IRQ functions
mluis 13:618826a997e2 141 */
mluis 13:618826a997e2 142 DioIrqHandler *dioIrq;
mluis 25:3778e6204cc1 143
mluis 13:618826a997e2 144 /*!
mluis 13:618826a997e2 145 * Tx and Rx timers
mluis 13:618826a997e2 146 */
mluis 13:618826a997e2 147 Timeout txTimeoutTimer;
mluis 13:618826a997e2 148 Timeout rxTimeoutTimer;
mluis 13:618826a997e2 149 Timeout rxTimeoutSyncWord;
mluis 25:3778e6204cc1 150
mluis 13:618826a997e2 151 RadioSettings_t settings;
mluis 25:3778e6204cc1 152
Helmut Tschemernjak 31:e50929bd3f32 153 static const FskBandwidth_t FskBandwidths[];
GregCr 0:e6ceb13d2d05 154 protected:
GregCr 0:e6ceb13d2d05 155
mluis 13:618826a997e2 156 /*!
mluis 13:618826a997e2 157 * Performs the Rx chain calibration for LF and HF bands
mluis 13:618826a997e2 158 * \remark Must be called just after the reset so all registers are at their
mluis 13:618826a997e2 159 * default values
mluis 13:618826a997e2 160 */
mluis 13:618826a997e2 161 void RxChainCalibration( void );
GregCr 0:e6ceb13d2d05 162
GregCr 0:e6ceb13d2d05 163 public:
mluis 21:2e496deb7858 164 SX1276( RadioEvents_t *events,
Helmut Tschemernjak 31:e50929bd3f32 165 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
Helmut Tschemernjak 31:e50929bd3f32 166 PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 );
mluis 21:2e496deb7858 167 SX1276( RadioEvents_t *events );
mluis 13:618826a997e2 168 virtual ~SX1276( );
mluis 13:618826a997e2 169
mluis 13:618826a997e2 170 //-------------------------------------------------------------------------
mluis 13:618826a997e2 171 // Redefined Radio functions
mluis 13:618826a997e2 172 //-------------------------------------------------------------------------
mluis 13:618826a997e2 173 /*!
mluis 21:2e496deb7858 174 * @brief Initializes the radio
mluis 21:2e496deb7858 175 *
mluis 21:2e496deb7858 176 * @param [IN] events Structure containing the driver callback functions
mluis 21:2e496deb7858 177 */
mluis 21:2e496deb7858 178 virtual void Init( RadioEvents_t *events );
mluis 21:2e496deb7858 179 /*!
GregCr 0:e6ceb13d2d05 180 * Return current radio status
GregCr 0:e6ceb13d2d05 181 *
mluis 21:2e496deb7858 182 * @param status Radio status. [RF_IDLE, RX_RUNNING, TX_RUNNING]
GregCr 0:e6ceb13d2d05 183 */
GregCr 19:71a47bb03fbb 184 virtual RadioState GetStatus( void );
mluis 25:3778e6204cc1 185
mluis 13:618826a997e2 186 /*!
mluis 13:618826a997e2 187 * @brief Configures the SX1276 with the given modem
mluis 13:618826a997e2 188 *
mluis 13:618826a997e2 189 * @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
mluis 13:618826a997e2 190 */
mluis 22:7f3aab69cca9 191 virtual void SetModem( RadioModems_t modem );
mluis 13:618826a997e2 192
mluis 13:618826a997e2 193 /*!
GregCr 0:e6ceb13d2d05 194 * @brief Sets the channel frequency
GregCr 0:e6ceb13d2d05 195 *
GregCr 0:e6ceb13d2d05 196 * @param [IN] freq Channel RF frequency
GregCr 0:e6ceb13d2d05 197 */
GregCr 0:e6ceb13d2d05 198 virtual void SetChannel( uint32_t freq );
mluis 25:3778e6204cc1 199
mluis 13:618826a997e2 200 /*!
GregCr 0:e6ceb13d2d05 201 * @brief Sets the channels configuration
GregCr 0:e6ceb13d2d05 202 *
GregCr 0:e6ceb13d2d05 203 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 204 * @param [IN] freq Channel RF frequency
GregCr 0:e6ceb13d2d05 205 * @param [IN] rssiThresh RSSI threshold
GregCr 0:e6ceb13d2d05 206 *
GregCr 0:e6ceb13d2d05 207 * @retval isFree [true: Channel is free, false: Channel is not free]
GregCr 0:e6ceb13d2d05 208 */
mluis 22:7f3aab69cca9 209 virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh );
mluis 25:3778e6204cc1 210
mluis 13:618826a997e2 211 /*!
GregCr 0:e6ceb13d2d05 212 * @brief Generates a 32 bits random value based on the RSSI readings
GregCr 0:e6ceb13d2d05 213 *
GregCr 0:e6ceb13d2d05 214 * \remark This function sets the radio in LoRa modem mode and disables
GregCr 0:e6ceb13d2d05 215 * all interrupts.
GregCr 0:e6ceb13d2d05 216 * After calling this function either Radio.SetRxConfig or
GregCr 0:e6ceb13d2d05 217 * Radio.SetTxConfig functions must be called.
GregCr 0:e6ceb13d2d05 218 *
GregCr 0:e6ceb13d2d05 219 * @retval randomValue 32 bits random value
GregCr 0:e6ceb13d2d05 220 */
GregCr 0:e6ceb13d2d05 221 virtual uint32_t Random( void );
mluis 25:3778e6204cc1 222
mluis 13:618826a997e2 223 /*!
GregCr 0:e6ceb13d2d05 224 * @brief Sets the reception parameters
GregCr 0:e6ceb13d2d05 225 *
GregCr 0:e6ceb13d2d05 226 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 227 * @param [IN] bandwidth Sets the bandwidth
GregCr 0:e6ceb13d2d05 228 * FSK : >= 2600 and <= 250000 Hz
GregCr 0:e6ceb13d2d05 229 * LoRa: [0: 125 kHz, 1: 250 kHz,
GregCr 0:e6ceb13d2d05 230 * 2: 500 kHz, 3: Reserved]
GregCr 0:e6ceb13d2d05 231 * @param [IN] datarate Sets the Datarate
GregCr 0:e6ceb13d2d05 232 * FSK : 600..300000 bits/s
GregCr 0:e6ceb13d2d05 233 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
GregCr 0:e6ceb13d2d05 234 * 10: 1024, 11: 2048, 12: 4096 chips]
GregCr 0:e6ceb13d2d05 235 * @param [IN] coderate Sets the coding rate ( LoRa only )
GregCr 0:e6ceb13d2d05 236 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 237 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
GregCr 0:e6ceb13d2d05 238 * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only )
GregCr 0:e6ceb13d2d05 239 * FSK : >= 2600 and <= 250000 Hz
GregCr 0:e6ceb13d2d05 240 * LoRa: N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 241 * @param [IN] preambleLen Sets the Preamble length ( LoRa only )
GregCr 0:e6ceb13d2d05 242 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 243 * LoRa: Length in symbols ( the hardware adds 4 more symbols )
Helmut Tschemernjak 31:e50929bd3f32 244 * @param [IN] symbTimeout Sets the RxSingle timeout value
Helmut Tschemernjak 31:e50929bd3f32 245 * FSK : timeout number of bytes
GregCr 0:e6ceb13d2d05 246 * LoRa: timeout in symbols
GregCr 0:e6ceb13d2d05 247 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
mluis 13:618826a997e2 248 * @param [IN] payloadLen Sets payload length when fixed lenght is used
GregCr 0:e6ceb13d2d05 249 * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON]
mluis 13:618826a997e2 250 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
mluis 13:618826a997e2 251 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
GregCr 0:e6ceb13d2d05 252 * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
GregCr 0:e6ceb13d2d05 253 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 254 * LoRa: [0: not inverted, 1: inverted]
GregCr 0:e6ceb13d2d05 255 * @param [IN] rxContinuous Sets the reception in continuous mode
GregCr 0:e6ceb13d2d05 256 * [false: single mode, true: continuous mode]
GregCr 0:e6ceb13d2d05 257 */
mluis 22:7f3aab69cca9 258 virtual void SetRxConfig ( RadioModems_t modem, uint32_t bandwidth,
GregCr 0:e6ceb13d2d05 259 uint32_t datarate, uint8_t coderate,
GregCr 0:e6ceb13d2d05 260 uint32_t bandwidthAfc, uint16_t preambleLen,
GregCr 0:e6ceb13d2d05 261 uint16_t symbTimeout, bool fixLen,
mluis 13:618826a997e2 262 uint8_t payloadLen,
mluis 13:618826a997e2 263 bool crcOn, bool freqHopOn, uint8_t hopPeriod,
GregCr 6:e7f02929cd3d 264 bool iqInverted, bool rxContinuous );
mluis 25:3778e6204cc1 265
mluis 13:618826a997e2 266 /*!
GregCr 0:e6ceb13d2d05 267 * @brief Sets the transmission parameters
GregCr 0:e6ceb13d2d05 268 *
GregCr 0:e6ceb13d2d05 269 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 270 * @param [IN] power Sets the output power [dBm]
GregCr 0:e6ceb13d2d05 271 * @param [IN] fdev Sets the frequency deviation ( FSK only )
GregCr 0:e6ceb13d2d05 272 * FSK : [Hz]
GregCr 0:e6ceb13d2d05 273 * LoRa: 0
GregCr 0:e6ceb13d2d05 274 * @param [IN] bandwidth Sets the bandwidth ( LoRa only )
GregCr 0:e6ceb13d2d05 275 * FSK : 0
GregCr 0:e6ceb13d2d05 276 * LoRa: [0: 125 kHz, 1: 250 kHz,
GregCr 0:e6ceb13d2d05 277 * 2: 500 kHz, 3: Reserved]
GregCr 0:e6ceb13d2d05 278 * @param [IN] datarate Sets the Datarate
GregCr 0:e6ceb13d2d05 279 * FSK : 600..300000 bits/s
GregCr 0:e6ceb13d2d05 280 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
GregCr 0:e6ceb13d2d05 281 * 10: 1024, 11: 2048, 12: 4096 chips]
GregCr 0:e6ceb13d2d05 282 * @param [IN] coderate Sets the coding rate ( LoRa only )
GregCr 0:e6ceb13d2d05 283 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 284 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
GregCr 0:e6ceb13d2d05 285 * @param [IN] preambleLen Sets the preamble length
GregCr 0:e6ceb13d2d05 286 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
GregCr 0:e6ceb13d2d05 287 * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON]
mluis 13:618826a997e2 288 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
mluis 13:618826a997e2 289 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
GregCr 0:e6ceb13d2d05 290 * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
GregCr 0:e6ceb13d2d05 291 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 292 * LoRa: [0: not inverted, 1: inverted]
Helmut Tschemernjak 31:e50929bd3f32 293 * @param [IN] timeout Transmission timeout [ms]
GregCr 0:e6ceb13d2d05 294 */
mluis 22:7f3aab69cca9 295 virtual void SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
GregCr 0:e6ceb13d2d05 296 uint32_t bandwidth, uint32_t datarate,
GregCr 0:e6ceb13d2d05 297 uint8_t coderate, uint16_t preambleLen,
mluis 13:618826a997e2 298 bool fixLen, bool crcOn, bool freqHopOn,
mluis 13:618826a997e2 299 uint8_t hopPeriod, bool iqInverted, uint32_t timeout );
mluis 25:3778e6204cc1 300
mluis 13:618826a997e2 301 /*!
Helmut Tschemernjak 31:e50929bd3f32 302 * @brief Checks if the given RF frequency is supported by the hardware
Helmut Tschemernjak 31:e50929bd3f32 303 *
Helmut Tschemernjak 31:e50929bd3f32 304 * @param [IN] frequency RF frequency to be checked
Helmut Tschemernjak 31:e50929bd3f32 305 * @retval isSupported [true: supported, false: unsupported]
Helmut Tschemernjak 31:e50929bd3f32 306 */
Helmut Tschemernjak 31:e50929bd3f32 307 virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 308
Helmut Tschemernjak 31:e50929bd3f32 309 /*!
GregCr 0:e6ceb13d2d05 310 * @brief Computes the packet time on air for the given payload
GregCr 0:e6ceb13d2d05 311 *
GregCr 0:e6ceb13d2d05 312 * \Remark Can only be called once SetRxConfig or SetTxConfig have been called
GregCr 0:e6ceb13d2d05 313 *
GregCr 0:e6ceb13d2d05 314 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 315 * @param [IN] pktLen Packet payload length
GregCr 0:e6ceb13d2d05 316 *
GregCr 0:e6ceb13d2d05 317 * @retval airTime Computed airTime for the given packet payload length
GregCr 0:e6ceb13d2d05 318 */
Helmut Tschemernjak 31:e50929bd3f32 319 virtual uint32_t TimeOnAir ( RadioModems_t modem, uint8_t pktLen );
mluis 25:3778e6204cc1 320
mluis 13:618826a997e2 321 /*!
GregCr 0:e6ceb13d2d05 322 * @brief Sends the buffer of size. Prepares the packet to be sent and sets
GregCr 0:e6ceb13d2d05 323 * the radio in transmission
GregCr 0:e6ceb13d2d05 324 *
GregCr 0:e6ceb13d2d05 325 * @param [IN]: buffer Buffer pointer
GregCr 0:e6ceb13d2d05 326 * @param [IN]: size Buffer size
GregCr 0:e6ceb13d2d05 327 */
GregCr 0:e6ceb13d2d05 328 virtual void Send( uint8_t *buffer, uint8_t size );
mluis 25:3778e6204cc1 329
mluis 13:618826a997e2 330 /*!
GregCr 0:e6ceb13d2d05 331 * @brief Sets the radio in sleep mode
GregCr 0:e6ceb13d2d05 332 */
GregCr 0:e6ceb13d2d05 333 virtual void Sleep( void );
GregCr 0:e6ceb13d2d05 334
mluis 13:618826a997e2 335 /*!
GregCr 0:e6ceb13d2d05 336 * @brief Sets the radio in standby mode
GregCr 0:e6ceb13d2d05 337 */
GregCr 0:e6ceb13d2d05 338 virtual void Standby( void );
Helmut Tschemernjak 31:e50929bd3f32 339
Helmut Tschemernjak 31:e50929bd3f32 340 /*!
Helmut Tschemernjak 31:e50929bd3f32 341 * @brief Sets the radio in CAD mode
Helmut Tschemernjak 31:e50929bd3f32 342 */
Helmut Tschemernjak 31:e50929bd3f32 343 virtual void StartCad( void );
mluis 25:3778e6204cc1 344
mluis 13:618826a997e2 345 /*!
GregCr 0:e6ceb13d2d05 346 * @brief Sets the radio in reception mode for the given time
Helmut Tschemernjak 31:e50929bd3f32 347 * @param [IN] timeout Reception timeout [ms]
GregCr 0:e6ceb13d2d05 348 * [0: continuous, others timeout]
GregCr 0:e6ceb13d2d05 349 */
GregCr 0:e6ceb13d2d05 350 virtual void Rx( uint32_t timeout );
mluis 25:3778e6204cc1 351
mluis 13:618826a997e2 352 /*!
GregCr 0:e6ceb13d2d05 353 * @brief Sets the radio in transmission mode for the given time
Helmut Tschemernjak 31:e50929bd3f32 354 * @param [IN] timeout Transmission timeout [ms]
GregCr 0:e6ceb13d2d05 355 * [0: continuous, others timeout]
GregCr 0:e6ceb13d2d05 356 */
GregCr 0:e6ceb13d2d05 357 virtual void Tx( uint32_t timeout );
mluis 25:3778e6204cc1 358
mluis 13:618826a997e2 359 /*!
Helmut Tschemernjak 31:e50929bd3f32 360 * @brief Sets the radio in continuous wave transmission mode
Helmut Tschemernjak 31:e50929bd3f32 361 *
Helmut Tschemernjak 31:e50929bd3f32 362 * @param [IN]: freq Channel RF frequency
Helmut Tschemernjak 31:e50929bd3f32 363 * @param [IN]: power Sets the output power [dBm]
Helmut Tschemernjak 31:e50929bd3f32 364 * @param [IN]: time Transmission mode timeout [s]
GregCr 7:2b555111463f 365 */
Helmut Tschemernjak 31:e50929bd3f32 366
Helmut Tschemernjak 31:e50929bd3f32 367 virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time );
mluis 25:3778e6204cc1 368
mluis 13:618826a997e2 369 /*!
GregCr 0:e6ceb13d2d05 370 * @brief Reads the current RSSI value
GregCr 0:e6ceb13d2d05 371 *
GregCr 0:e6ceb13d2d05 372 * @retval rssiValue Current RSSI value in [dBm]
GregCr 0:e6ceb13d2d05 373 */
mluis 22:7f3aab69cca9 374 virtual int16_t GetRssi ( RadioModems_t modem );
mluis 25:3778e6204cc1 375
mluis 13:618826a997e2 376 /*!
GregCr 0:e6ceb13d2d05 377 * @brief Writes the radio register at the specified address
GregCr 0:e6ceb13d2d05 378 *
GregCr 0:e6ceb13d2d05 379 * @param [IN]: addr Register address
GregCr 0:e6ceb13d2d05 380 * @param [IN]: data New register value
GregCr 0:e6ceb13d2d05 381 */
GregCr 0:e6ceb13d2d05 382 virtual void Write ( uint8_t addr, uint8_t data ) = 0;
mluis 25:3778e6204cc1 383
mluis 13:618826a997e2 384 /*!
GregCr 0:e6ceb13d2d05 385 * @brief Reads the radio register at the specified address
GregCr 0:e6ceb13d2d05 386 *
GregCr 0:e6ceb13d2d05 387 * @param [IN]: addr Register address
GregCr 0:e6ceb13d2d05 388 * @retval data Register value
GregCr 0:e6ceb13d2d05 389 */
GregCr 0:e6ceb13d2d05 390 virtual uint8_t Read ( uint8_t addr ) = 0;
mluis 25:3778e6204cc1 391
mluis 13:618826a997e2 392 /*!
GregCr 0:e6ceb13d2d05 393 * @brief Writes multiple radio registers starting at address
GregCr 0:e6ceb13d2d05 394 *
GregCr 0:e6ceb13d2d05 395 * @param [IN] addr First Radio register address
GregCr 0:e6ceb13d2d05 396 * @param [IN] buffer Buffer containing the new register's values
GregCr 0:e6ceb13d2d05 397 * @param [IN] size Number of registers to be written
GregCr 0:e6ceb13d2d05 398 */
GregCr 0:e6ceb13d2d05 399 virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
mluis 25:3778e6204cc1 400
mluis 13:618826a997e2 401 /*!
GregCr 0:e6ceb13d2d05 402 * @brief Reads multiple radio registers starting at address
GregCr 0:e6ceb13d2d05 403 *
GregCr 0:e6ceb13d2d05 404 * @param [IN] addr First Radio register address
GregCr 0:e6ceb13d2d05 405 * @param [OUT] buffer Buffer where to copy the registers data
GregCr 0:e6ceb13d2d05 406 * @param [IN] size Number of registers to be read
GregCr 0:e6ceb13d2d05 407 */
GregCr 0:e6ceb13d2d05 408 virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
mluis 25:3778e6204cc1 409
mluis 13:618826a997e2 410 /*!
mluis 13:618826a997e2 411 * @brief Writes the buffer contents to the SX1276 FIFO
mluis 13:618826a997e2 412 *
mluis 13:618826a997e2 413 * @param [IN] buffer Buffer containing data to be put on the FIFO.
mluis 13:618826a997e2 414 * @param [IN] size Number of bytes to be written to the FIFO
mluis 13:618826a997e2 415 */
mluis 13:618826a997e2 416 virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:e6ceb13d2d05 417
mluis 13:618826a997e2 418 /*!
mluis 13:618826a997e2 419 * @brief Reads the contents of the SX1276 FIFO
mluis 13:618826a997e2 420 *
mluis 13:618826a997e2 421 * @param [OUT] buffer Buffer where to copy the FIFO read data.
mluis 13:618826a997e2 422 * @param [IN] size Number of bytes to be read from the FIFO
mluis 13:618826a997e2 423 */
mluis 13:618826a997e2 424 virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0;
mluis 13:618826a997e2 425 /*!
mluis 13:618826a997e2 426 * @brief Resets the SX1276
mluis 13:618826a997e2 427 */
mluis 13:618826a997e2 428 virtual void Reset( void ) = 0;
mluis 25:3778e6204cc1 429
mluis 20:e05596ba4166 430 /*!
mluis 20:e05596ba4166 431 * @brief Sets the maximum payload length.
mluis 20:e05596ba4166 432 *
mluis 20:e05596ba4166 433 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
mluis 20:e05596ba4166 434 * @param [IN] max Maximum payload length in bytes
mluis 20:e05596ba4166 435 */
mluis 22:7f3aab69cca9 436 virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max );
mluis 25:3778e6204cc1 437
Helmut Tschemernjak 31:e50929bd3f32 438 /*!
Helmut Tschemernjak 31:e50929bd3f32 439 * \brief Sets the network to public or private. Updates the sync byte.
Helmut Tschemernjak 31:e50929bd3f32 440 *
Helmut Tschemernjak 31:e50929bd3f32 441 * \remark Applies to LoRa modem only
Helmut Tschemernjak 31:e50929bd3f32 442 *
Helmut Tschemernjak 31:e50929bd3f32 443 * \param [IN] enable if true, it enables a public network
Helmut Tschemernjak 31:e50929bd3f32 444 */
Helmut Tschemernjak 31:e50929bd3f32 445 virtual void SetPublicNetwork( bool enable );
Helmut Tschemernjak 31:e50929bd3f32 446
Helmut Tschemernjak 31:e50929bd3f32 447
mluis 13:618826a997e2 448 //-------------------------------------------------------------------------
mluis 13:618826a997e2 449 // Board relative functions
mluis 13:618826a997e2 450 //-------------------------------------------------------------------------
mluis 25:3778e6204cc1 451
GregCr 0:e6ceb13d2d05 452 protected:
mluis 13:618826a997e2 453 /*!
mluis 13:618826a997e2 454 * @brief Initializes the radio I/Os pins interface
mluis 13:618826a997e2 455 */
mluis 13:618826a997e2 456 virtual void IoInit( void ) = 0;
mluis 13:618826a997e2 457
mluis 13:618826a997e2 458 /*!
mluis 13:618826a997e2 459 * @brief Initializes the radio registers
mluis 13:618826a997e2 460 */
mluis 13:618826a997e2 461 virtual void RadioRegistersInit( ) = 0;
mluis 13:618826a997e2 462
mluis 13:618826a997e2 463 /*!
mluis 13:618826a997e2 464 * @brief Initializes the radio SPI
mluis 13:618826a997e2 465 */
mluis 13:618826a997e2 466 virtual void SpiInit( void ) = 0;
mluis 25:3778e6204cc1 467
mluis 13:618826a997e2 468 /*!
mluis 13:618826a997e2 469 * @brief Initializes DIO IRQ handlers
mluis 13:618826a997e2 470 *
mluis 13:618826a997e2 471 * @param [IN] irqHandlers Array containing the IRQ callback functions
mluis 13:618826a997e2 472 */
mluis 13:618826a997e2 473 virtual void IoIrqInit( DioIrqHandler *irqHandlers ) = 0;
GregCr 0:e6ceb13d2d05 474
mluis 13:618826a997e2 475 /*!
mluis 13:618826a997e2 476 * @brief De-initializes the radio I/Os pins interface.
mluis 13:618826a997e2 477 *
mluis 13:618826a997e2 478 * \remark Useful when going in MCU lowpower modes
mluis 13:618826a997e2 479 */
mluis 13:618826a997e2 480 virtual void IoDeInit( void ) = 0;
GregCr 0:e6ceb13d2d05 481
mluis 13:618826a997e2 482 /*!
Helmut Tschemernjak 31:e50929bd3f32 483 * @brief Sets the radio output power.
Helmut Tschemernjak 31:e50929bd3f32 484 *
Helmut Tschemernjak 31:e50929bd3f32 485 * @param [IN] power Sets the RF output power
Helmut Tschemernjak 31:e50929bd3f32 486 */
Helmut Tschemernjak 31:e50929bd3f32 487 virtual void SetRfTxPower( int8_t power ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 488
Helmut Tschemernjak 31:e50929bd3f32 489 /*!
mluis 13:618826a997e2 490 * @brief Gets the board PA selection configuration
mluis 13:618826a997e2 491 *
mluis 13:618826a997e2 492 * @param [IN] channel Channel frequency in Hz
mluis 13:618826a997e2 493 * @retval PaSelect RegPaConfig PaSelect value
mluis 13:618826a997e2 494 */
mluis 13:618826a997e2 495 virtual uint8_t GetPaSelect( uint32_t channel ) = 0;
GregCr 0:e6ceb13d2d05 496
mluis 13:618826a997e2 497 /*!
mluis 13:618826a997e2 498 * @brief Set the RF Switch I/Os pins in Low Power mode
mluis 13:618826a997e2 499 *
mluis 13:618826a997e2 500 * @param [IN] status enable or disable
mluis 13:618826a997e2 501 */
mluis 13:618826a997e2 502 virtual void SetAntSwLowPower( bool status ) = 0;
GregCr 0:e6ceb13d2d05 503
mluis 13:618826a997e2 504 /*!
mluis 13:618826a997e2 505 * @brief Initializes the RF Switch I/Os pins interface
mluis 13:618826a997e2 506 */
mluis 13:618826a997e2 507 virtual void AntSwInit( void ) = 0;
GregCr 0:e6ceb13d2d05 508
mluis 13:618826a997e2 509 /*!
mluis 13:618826a997e2 510 * @brief De-initializes the RF Switch I/Os pins interface
mluis 13:618826a997e2 511 *
mluis 13:618826a997e2 512 * \remark Needed to decrease the power consumption in MCU lowpower modes
mluis 13:618826a997e2 513 */
mluis 13:618826a997e2 514 virtual void AntSwDeInit( void ) = 0;
GregCr 0:e6ceb13d2d05 515
mluis 13:618826a997e2 516 /*!
Helmut Tschemernjak 31:e50929bd3f32 517 * @brief Controls the antenna switch if necessary.
mluis 13:618826a997e2 518 *
mluis 13:618826a997e2 519 * \remark see errata note
mluis 13:618826a997e2 520 *
Helmut Tschemernjak 31:e50929bd3f32 521 * @param [IN] opMode Current radio operating mode
mluis 13:618826a997e2 522 */
Helmut Tschemernjak 31:e50929bd3f32 523 virtual void SetAntSw( uint8_t opMode ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 524
GregCr 0:e6ceb13d2d05 525 protected:
GregCr 0:e6ceb13d2d05 526
mluis 13:618826a997e2 527 /*!
mluis 13:618826a997e2 528 * @brief Sets the SX1276 operating mode
mluis 13:618826a997e2 529 *
mluis 13:618826a997e2 530 * @param [IN] opMode New operating mode
mluis 13:618826a997e2 531 */
mluis 13:618826a997e2 532 virtual void SetOpMode( uint8_t opMode );
GregCr 0:e6ceb13d2d05 533
mluis 13:618826a997e2 534 /*
mluis 13:618826a997e2 535 * SX1276 DIO IRQ callback functions prototype
mluis 13:618826a997e2 536 */
GregCr 0:e6ceb13d2d05 537
mluis 13:618826a997e2 538 /*!
mluis 13:618826a997e2 539 * @brief DIO 0 IRQ callback
mluis 13:618826a997e2 540 */
mluis 13:618826a997e2 541 virtual void OnDio0Irq( void );
GregCr 0:e6ceb13d2d05 542
mluis 13:618826a997e2 543 /*!
mluis 13:618826a997e2 544 * @brief DIO 1 IRQ callback
mluis 13:618826a997e2 545 */
mluis 13:618826a997e2 546 virtual void OnDio1Irq( void );
GregCr 0:e6ceb13d2d05 547
mluis 13:618826a997e2 548 /*!
mluis 13:618826a997e2 549 * @brief DIO 2 IRQ callback
mluis 13:618826a997e2 550 */
mluis 13:618826a997e2 551 virtual void OnDio2Irq( void );
GregCr 0:e6ceb13d2d05 552
mluis 13:618826a997e2 553 /*!
mluis 13:618826a997e2 554 * @brief DIO 3 IRQ callback
mluis 13:618826a997e2 555 */
mluis 13:618826a997e2 556 virtual void OnDio3Irq( void );
GregCr 0:e6ceb13d2d05 557
mluis 13:618826a997e2 558 /*!
mluis 13:618826a997e2 559 * @brief DIO 4 IRQ callback
mluis 13:618826a997e2 560 */
mluis 13:618826a997e2 561 virtual void OnDio4Irq( void );
GregCr 0:e6ceb13d2d05 562
mluis 13:618826a997e2 563 /*!
mluis 13:618826a997e2 564 * @brief DIO 5 IRQ callback
mluis 13:618826a997e2 565 */
mluis 13:618826a997e2 566 virtual void OnDio5Irq( void );
GregCr 0:e6ceb13d2d05 567
mluis 13:618826a997e2 568 /*!
mluis 13:618826a997e2 569 * @brief Tx & Rx timeout timer callback
mluis 13:618826a997e2 570 */
mluis 13:618826a997e2 571 virtual void OnTimeoutIrq( void );
mluis 25:3778e6204cc1 572
mluis 13:618826a997e2 573 /*!
mluis 13:618826a997e2 574 * Returns the known FSK bandwidth registers value
mluis 13:618826a997e2 575 *
mluis 13:618826a997e2 576 * \param [IN] bandwidth Bandwidth value in Hz
mluis 13:618826a997e2 577 * \retval regValue Bandwidth register value.
mluis 13:618826a997e2 578 */
mluis 13:618826a997e2 579 static uint8_t GetFskBandwidthRegValue( uint32_t bandwidth );
GregCr 0:e6ceb13d2d05 580 };
GregCr 0:e6ceb13d2d05 581
mluis 22:7f3aab69cca9 582 #endif // __SX1276_H__