1

Committer:
floatlei
Date:
Sat Oct 08 02:35:14 2016 +0000
Revision:
0:7e14d7c443f1
11

Who changed what in which revision?

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