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