Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
sx1276.h
00001 /* 00002 / _____) _ | | 00003 ( (____ _____ ____ _| |_ _____ ____| |__ 00004 \____ \| ___ | (_ _) ___ |/ ___) _ \ 00005 _____) ) ____| | | || |_| ____( (___| | | | 00006 (______/|_____)_|_|_| \__)_____)\____)_| |_| 00007 (C) 2014 Semtech 00008 00009 Description: Actual implementation of a SX1276 radio, inherits Radio 00010 00011 License: Revised BSD License, see LICENSE.TXT file include in the project 00012 00013 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin 00014 */ 00015 #ifndef __SX1276_H__ 00016 #define __SX1276_H__ 00017 00018 #include "radio.h" 00019 #include "./registers/sx1276Regs-Fsk.h" 00020 #include "./registers/sx1276Regs-LoRa.h" 00021 #include "./typedefs/typedefs.h" 00022 00023 /*! 00024 * Radio wakeup time from SLEEP mode 00025 */ 00026 #define RADIO_WAKEUP_TIME 1000 // [us] 00027 00028 /*! 00029 * SX1276 definitions 00030 */ 00031 #define XTAL_FREQ 32000000 00032 #define FREQ_STEP 61.03515625 00033 00034 #define RX_BUFFER_SIZE 256 00035 00036 /*! 00037 * Constant values need to compute the RSSI value 00038 */ 00039 #define RSSI_OFFSET_LF -164.0 00040 #define RSSI_OFFSET_HF -157.0 00041 00042 #define RF_MID_BAND_THRESH 525000000 00043 00044 /*! 00045 * Actual implementation of a SX1276 radio, inherits Radio 00046 */ 00047 class SX1276 : public Radio 00048 { 00049 protected: 00050 /*! 00051 * SPI Interface 00052 */ 00053 SPI spi ; // mosi, miso, sclk 00054 DigitalOut nss; 00055 00056 /*! 00057 * SX1276 Reset pin 00058 */ 00059 DigitalInOut reset ; 00060 00061 /*! 00062 * SX1276 DIO pins 00063 */ 00064 InterruptIn dio0 ; 00065 InterruptIn dio1; 00066 InterruptIn dio2; 00067 InterruptIn dio3; 00068 InterruptIn dio4; 00069 DigitalIn dio5; 00070 00071 bool isRadioActive; 00072 00073 uint8_t boardConnected; //1 = SX1276MB1LAS; 0 = SX1276MB1MAS 00074 00075 uint8_t *rxBuffer; 00076 00077 uint8_t previousOpMode; 00078 00079 /*! 00080 * Hardware DIO IRQ functions 00081 */ 00082 DioIrqHandler *dioIrq ; 00083 00084 /*! 00085 * Tx and Rx timers 00086 */ 00087 Timeout txTimeoutTimer ; 00088 Timeout rxTimeoutTimer; 00089 Timeout rxTimeoutSyncWord; 00090 00091 /*! 00092 * rxTx: [1: Tx, 0: Rx] 00093 */ 00094 uint8_t rxTx ; 00095 00096 RadioSettings_t settings; 00097 00098 static const FskBandwidth_t FskBandwidths[] ; 00099 protected: 00100 00101 /*! 00102 * Performs the Rx chain calibration for LF and HF bands 00103 * \remark Must be called just after the reset so all registers are at their 00104 * default values 00105 */ 00106 void RxChainCalibration ( void ); 00107 00108 public: 00109 SX1276 ( RadioEvents_t *events, 00110 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset , 00111 PinName dio0 , PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 ); 00112 SX1276 ( RadioEvents_t *events ); 00113 virtual ~SX1276 ( ); 00114 00115 //------------------------------------------------------------------------- 00116 // Redefined Radio functions 00117 //------------------------------------------------------------------------- 00118 /*! 00119 * @brief Initializes the radio 00120 * 00121 * @param [IN] events Structure containing the driver callback functions 00122 */ 00123 virtual void Init( RadioEvents_t *events ); 00124 /*! 00125 * Return current radio status 00126 * 00127 * @param status Radio status. [RF_IDLE, RX_RUNNING, TX_RUNNING] 00128 */ 00129 virtual RadioState GetStatus ( void ); 00130 00131 /*! 00132 * @brief Configures the SX1276 with the given modem 00133 * 00134 * @param [IN] modem Modem to be used [0: FSK, 1: LoRa] 00135 */ 00136 virtual void SetModem( RadioModems_t modem ); 00137 00138 /*! 00139 * @brief Sets the channel frequency 00140 * 00141 * @param [IN] freq Channel RF frequency 00142 */ 00143 virtual void SetChannel( uint32_t freq ); 00144 00145 /*! 00146 * @brief Sets the channels configuration 00147 * 00148 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00149 * @param [IN] freq Channel RF frequency 00150 * @param [IN] rssiThresh RSSI threshold 00151 * 00152 * @retval isFree [true: Channel is free, false: Channel is not free] 00153 */ 00154 virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh ); 00155 00156 /*! 00157 * @brief Generates a 32 bits random value based on the RSSI readings 00158 * 00159 * \remark This function sets the radio in LoRa modem mode and disables 00160 * all interrupts. 00161 * After calling this function either Radio.SetRxConfig or 00162 * Radio.SetTxConfig functions must be called. 00163 * 00164 * @retval randomValue 32 bits random value 00165 */ 00166 virtual uint32_t Random( void ); 00167 00168 /*! 00169 * @brief Sets the reception parameters 00170 * 00171 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00172 * @param [IN] bandwidth Sets the bandwidth 00173 * FSK : >= 2600 and <= 250000 Hz 00174 * LoRa: [0: 125 kHz, 1: 250 kHz, 00175 * 2: 500 kHz, 3: Reserved] 00176 * @param [IN] datarate Sets the Datarate 00177 * FSK : 600..300000 bits/s 00178 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, 00179 * 10: 1024, 11: 2048, 12: 4096 chips] 00180 * @param [IN] coderate Sets the coding rate ( LoRa only ) 00181 * FSK : N/A ( set to 0 ) 00182 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] 00183 * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only ) 00184 * FSK : >= 2600 and <= 250000 Hz 00185 * LoRa: N/A ( set to 0 ) 00186 * @param [IN] preambleLen Sets the Preamble length ( LoRa only ) 00187 * FSK : N/A ( set to 0 ) 00188 * LoRa: Length in symbols ( the hardware adds 4 more symbols ) 00189 * @param [IN] symbTimeout Sets the RxSingle timeout value ( LoRa only ) 00190 * FSK : N/A ( set to 0 ) 00191 * LoRa: timeout in symbols 00192 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed] 00193 * @param [IN] payloadLen Sets payload length when fixed lenght is used 00194 * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] 00195 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only) 00196 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only) 00197 * @param [IN] iqInverted Inverts IQ signals ( LoRa only ) 00198 * FSK : N/A ( set to 0 ) 00199 * LoRa: [0: not inverted, 1: inverted] 00200 * @param [IN] rxContinuous Sets the reception in continuous mode 00201 * [false: single mode, true: continuous mode] 00202 */ 00203 virtual void SetRxConfig ( RadioModems_t modem, uint32_t bandwidth, 00204 uint32_t datarate, uint8_t coderate, 00205 uint32_t bandwidthAfc, uint16_t preambleLen, 00206 uint16_t symbTimeout, bool fixLen, 00207 uint8_t payloadLen, 00208 bool crcOn, bool freqHopOn, uint8_t hopPeriod, 00209 bool iqInverted, bool rxContinuous ); 00210 00211 /*! 00212 * @brief Sets the transmission parameters 00213 * 00214 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00215 * @param [IN] power Sets the output power [dBm] 00216 * @param [IN] fdev Sets the frequency deviation ( FSK only ) 00217 * FSK : [Hz] 00218 * LoRa: 0 00219 * @param [IN] bandwidth Sets the bandwidth ( LoRa only ) 00220 * FSK : 0 00221 * LoRa: [0: 125 kHz, 1: 250 kHz, 00222 * 2: 500 kHz, 3: Reserved] 00223 * @param [IN] datarate Sets the Datarate 00224 * FSK : 600..300000 bits/s 00225 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, 00226 * 10: 1024, 11: 2048, 12: 4096 chips] 00227 * @param [IN] coderate Sets the coding rate ( LoRa only ) 00228 * FSK : N/A ( set to 0 ) 00229 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] 00230 * @param [IN] preambleLen Sets the preamble length 00231 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed] 00232 * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] 00233 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only) 00234 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only) 00235 * @param [IN] iqInverted Inverts IQ signals ( LoRa only ) 00236 * FSK : N/A ( set to 0 ) 00237 * LoRa: [0: not inverted, 1: inverted] 00238 * @param [IN] timeout Transmission timeout [us] 00239 */ 00240 virtual void SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev, 00241 uint32_t bandwidth, uint32_t datarate, 00242 uint8_t coderate, uint16_t preambleLen, 00243 bool fixLen, bool crcOn, bool freqHopOn, 00244 uint8_t hopPeriod, bool iqInverted, uint32_t timeout ); 00245 00246 /*! 00247 * @brief Computes the packet time on air for the given payload 00248 * 00249 * \Remark Can only be called once SetRxConfig or SetTxConfig have been called 00250 * 00251 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00252 * @param [IN] pktLen Packet payload length 00253 * 00254 * @retval airTime Computed airTime for the given packet payload length 00255 */ 00256 virtual double TimeOnAir ( RadioModems_t modem, uint8_t pktLen ); 00257 00258 /*! 00259 * @brief Sends the buffer of size. Prepares the packet to be sent and sets 00260 * the radio in transmission 00261 * 00262 * @param [IN]: buffer Buffer pointer 00263 * @param [IN]: size Buffer size 00264 */ 00265 virtual void Send( uint8_t *buffer, uint8_t size ); 00266 00267 /*! 00268 * @brief Sets the radio in sleep mode 00269 */ 00270 virtual void Sleep( void ); 00271 00272 /*! 00273 * @brief Sets the radio in standby mode 00274 */ 00275 virtual void Standby( void ); 00276 00277 /*! 00278 * @brief Sets the radio in reception mode for the given time 00279 * @param [IN] timeout Reception timeout [us] 00280 * [0: continuous, others timeout] 00281 */ 00282 virtual void Rx( uint32_t timeout ); 00283 00284 /*! 00285 * @brief Sets the radio in transmission mode for the given time 00286 * @param [IN] timeout Transmission timeout [us] 00287 * [0: continuous, others timeout] 00288 */ 00289 virtual void Tx( uint32_t timeout ); 00290 00291 /*! 00292 * @brief Start a Channel Activity Detection 00293 */ 00294 virtual void StartCad( void ); 00295 00296 /*! 00297 * @brief Reads the current RSSI value 00298 * 00299 * @retval rssiValue Current RSSI value in [dBm] 00300 */ 00301 virtual int16_t GetRssi ( RadioModems_t modem ); 00302 00303 /*! 00304 * @brief Writes the radio register at the specified address 00305 * 00306 * @param [IN]: addr Register address 00307 * @param [IN]: data New register value 00308 */ 00309 virtual void Write ( uint8_t addr, uint8_t data ) = 0; 00310 00311 /*! 00312 * @brief Reads the radio register at the specified address 00313 * 00314 * @param [IN]: addr Register address 00315 * @retval data Register value 00316 */ 00317 virtual uint8_t Read ( uint8_t addr ) = 0; 00318 00319 /*! 00320 * @brief Writes multiple radio registers starting at address 00321 * 00322 * @param [IN] addr First Radio register address 00323 * @param [IN] buffer Buffer containing the new register's values 00324 * @param [IN] size Number of registers to be written 00325 */ 00326 virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0; 00327 00328 /*! 00329 * @brief Reads multiple radio registers starting at address 00330 * 00331 * @param [IN] addr First Radio register address 00332 * @param [OUT] buffer Buffer where to copy the registers data 00333 * @param [IN] size Number of registers to be read 00334 */ 00335 virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0; 00336 00337 /*! 00338 * @brief Writes the buffer contents to the SX1276 FIFO 00339 * 00340 * @param [IN] buffer Buffer containing data to be put on the FIFO. 00341 * @param [IN] size Number of bytes to be written to the FIFO 00342 */ 00343 virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0; 00344 00345 /*! 00346 * @brief Reads the contents of the SX1276 FIFO 00347 * 00348 * @param [OUT] buffer Buffer where to copy the FIFO read data. 00349 * @param [IN] size Number of bytes to be read from the FIFO 00350 */ 00351 virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0; 00352 /*! 00353 * @brief Resets the SX1276 00354 */ 00355 virtual void Reset( void ) = 0; 00356 00357 /*! 00358 * @brief Sets the maximum payload length. 00359 * 00360 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00361 * @param [IN] max Maximum payload length in bytes 00362 */ 00363 virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max ); 00364 00365 //------------------------------------------------------------------------- 00366 // Board relative functions 00367 //------------------------------------------------------------------------- 00368 00369 protected: 00370 /*! 00371 * @brief Initializes the radio I/Os pins interface 00372 */ 00373 virtual void IoInit( void ) = 0; 00374 00375 /*! 00376 * @brief Initializes the radio registers 00377 */ 00378 virtual void RadioRegistersInit( ) = 0; 00379 00380 /*! 00381 * @brief Initializes the radio SPI 00382 */ 00383 virtual void SpiInit( void ) = 0; 00384 00385 /*! 00386 * @brief Initializes DIO IRQ handlers 00387 * 00388 * @param [IN] irqHandlers Array containing the IRQ callback functions 00389 */ 00390 virtual void IoIrqInit( DioIrqHandler *irqHandlers ) = 0; 00391 00392 /*! 00393 * @brief De-initializes the radio I/Os pins interface. 00394 * 00395 * \remark Useful when going in MCU lowpower modes 00396 */ 00397 virtual void IoDeInit( void ) = 0; 00398 00399 /*! 00400 * @brief Gets the board PA selection configuration 00401 * 00402 * @param [IN] channel Channel frequency in Hz 00403 * @retval PaSelect RegPaConfig PaSelect value 00404 */ 00405 virtual uint8_t GetPaSelect( uint32_t channel ) = 0; 00406 00407 /*! 00408 * @brief Set the RF Switch I/Os pins in Low Power mode 00409 * 00410 * @param [IN] status enable or disable 00411 */ 00412 virtual void SetAntSwLowPower( bool status ) = 0; 00413 00414 /*! 00415 * @brief Initializes the RF Switch I/Os pins interface 00416 */ 00417 virtual void AntSwInit( void ) = 0; 00418 00419 /*! 00420 * @brief De-initializes the RF Switch I/Os pins interface 00421 * 00422 * \remark Needed to decrease the power consumption in MCU lowpower modes 00423 */ 00424 virtual void AntSwDeInit( void ) = 0; 00425 00426 /*! 00427 * @brief Controls the antena switch if necessary. 00428 * 00429 * \remark see errata note 00430 * 00431 * @param [IN] rxTx [1: Tx, 0: Rx] 00432 */ 00433 virtual void SetAntSw( uint8_t rxTx ) = 0; 00434 00435 /*! 00436 * @brief Checks if the given RF frequency is supported by the hardware 00437 * 00438 * @param [IN] frequency RF frequency to be checked 00439 * @retval isSupported [true: supported, false: unsupported] 00440 */ 00441 virtual bool CheckRfFrequency( uint32_t frequency ) = 0; 00442 protected: 00443 00444 /*! 00445 * @brief Sets the SX1276 operating mode 00446 * 00447 * @param [IN] opMode New operating mode 00448 */ 00449 virtual void SetOpMode( uint8_t opMode ); 00450 00451 /* 00452 * SX1276 DIO IRQ callback functions prototype 00453 */ 00454 00455 /*! 00456 * @brief DIO 0 IRQ callback 00457 */ 00458 virtual void OnDio0Irq( void ); 00459 00460 /*! 00461 * @brief DIO 1 IRQ callback 00462 */ 00463 virtual void OnDio1Irq( void ); 00464 00465 /*! 00466 * @brief DIO 2 IRQ callback 00467 */ 00468 virtual void OnDio2Irq( void ); 00469 00470 /*! 00471 * @brief DIO 3 IRQ callback 00472 */ 00473 virtual void OnDio3Irq( void ); 00474 00475 /*! 00476 * @brief DIO 4 IRQ callback 00477 */ 00478 virtual void OnDio4Irq( void ); 00479 00480 /*! 00481 * @brief DIO 5 IRQ callback 00482 */ 00483 virtual void OnDio5Irq( void ); 00484 00485 /*! 00486 * @brief Tx & Rx timeout timer callback 00487 */ 00488 virtual void OnTimeoutIrq( void ); 00489 00490 /*! 00491 * Returns the known FSK bandwidth registers value 00492 * 00493 * \param [IN] bandwidth Bandwidth value in Hz 00494 * \retval regValue Bandwidth register value. 00495 */ 00496 static uint8_t GetFskBandwidthRegValue ( uint32_t bandwidth ); 00497 }; 00498 00499 #endif // __SX1276_H__
Generated on Sat Jul 16 2022 02:04:55 by
1.7.2