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:
Mon Sep 07 08:08:51 2015 +1000
Revision:
2:93cf5cb235ee
Parent:
1:64a9c4a03244
Child:
6:d542b5a44d5a
Synch with original SX1276Lib - changed GetState() functions to GetStatus()

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