Based on SX1276Lib. Simplified and targeted for Modtronix inAir modules. All pins can now be specified to use interrupts or general purpose I/O pins.

Committer:
modtronix-com
Date:
Fri Aug 19 15:50:18 2016 +1000
Revision:
10:0bf8f2dbefb7
Parent:
9:9a77e2c7c5e8
Added tag v1.1 for changeset 9a77e2c7c5e8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
modtronix 1:64a9c4a03244 1 /*
modtronix 1:64a9c4a03244 2 / _____) _ | |
modtronix 1:64a9c4a03244 3 ( (____ _____ ____ _| |_ _____ ____| |__
modtronix 1:64a9c4a03244 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
modtronix 1:64a9c4a03244 5 _____) ) ____| | | || |_| ____( (___| | | |
modtronix 1:64a9c4a03244 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
modtronix 1:64a9c4a03244 7 ( C )2014 Semtech
modtronix 1:64a9c4a03244 8
modtronix 1:64a9c4a03244 9 Description: Actual implementation of a inAir(SX1276) radio, inherits Radio
modtronix 1:64a9c4a03244 10
modtronix 1:64a9c4a03244 11 License: Revised BSD License, see LICENSE.TXT file include in the project
modtronix 1:64a9c4a03244 12
modtronix 1:64a9c4a03244 13 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
modtronix 1:64a9c4a03244 14 */
modtronix 1:64a9c4a03244 15 #ifndef __SX1276_H__
modtronix 1:64a9c4a03244 16 #define __SX1276_H__
modtronix 1:64a9c4a03244 17
modtronix-com 9:9a77e2c7c5e8 18 #include "inair_default_config.h"
modtronix 1:64a9c4a03244 19 #include "radio.h"
modtronix 1:64a9c4a03244 20 #include "sx1276Regs-Fsk.h"
modtronix 1:64a9c4a03244 21 #include "sx1276Regs-LoRa.h"
modtronix 1:64a9c4a03244 22
modtronix-com 6:d542b5a44d5a 23 #define LORA_BW_7800 0 //7.8kHz
modtronix-com 6:d542b5a44d5a 24 #define LORA_BW_10400 1 //10.4kHz
modtronix-com 6:d542b5a44d5a 25 #define LORA_BW_15600 2 //15.6kHz
modtronix-com 6:d542b5a44d5a 26 #define LORA_BW_20800 3 //20.8kHz
modtronix-com 6:d542b5a44d5a 27 #define LORA_BW_31250 4 //31.25kHz
modtronix-com 6:d542b5a44d5a 28 #define LORA_BW_41700 5 //41.7kHz
modtronix-com 6:d542b5a44d5a 29 #define LORA_BW_62500 6 //62.5kHz
modtronix-com 6:d542b5a44d5a 30 #define LORA_BW_125000 7 //125kHz
modtronix-com 6:d542b5a44d5a 31 #define LORA_BW_250000 8 //250kHz
modtronix-com 6:d542b5a44d5a 32 #define LORA_BW_500000 9 //500kHz
modtronix-com 6:d542b5a44d5a 33
modtronix 1:64a9c4a03244 34 /*!
modtronix 1:64a9c4a03244 35 * Radio wakeup time from SLEEP mode
modtronix 1:64a9c4a03244 36 */
modtronix 1:64a9c4a03244 37 #define RADIO_WAKEUP_TIME 1000 // [us]
modtronix 1:64a9c4a03244 38
modtronix 1:64a9c4a03244 39 /*!
modtronix 1:64a9c4a03244 40 * InAir definitions
modtronix 1:64a9c4a03244 41 */
modtronix 1:64a9c4a03244 42 #define XTAL_FREQ 32000000
modtronix 1:64a9c4a03244 43 #define FREQ_STEP 61.03515625
modtronix 1:64a9c4a03244 44
modtronix 1:64a9c4a03244 45 #define RX_BUFFER_SIZE 256
modtronix 1:64a9c4a03244 46
modtronix 1:64a9c4a03244 47 #define DEFAULT_TIMEOUT 200 //usec
modtronix 1:64a9c4a03244 48 #define RSSI_OFFSET -139.0
modtronix 1:64a9c4a03244 49
modtronix 1:64a9c4a03244 50
modtronix 1:64a9c4a03244 51 /*!
modtronix 1:64a9c4a03244 52 * Constant values need to compute the RSSI value
modtronix 1:64a9c4a03244 53 */
modtronix 1:64a9c4a03244 54 #define RSSI_OFFSET_LF -164.0
modtronix 1:64a9c4a03244 55 #define RSSI_OFFSET_HF -157.0
modtronix 1:64a9c4a03244 56
modtronix 1:64a9c4a03244 57 #define RF_MID_BAND_THRESH 525000000
modtronix 1:64a9c4a03244 58
modtronix 1:64a9c4a03244 59 /*!
modtronix 1:64a9c4a03244 60 * FSK bandwidth definition
modtronix 1:64a9c4a03244 61 */
modtronix 1:64a9c4a03244 62 typedef struct
modtronix 1:64a9c4a03244 63 {
modtronix 1:64a9c4a03244 64 uint32_t bandwidth;
modtronix 1:64a9c4a03244 65 uint8_t RegValue;
modtronix 1:64a9c4a03244 66 } FskBandwidth_t;
modtronix 1:64a9c4a03244 67
modtronix 1:64a9c4a03244 68 /*!
modtronix 1:64a9c4a03244 69 * Radio registers definition
modtronix 1:64a9c4a03244 70 */
modtronix 1:64a9c4a03244 71 typedef struct
modtronix 1:64a9c4a03244 72 {
modtronix 1:64a9c4a03244 73 ModemType Modem;
modtronix 1:64a9c4a03244 74 uint8_t Addr;
modtronix 1:64a9c4a03244 75 uint8_t Value;
modtronix 1:64a9c4a03244 76 } RadioRegisters_t;
modtronix 1:64a9c4a03244 77
modtronix 1:64a9c4a03244 78 /*!
modtronix 1:64a9c4a03244 79 * Actual implementation of a InAir radio, inherits Radio
modtronix 1:64a9c4a03244 80 */
modtronix 1:64a9c4a03244 81 class InAir : public Radio
modtronix 1:64a9c4a03244 82 {
modtronix 1:64a9c4a03244 83 protected:
modtronix 1:64a9c4a03244 84 /*!
modtronix 1:64a9c4a03244 85 * SPI Interface
modtronix 1:64a9c4a03244 86 */
modtronix 1:64a9c4a03244 87 SPI spi; // mosi, miso, sclk
modtronix 1:64a9c4a03244 88 DigitalOut nss;
modtronix 1:64a9c4a03244 89
modtronix 1:64a9c4a03244 90 /*!
modtronix 1:64a9c4a03244 91 * InAir Reset pin
modtronix 1:64a9c4a03244 92 */
modtronix 1:64a9c4a03244 93 DigitalInOut reset;
modtronix 1:64a9c4a03244 94
modtronix 1:64a9c4a03244 95 /*!
modtronix 1:64a9c4a03244 96 * InAir DIO pins
modtronix 1:64a9c4a03244 97 */
modtronix 1:64a9c4a03244 98 #if(INAIR_DIO0_IS_INTERRUPT==1)
modtronix 1:64a9c4a03244 99 InterruptIn dio0;
modtronix 1:64a9c4a03244 100 #else
modtronix 1:64a9c4a03244 101 DigitalIn dio0;
modtronix 1:64a9c4a03244 102 #endif
modtronix 1:64a9c4a03244 103
modtronix 1:64a9c4a03244 104
modtronix 1:64a9c4a03244 105 #if(INAIR_DIO1_IS_INTERRUPT==1)
modtronix 1:64a9c4a03244 106 InterruptIn dio1;
modtronix 1:64a9c4a03244 107 #else
modtronix 1:64a9c4a03244 108 DigitalIn dio1;
modtronix 1:64a9c4a03244 109 #endif
modtronix 1:64a9c4a03244 110
modtronix 1:64a9c4a03244 111 #if(INAIR_DIO2_IS_INTERRUPT==1)
modtronix 1:64a9c4a03244 112 InterruptIn dio2;
modtronix 1:64a9c4a03244 113 #else
modtronix 1:64a9c4a03244 114 DigitalIn dio2;
modtronix 1:64a9c4a03244 115 #endif
modtronix 1:64a9c4a03244 116
modtronix 1:64a9c4a03244 117
modtronix 1:64a9c4a03244 118 #if(INAIR_DIO3_IS_INTERRUPT==1)
modtronix 1:64a9c4a03244 119 InterruptIn dio3;
modtronix 1:64a9c4a03244 120 #else
modtronix 1:64a9c4a03244 121 DigitalIn dio3;
modtronix 1:64a9c4a03244 122 #endif
modtronix 1:64a9c4a03244 123
modtronix 1:64a9c4a03244 124 bool isRadioActive;
modtronix 1:64a9c4a03244 125
modtronix 1:64a9c4a03244 126 uint8_t boardConnected; //0 = BOARD_INAIR4; 1 = BOARD_INAIR9, 2 = BOARD_INAIR9B
modtronix 1:64a9c4a03244 127
modtronix 1:64a9c4a03244 128 uint8_t *rxBuffer;
modtronix 1:64a9c4a03244 129
modtronix 1:64a9c4a03244 130 uint8_t previousOpMode;
modtronix 1:64a9c4a03244 131
modtronix 1:64a9c4a03244 132 /*!
modtronix 1:64a9c4a03244 133 * Tx and Rx timers
modtronix 1:64a9c4a03244 134 */
modtronix 1:64a9c4a03244 135 Timeout txTimeoutTimer;
modtronix 1:64a9c4a03244 136 Timeout rxTimeoutTimer;
modtronix 1:64a9c4a03244 137 Timeout rxTimeoutSyncWord;
modtronix 1:64a9c4a03244 138
modtronix 1:64a9c4a03244 139 /*!
modtronix 1:64a9c4a03244 140 * rxTx: [1: Tx, 0: Rx]
modtronix 1:64a9c4a03244 141 */
modtronix 1:64a9c4a03244 142 uint8_t rxTx;
modtronix 1:64a9c4a03244 143
modtronix 1:64a9c4a03244 144 RadioSettings_t settings;
modtronix 1:64a9c4a03244 145
modtronix 1:64a9c4a03244 146 static const FskBandwidth_t FskBandwidths[] ;
modtronix 1:64a9c4a03244 147 protected:
modtronix 1:64a9c4a03244 148
modtronix 1:64a9c4a03244 149 /*!
modtronix 1:64a9c4a03244 150 * Performs the Rx chain calibration for LF and HF bands
modtronix 1:64a9c4a03244 151 * \remark Must be called just after the reset so all registers are at their
modtronix 1:64a9c4a03244 152 * default values
modtronix 1:64a9c4a03244 153 */
modtronix 1:64a9c4a03244 154 void RxChainCalibration( void );
modtronix 1:64a9c4a03244 155
modtronix 1:64a9c4a03244 156 public:
modtronix 1:64a9c4a03244 157 InAir( void ( *txDone )( ), void ( *txTimeout ) ( ), void ( *rxDone ) ( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ),
modtronix 1:64a9c4a03244 158 void ( *rxTimeout ) ( ), void ( *rxError ) ( ), void ( *fhssChangeChannel ) ( uint8_t channelIndex ), void ( *cadDone ) ( bool channelActivityDetected ),
modtronix 1:64a9c4a03244 159 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
modtronix 1:64a9c4a03244 160 PinName dio0, PinName dio1, PinName dio2, PinName dio3);
modtronix 1:64a9c4a03244 161 virtual ~InAir( );
modtronix 1:64a9c4a03244 162
modtronix 1:64a9c4a03244 163
modtronix 1:64a9c4a03244 164 /*!
modtronix 1:64a9c4a03244 165 * Service fuction, call repeatedly
modtronix 1:64a9c4a03244 166 */
modtronix 1:64a9c4a03244 167 virtual void task(void);
modtronix 1:64a9c4a03244 168
modtronix 1:64a9c4a03244 169 //-------------------------------------------------------------------------
modtronix 1:64a9c4a03244 170 // Redefined Radio functions
modtronix 1:64a9c4a03244 171 //-------------------------------------------------------------------------
modtronix 1:64a9c4a03244 172
modtronix 1:64a9c4a03244 173 /*!
modtronix 1:64a9c4a03244 174 * Return board type
modtronix 1:64a9c4a03244 175 *
modtronix 1:64a9c4a03244 176 * @return @return Returns a BOARD_XXX define
modtronix 1:64a9c4a03244 177 */
modtronix 1:64a9c4a03244 178 virtual uint8_t GetBoardType( void );
modtronix 1:64a9c4a03244 179
modtronix 1:64a9c4a03244 180
modtronix 1:64a9c4a03244 181 /*!
modtronix 1:64a9c4a03244 182 * Sets the board type, is a BOARD_XXX define
modtronix 1:64a9c4a03244 183 *
modtronix 1:64a9c4a03244 184 * @param boardType The board type, is a BOARD_XXX define
modtronix 1:64a9c4a03244 185 */
modtronix 1:64a9c4a03244 186 virtual void SetBoardType( uint8_t boardType);
modtronix 1:64a9c4a03244 187
modtronix 1:64a9c4a03244 188 /*!
modtronix 1:64a9c4a03244 189 * Return current radio status
modtronix 1:64a9c4a03244 190 *
modtronix 1:64a9c4a03244 191 * @param status Radio status. [IDLE, RX_RUNNING, TX_RUNNING]
modtronix 1:64a9c4a03244 192 */
modtronix-com 2:93cf5cb235ee 193 virtual RadioState GetStatus( void );
modtronix 1:64a9c4a03244 194
modtronix 1:64a9c4a03244 195 /*!
modtronix 1:64a9c4a03244 196 * @brief Configures the InAir with the given modem
modtronix 1:64a9c4a03244 197 *
modtronix 1:64a9c4a03244 198 * @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
modtronix 1:64a9c4a03244 199 */
modtronix 1:64a9c4a03244 200 virtual void SetModem( ModemType modem );
modtronix 1:64a9c4a03244 201
modtronix 1:64a9c4a03244 202 /*!
modtronix 1:64a9c4a03244 203 * @brief Sets the channel frequency
modtronix 1:64a9c4a03244 204 *
modtronix 1:64a9c4a03244 205 * @param [IN] freq Channel RF frequency
modtronix 1:64a9c4a03244 206 */
modtronix 1:64a9c4a03244 207 virtual void SetChannel( uint32_t freq );
modtronix 1:64a9c4a03244 208
modtronix 1:64a9c4a03244 209 /*!
modtronix 1:64a9c4a03244 210 * @brief Sets the channels configuration
modtronix 1:64a9c4a03244 211 *
modtronix 1:64a9c4a03244 212 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
modtronix 1:64a9c4a03244 213 * @param [IN] freq Channel RF frequency
modtronix 1:64a9c4a03244 214 * @param [IN] rssiThresh RSSI threshold
modtronix 1:64a9c4a03244 215 *
modtronix 1:64a9c4a03244 216 * @retval isFree [true: Channel is free, false: Channel is not free]
modtronix 1:64a9c4a03244 217 */
modtronix 1:64a9c4a03244 218 virtual bool IsChannelFree( ModemType modem, uint32_t freq, int8_t rssiThresh );
modtronix 1:64a9c4a03244 219
modtronix 1:64a9c4a03244 220 /*!
modtronix 1:64a9c4a03244 221 * @brief Generates a 32 bits random value based on the RSSI readings
modtronix 1:64a9c4a03244 222 *
modtronix 1:64a9c4a03244 223 * \remark This function sets the radio in LoRa modem mode and disables
modtronix 1:64a9c4a03244 224 * all interrupts.
modtronix 1:64a9c4a03244 225 * After calling this function either Radio.SetRxConfig or
modtronix 1:64a9c4a03244 226 * Radio.SetTxConfig functions must be called.
modtronix 1:64a9c4a03244 227 *
modtronix 1:64a9c4a03244 228 * @retval randomValue 32 bits random value
modtronix 1:64a9c4a03244 229 */
modtronix 1:64a9c4a03244 230 virtual uint32_t Random( void );
modtronix 1:64a9c4a03244 231
modtronix 1:64a9c4a03244 232 /*!
modtronix 1:64a9c4a03244 233 * @brief Sets the reception parameters
modtronix 1:64a9c4a03244 234 *
modtronix 1:64a9c4a03244 235 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
modtronix 1:64a9c4a03244 236 * @param [IN] bandwidth Sets the bandwidth
modtronix 1:64a9c4a03244 237 * FSK : >= 2600 and <= 250000 Hz
modtronix 1:64a9c4a03244 238 * LoRa: [0: 7.8 kHz, 1: 10.4 kHz, 2: 15.6kHz, 3: 20.8kHz
modtronix 1:64a9c4a03244 239 * 4: 31.25kHz, 5: 41.7 kHz, 6: 62.5 kHz,
modtronix 1:64a9c4a03244 240 * 7: 125 kHz, 8: 250 kHz, 9: 500 kHz]
modtronix 1:64a9c4a03244 241 * @param [IN] datarate Sets the Datarate
modtronix 1:64a9c4a03244 242 * FSK : 600..300000 bits/s
modtronix 1:64a9c4a03244 243 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
modtronix 1:64a9c4a03244 244 * 10: 1024, 11: 2048, 12: 4096 chips]
modtronix 1:64a9c4a03244 245 * @param [IN] coderate Sets the coding rate ( LoRa only )
modtronix 1:64a9c4a03244 246 * FSK : N/A ( set to 0 )
modtronix 1:64a9c4a03244 247 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
modtronix 1:64a9c4a03244 248 * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only )
modtronix 1:64a9c4a03244 249 * FSK : >= 2600 and <= 250000 Hz
modtronix 1:64a9c4a03244 250 * LoRa: N/A ( set to 0 )
modtronix 1:64a9c4a03244 251 * @param [IN] preambleLen Sets the Preamble length ( LoRa only )
modtronix 1:64a9c4a03244 252 * FSK : N/A ( set to 0 )
modtronix 1:64a9c4a03244 253 * LoRa: Length in symbols ( the hardware adds 4 more symbols )
modtronix 1:64a9c4a03244 254 * @param [IN] symbTimeout Sets the RxSingle timeout value ( LoRa only )
modtronix 1:64a9c4a03244 255 * FSK : N/A ( set to 0 )
modtronix 1:64a9c4a03244 256 * LoRa: timeout in symbols
modtronix 1:64a9c4a03244 257 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
modtronix 1:64a9c4a03244 258 * @param [IN] payloadLen Sets payload length when fixed lenght is used
modtronix 1:64a9c4a03244 259 * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON]
modtronix 1:64a9c4a03244 260 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
modtronix 1:64a9c4a03244 261 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
modtronix 1:64a9c4a03244 262 * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
modtronix 1:64a9c4a03244 263 * FSK : N/A ( set to 0 )
modtronix 1:64a9c4a03244 264 * LoRa: [0: not inverted, 1: inverted]
modtronix 1:64a9c4a03244 265 * @param [IN] rxContinuous Sets the reception in continuous mode
modtronix 1:64a9c4a03244 266 * [false: single mode, true: continuous mode]
modtronix 1:64a9c4a03244 267 */
modtronix 1:64a9c4a03244 268 virtual void SetRxConfig ( ModemType modem, uint32_t bandwidth,
modtronix 1:64a9c4a03244 269 uint32_t datarate, uint8_t coderate,
modtronix 1:64a9c4a03244 270 uint32_t bandwidthAfc, uint16_t preambleLen,
modtronix 1:64a9c4a03244 271 uint16_t symbTimeout, bool fixLen,
modtronix 1:64a9c4a03244 272 uint8_t payloadLen,
modtronix 1:64a9c4a03244 273 bool crcOn, bool freqHopOn, uint8_t hopPeriod,
modtronix 1:64a9c4a03244 274 bool iqInverted, bool rxContinuous );
modtronix 1:64a9c4a03244 275
modtronix 1:64a9c4a03244 276 /*!
modtronix 1:64a9c4a03244 277 * @brief Sets the transmission parameters
modtronix 1:64a9c4a03244 278 *
modtronix 1:64a9c4a03244 279 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
modtronix 1:64a9c4a03244 280 * @param [IN] power Sets the output power [dBm]
modtronix 1:64a9c4a03244 281 * @param [IN] fdev Sets the frequency deviation ( FSK only )
modtronix 1:64a9c4a03244 282 * FSK : [Hz]
modtronix 1:64a9c4a03244 283 * LoRa: 0
modtronix 1:64a9c4a03244 284 * @param [IN] bandwidth Sets the bandwidth ( LoRa only )
modtronix 1:64a9c4a03244 285 * FSK : 0
modtronix 1:64a9c4a03244 286 * LoRa: [0: 125 kHz, 1: 250 kHz,
modtronix 1:64a9c4a03244 287 * 2: 500 kHz, 3: Reserved]
modtronix 1:64a9c4a03244 288 * @param [IN] datarate Sets the Datarate
modtronix 1:64a9c4a03244 289 * FSK : 600..300000 bits/s
modtronix 1:64a9c4a03244 290 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
modtronix 1:64a9c4a03244 291 * 10: 1024, 11: 2048, 12: 4096 chips]
modtronix 1:64a9c4a03244 292 * @param [IN] coderate Sets the coding rate ( LoRa only )
modtronix 1:64a9c4a03244 293 * FSK : N/A ( set to 0 )
modtronix 1:64a9c4a03244 294 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
modtronix 1:64a9c4a03244 295 * @param [IN] preambleLen Sets the preamble length
modtronix 1:64a9c4a03244 296 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
modtronix 1:64a9c4a03244 297 * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON]
modtronix 1:64a9c4a03244 298 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
modtronix 1:64a9c4a03244 299 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
modtronix 1:64a9c4a03244 300 * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
modtronix 1:64a9c4a03244 301 * FSK : N/A ( set to 0 )
modtronix 1:64a9c4a03244 302 * LoRa: [0: not inverted, 1: inverted]
modtronix 1:64a9c4a03244 303 * @param [IN] timeout Transmission timeout [us]
modtronix 1:64a9c4a03244 304 */
modtronix 1:64a9c4a03244 305 virtual void SetTxConfig( ModemType modem, int8_t power, uint32_t fdev,
modtronix 1:64a9c4a03244 306 uint32_t bandwidth, uint32_t datarate,
modtronix 1:64a9c4a03244 307 uint8_t coderate, uint16_t preambleLen,
modtronix 1:64a9c4a03244 308 bool fixLen, bool crcOn, bool freqHopOn,
modtronix 1:64a9c4a03244 309 uint8_t hopPeriod, bool iqInverted, uint32_t timeout );
modtronix 1:64a9c4a03244 310
modtronix 1:64a9c4a03244 311 /*!
modtronix 1:64a9c4a03244 312 * @brief Computes the packet time on air for the given payload
modtronix 1:64a9c4a03244 313 *
modtronix 1:64a9c4a03244 314 * \Remark Can only be called once SetRxConfig or SetTxConfig have been called
modtronix 1:64a9c4a03244 315 *
modtronix 1:64a9c4a03244 316 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
modtronix 1:64a9c4a03244 317 * @param [IN] pktLen Packet payload length
modtronix 1:64a9c4a03244 318 *
modtronix 1:64a9c4a03244 319 * @retval airTime Computed airTime for the given packet payload length
modtronix 1:64a9c4a03244 320 */
modtronix 1:64a9c4a03244 321 virtual double TimeOnAir ( ModemType modem, uint8_t pktLen );
modtronix 1:64a9c4a03244 322
modtronix 1:64a9c4a03244 323 /*!
modtronix 1:64a9c4a03244 324 * @brief Sends the buffer of size. Prepares the packet to be sent and sets
modtronix 1:64a9c4a03244 325 * the radio in transmission
modtronix 1:64a9c4a03244 326 *
modtronix 1:64a9c4a03244 327 * @param [IN]: buffer Buffer pointer
modtronix 1:64a9c4a03244 328 * @param [IN]: size Buffer size
modtronix 1:64a9c4a03244 329 */
modtronix 1:64a9c4a03244 330 virtual void Send( uint8_t *buffer, uint8_t size );
modtronix 1:64a9c4a03244 331
modtronix 1:64a9c4a03244 332 /*!
modtronix 1:64a9c4a03244 333 * @brief Sets the radio in sleep mode
modtronix 1:64a9c4a03244 334 */
modtronix 1:64a9c4a03244 335 virtual void Sleep( void );
modtronix 1:64a9c4a03244 336
modtronix 1:64a9c4a03244 337 /*!
modtronix 1:64a9c4a03244 338 * @brief Sets the radio in standby mode
modtronix 1:64a9c4a03244 339 */
modtronix 1:64a9c4a03244 340 virtual void Standby( void );
modtronix 1:64a9c4a03244 341
modtronix 1:64a9c4a03244 342 /*!
modtronix 1:64a9c4a03244 343 * @brief Sets the radio in reception mode for the given time
modtronix 1:64a9c4a03244 344 * @param [IN] timeout Reception timeout [us]
modtronix 1:64a9c4a03244 345 * [0: continuous, others timeout]
modtronix 1:64a9c4a03244 346 */
modtronix 1:64a9c4a03244 347 virtual void Rx( uint32_t timeout );
modtronix 1:64a9c4a03244 348
modtronix 1:64a9c4a03244 349 /*!
modtronix 1:64a9c4a03244 350 * @brief Sets the radio in transmission mode for the given time
modtronix 1:64a9c4a03244 351 * @param [IN] timeout Transmission timeout [us]
modtronix 1:64a9c4a03244 352 * [0: continuous, others timeout]
modtronix 1:64a9c4a03244 353 */
modtronix 1:64a9c4a03244 354 virtual void Tx( uint32_t timeout );
modtronix 1:64a9c4a03244 355
modtronix 1:64a9c4a03244 356 /*!
modtronix 1:64a9c4a03244 357 * @brief Start a Channel Activity Detection
modtronix 1:64a9c4a03244 358 */
modtronix 1:64a9c4a03244 359 virtual void StartCad( void );
modtronix 1:64a9c4a03244 360
modtronix 1:64a9c4a03244 361 /*!
modtronix 1:64a9c4a03244 362 * @brief Reads the current RSSI value
modtronix 1:64a9c4a03244 363 *
modtronix 1:64a9c4a03244 364 * @retval rssiValue Current RSSI value in [dBm]
modtronix 1:64a9c4a03244 365 */
modtronix 1:64a9c4a03244 366 virtual int16_t GetRssi ( ModemType modem );
modtronix 1:64a9c4a03244 367
modtronix 1:64a9c4a03244 368 /*!
modtronix 1:64a9c4a03244 369 * @brief Writes the radio register at the specified address
modtronix 1:64a9c4a03244 370 *
modtronix 1:64a9c4a03244 371 * @param [IN]: addr Register address
modtronix 1:64a9c4a03244 372 * @param [IN]: data New register value
modtronix 1:64a9c4a03244 373 */
modtronix 1:64a9c4a03244 374 virtual void Write ( uint8_t addr, uint8_t data );
modtronix 1:64a9c4a03244 375
modtronix 1:64a9c4a03244 376 /*!
modtronix 1:64a9c4a03244 377 * @brief Reads the radio register at the specified address
modtronix 1:64a9c4a03244 378 *
modtronix 1:64a9c4a03244 379 * @param [IN]: addr Register address
modtronix 1:64a9c4a03244 380 * @retval data Register value
modtronix 1:64a9c4a03244 381 */
modtronix 1:64a9c4a03244 382 virtual uint8_t Read ( uint8_t addr );
modtronix 1:64a9c4a03244 383
modtronix 1:64a9c4a03244 384 /*!
modtronix 1:64a9c4a03244 385 * @brief Writes multiple radio registers starting at address
modtronix 1:64a9c4a03244 386 *
modtronix 1:64a9c4a03244 387 * @param [IN] addr First Radio register address
modtronix 1:64a9c4a03244 388 * @param [IN] buffer Buffer containing the new register's values
modtronix 1:64a9c4a03244 389 * @param [IN] size Number of registers to be written
modtronix 1:64a9c4a03244 390 */
modtronix 1:64a9c4a03244 391 virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size );
modtronix 1:64a9c4a03244 392
modtronix 1:64a9c4a03244 393 /*!
modtronix 1:64a9c4a03244 394 * @brief Reads multiple radio registers starting at address
modtronix 1:64a9c4a03244 395 *
modtronix 1:64a9c4a03244 396 * @param [IN] addr First Radio register address
modtronix 1:64a9c4a03244 397 * @param [OUT] buffer Buffer where to copy the registers data
modtronix 1:64a9c4a03244 398 * @param [IN] size Number of registers to be read
modtronix 1:64a9c4a03244 399 */
modtronix 1:64a9c4a03244 400 virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size );
modtronix 1:64a9c4a03244 401
modtronix 1:64a9c4a03244 402 /*!
modtronix 1:64a9c4a03244 403 * @brief Writes the buffer contents to the InAir FIFO
modtronix 1:64a9c4a03244 404 *
modtronix 1:64a9c4a03244 405 * @param [IN] buffer Buffer containing data to be put on the FIFO.
modtronix 1:64a9c4a03244 406 * @param [IN] size Number of bytes to be written to the FIFO
modtronix 1:64a9c4a03244 407 */
modtronix 1:64a9c4a03244 408 virtual void WriteFifo( uint8_t *buffer, uint8_t size );
modtronix 1:64a9c4a03244 409
modtronix 1:64a9c4a03244 410 /*!
modtronix 1:64a9c4a03244 411 * @brief Reads the contents of the InAir FIFO
modtronix 1:64a9c4a03244 412 *
modtronix 1:64a9c4a03244 413 * @param [OUT] buffer Buffer where to copy the FIFO read data.
modtronix 1:64a9c4a03244 414 * @param [IN] size Number of bytes to be read from the FIFO
modtronix 1:64a9c4a03244 415 */
modtronix 1:64a9c4a03244 416 virtual void ReadFifo( uint8_t *buffer, uint8_t size );
modtronix 1:64a9c4a03244 417
modtronix 1:64a9c4a03244 418 /*!
modtronix 1:64a9c4a03244 419 * @brief Resets the InAir
modtronix 1:64a9c4a03244 420 */
modtronix 1:64a9c4a03244 421 virtual void Reset( void );
modtronix 1:64a9c4a03244 422
modtronix 1:64a9c4a03244 423 //-------------------------------------------------------------------------
modtronix 1:64a9c4a03244 424 // Board relative functions
modtronix 1:64a9c4a03244 425 //-------------------------------------------------------------------------
modtronix 1:64a9c4a03244 426
modtronix 1:64a9c4a03244 427 protected:
modtronix 1:64a9c4a03244 428 /*!
modtronix 1:64a9c4a03244 429 * @brief Initializes the radio I/Os pins interface
modtronix 1:64a9c4a03244 430 */
modtronix 1:64a9c4a03244 431 virtual void IoInit( void );
modtronix 1:64a9c4a03244 432
modtronix 1:64a9c4a03244 433 /*!
modtronix 1:64a9c4a03244 434 * @brief Initializes the radio registers
modtronix 1:64a9c4a03244 435 */
modtronix 1:64a9c4a03244 436 virtual void RadioRegistersInit( );
modtronix 1:64a9c4a03244 437
modtronix 1:64a9c4a03244 438 /*!
modtronix 1:64a9c4a03244 439 * @brief Initializes the radio SPI
modtronix 1:64a9c4a03244 440 */
modtronix 1:64a9c4a03244 441 virtual void SpiInit( void );
modtronix 1:64a9c4a03244 442
modtronix 1:64a9c4a03244 443 /*!
modtronix 1:64a9c4a03244 444 * @brief Initializes DIO IRQ handlers
modtronix 1:64a9c4a03244 445 */
modtronix 1:64a9c4a03244 446 virtual void IoIrqInit();
modtronix 1:64a9c4a03244 447
modtronix 1:64a9c4a03244 448 /*!
modtronix 1:64a9c4a03244 449 * @brief De-initializes the radio I/Os pins interface.
modtronix 1:64a9c4a03244 450 *
modtronix 1:64a9c4a03244 451 * \remark Useful when going in MCU lowpower modes
modtronix 1:64a9c4a03244 452 */
modtronix 1:64a9c4a03244 453 virtual void IoDeInit( void );
modtronix 1:64a9c4a03244 454
modtronix 1:64a9c4a03244 455 /*!
modtronix 1:64a9c4a03244 456 * @brief Gets the board PA selection configuration
modtronix 1:64a9c4a03244 457 *
modtronix 1:64a9c4a03244 458 * @param [IN] channel Channel frequency in Hz
modtronix 1:64a9c4a03244 459 * @retval PaSelect RegPaConfig PaSelect value
modtronix 1:64a9c4a03244 460 */
modtronix 1:64a9c4a03244 461 virtual uint8_t GetPaSelect( uint32_t channel );
modtronix 1:64a9c4a03244 462
modtronix 1:64a9c4a03244 463 /*!
modtronix 1:64a9c4a03244 464 * @brief Checks if the given RF frequency is supported by the hardware
modtronix 1:64a9c4a03244 465 *
modtronix 1:64a9c4a03244 466 * @param [IN] frequency RF frequency to be checked
modtronix 1:64a9c4a03244 467 * @retval isSupported [true: supported, false: unsupported]
modtronix 1:64a9c4a03244 468 */
modtronix 1:64a9c4a03244 469 virtual bool CheckRfFrequency( uint32_t frequency );
modtronix 1:64a9c4a03244 470 protected:
modtronix 1:64a9c4a03244 471
modtronix 1:64a9c4a03244 472 /*!
modtronix 1:64a9c4a03244 473 * @brief Sets the InAir operating mode
modtronix 1:64a9c4a03244 474 *
modtronix 1:64a9c4a03244 475 * @param [IN] opMode New operating mode
modtronix 1:64a9c4a03244 476 */
modtronix 1:64a9c4a03244 477 virtual void SetOpMode( uint8_t opMode );
modtronix 1:64a9c4a03244 478
modtronix 1:64a9c4a03244 479 /*
modtronix 1:64a9c4a03244 480 * InAir DIO IRQ callback functions prototype
modtronix 1:64a9c4a03244 481 */
modtronix 1:64a9c4a03244 482
modtronix 1:64a9c4a03244 483 /*!
modtronix 1:64a9c4a03244 484 * @brief DIO 0 IRQ callback
modtronix 1:64a9c4a03244 485 */
modtronix 1:64a9c4a03244 486 virtual void OnDio0Irq( void );
modtronix 1:64a9c4a03244 487
modtronix 1:64a9c4a03244 488 /*!
modtronix 1:64a9c4a03244 489 * @brief DIO 1 IRQ callback
modtronix 1:64a9c4a03244 490 */
modtronix 1:64a9c4a03244 491 virtual void OnDio1Irq( void );
modtronix 1:64a9c4a03244 492
modtronix 1:64a9c4a03244 493 /*!
modtronix 1:64a9c4a03244 494 * @brief DIO 2 IRQ callback
modtronix 1:64a9c4a03244 495 */
modtronix 1:64a9c4a03244 496 virtual void OnDio2Irq( void );
modtronix 1:64a9c4a03244 497
modtronix 1:64a9c4a03244 498 /*!
modtronix 1:64a9c4a03244 499 * @brief DIO 3 IRQ callback
modtronix 1:64a9c4a03244 500 */
modtronix 1:64a9c4a03244 501 virtual void OnDio3Irq( void );
modtronix 1:64a9c4a03244 502
modtronix 1:64a9c4a03244 503 /*!
modtronix 1:64a9c4a03244 504 * @brief DIO 4 IRQ callback
modtronix 1:64a9c4a03244 505 */
modtronix 1:64a9c4a03244 506 //virtual void OnDio4Irq( void );
modtronix 1:64a9c4a03244 507
modtronix 1:64a9c4a03244 508 /*!
modtronix 1:64a9c4a03244 509 * @brief DIO 5 IRQ callback
modtronix 1:64a9c4a03244 510 */
modtronix 1:64a9c4a03244 511 //virtual void OnDio5Irq( void );
modtronix 1:64a9c4a03244 512
modtronix 1:64a9c4a03244 513 /*!
modtronix 1:64a9c4a03244 514 * @brief Tx & Rx timeout timer callback
modtronix 1:64a9c4a03244 515 */
modtronix 1:64a9c4a03244 516 virtual void OnTimeoutIrq( void );
modtronix 1:64a9c4a03244 517
modtronix 1:64a9c4a03244 518 /*!
modtronix 1:64a9c4a03244 519 * Returns the known FSK bandwidth registers value
modtronix 1:64a9c4a03244 520 *
modtronix 1:64a9c4a03244 521 * \param [IN] bandwidth Bandwidth value in Hz
modtronix 1:64a9c4a03244 522 * \retval regValue Bandwidth register value.
modtronix 1:64a9c4a03244 523 */
modtronix 1:64a9c4a03244 524 static uint8_t GetFskBandwidthRegValue( uint32_t bandwidth );
modtronix 1:64a9c4a03244 525 };
modtronix 1:64a9c4a03244 526
modtronix 1:64a9c4a03244 527 #endif //__SX1276_H__