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 wake-up time from sleep 00025 */ 00026 #define RADIO_WAKEUP_TIME 1 // [ms] 00027 00028 /*! 00029 * Sync word for Private LoRa networks 00030 */ 00031 #define LORA_MAC_PRIVATE_SYNCWORD 0x12 00032 00033 /*! 00034 * Sync word for Public LoRa networks 00035 */ 00036 #define LORA_MAC_PUBLIC_SYNCWORD 0x34 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 /*! 00089 * Hardware DIO IRQ functions 00090 */ 00091 DioIrqHandler *dioIrq ; 00092 00093 /*! 00094 * Tx and Rx timers 00095 */ 00096 Timeout txTimeoutTimer ; 00097 Timeout rxTimeoutTimer; 00098 Timeout rxTimeoutSyncWord; 00099 00100 RadioSettings_t settings; 00101 00102 static const FskBandwidth_t FskBandwidths[]; 00103 00104 // <RTOS> 00105 //Thread* _thread_events_queue; 00106 EventQueue* _eq_events; 00107 // </RTOS> 00108 00109 protected: 00110 00111 /*! 00112 * Performs the Rx chain calibration for LF and HF bands 00113 * \remark Must be called just after the reset so all registers are at their 00114 * default values 00115 */ 00116 void RxChainCalibration ( void ); 00117 00118 public: 00119 SX1276 ( RadioEvents_t *events, 00120 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset , 00121 PinName dio0 , PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5 ); 00122 SX1276 ( RadioEvents_t *events ); 00123 virtual ~SX1276 ( ); 00124 00125 // <RTOS> 00126 //void assign_events_queue_thread(Thread* thread) {_thread_events_queue=thread;} 00127 void assign_events_queue(EventQueue* event_queue) {_eq_events=event_queue;} 00128 // </RTOS> 00129 00130 //------------------------------------------------------------------------- 00131 // Redefined Radio functions 00132 //------------------------------------------------------------------------- 00133 /*! 00134 * @brief Initializes the radio 00135 * 00136 * @param [IN] events Structure containing the driver callback functions 00137 */ 00138 virtual void Init( RadioEvents_t *events ); 00139 /*! 00140 * Return current radio status 00141 * 00142 * @param status Radio status. [RF_IDLE, RX_RUNNING, TX_RUNNING] 00143 */ 00144 virtual RadioState GetStatus ( void ); 00145 /*! 00146 * @brief Configures the SX1276 with the given modem 00147 * 00148 * @param [IN] modem Modem to be used [0: FSK, 1: LoRa] 00149 */ 00150 virtual void SetModem( RadioModems_t modem ); 00151 /*! 00152 * @brief Sets the channel frequency 00153 * 00154 * @param [IN] freq Channel RF frequency 00155 */ 00156 virtual void SetChannel( uint32_t freq ); 00157 /*! 00158 * @brief Sets the channels configuration 00159 * 00160 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00161 * @param [IN] freq Channel RF frequency 00162 * @param [IN] rssiThresh RSSI threshold 00163 * 00164 * @retval isFree [true: Channel is free, false: Channel is not free] 00165 */ 00166 virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh ); 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 * @brief Sets the reception parameters 00180 * 00181 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00182 * @param [IN] bandwidth Sets the bandwidth 00183 * FSK : >= 2600 and <= 250000 Hz 00184 * LoRa: [0: 125 kHz, 1: 250 kHz, 00185 * 2: 500 kHz, 3: Reserved] 00186 * @param [IN] datarate Sets the Datarate 00187 * FSK : 600..300000 bits/s 00188 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, 00189 * 10: 1024, 11: 2048, 12: 4096 chips] 00190 * @param [IN] coderate Sets the coding rate ( LoRa only ) 00191 * FSK : N/A ( set to 0 ) 00192 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] 00193 * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only ) 00194 * FSK : >= 2600 and <= 250000 Hz 00195 * LoRa: N/A ( set to 0 ) 00196 * @param [IN] preambleLen Sets the Preamble length ( LoRa only ) 00197 * FSK : N/A ( set to 0 ) 00198 * LoRa: Length in symbols ( the hardware adds 4 more symbols ) 00199 * @param [IN] symbTimeout Sets the RxSingle timeout value 00200 * FSK : timeout number of bytes 00201 * LoRa: timeout in symbols 00202 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed] 00203 * @param [IN] payloadLen Sets payload length when fixed lenght is used 00204 * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON] 00205 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only) 00206 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only) 00207 * @param [IN] iqInverted Inverts IQ signals ( LoRa only ) 00208 * FSK : N/A ( set to 0 ) 00209 * LoRa: [0: not inverted, 1: inverted] 00210 * @param [IN] rxContinuous Sets the reception in continuous mode 00211 * [false: single mode, true: continuous mode] 00212 */ 00213 virtual void SetRxConfig ( RadioModems_t modem, uint32_t bandwidth, 00214 uint32_t datarate, uint8_t coderate, 00215 uint32_t bandwidthAfc, uint16_t preambleLen, 00216 uint16_t symbTimeout, bool fixLen, 00217 uint8_t payloadLen, 00218 bool crcOn, bool freqHopOn, uint8_t hopPeriod, 00219 bool iqInverted, bool rxContinuous ); 00220 /*! 00221 * @brief Sets the transmission parameters 00222 * 00223 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00224 * @param [IN] power Sets the output power [dBm] 00225 * @param [IN] fdev Sets the frequency deviation ( FSK only ) 00226 * FSK : [Hz] 00227 * LoRa: 0 00228 * @param [IN] bandwidth Sets the bandwidth ( LoRa only ) 00229 * FSK : 0 00230 * LoRa: [0: 125 kHz, 1: 250 kHz, 00231 * 2: 500 kHz, 3: Reserved] 00232 * @param [IN] datarate Sets the Datarate 00233 * FSK : 600..300000 bits/s 00234 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512, 00235 * 10: 1024, 11: 2048, 12: 4096 chips] 00236 * @param [IN] coderate Sets the coding rate ( LoRa only ) 00237 * FSK : N/A ( set to 0 ) 00238 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] 00239 * @param [IN] preambleLen Sets the preamble length 00240 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed] 00241 * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON] 00242 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only) 00243 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only) 00244 * @param [IN] iqInverted Inverts IQ signals ( LoRa only ) 00245 * FSK : N/A ( set to 0 ) 00246 * LoRa: [0: not inverted, 1: inverted] 00247 * @param [IN] timeout Transmission timeout [ms] 00248 */ 00249 virtual void SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev, 00250 uint32_t bandwidth, uint32_t datarate, 00251 uint8_t coderate, uint16_t preambleLen, 00252 bool fixLen, bool crcOn, bool freqHopOn, 00253 uint8_t hopPeriod, bool iqInverted, uint32_t timeout ); 00254 /*! 00255 * @brief Checks if the given RF frequency is supported by the hardware 00256 * 00257 * @param [IN] frequency RF frequency to be checked 00258 * @retval isSupported [true: supported, false: unsupported] 00259 */ 00260 virtual bool CheckRfFrequency( uint32_t frequency ) = 0; 00261 /*! 00262 * @brief Computes the packet time on air for the given payload 00263 * 00264 * \Remark Can only be called once SetRxConfig or SetTxConfig have been called 00265 * 00266 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00267 * @param [IN] pktLen Packet payload length 00268 * 00269 * @retval airTime Computed airTime for the given packet payload length 00270 */ 00271 virtual uint32_t TimeOnAir ( RadioModems_t modem, uint8_t pktLen ); 00272 /*! 00273 * @brief Sends the buffer of size. Prepares the packet to be sent and sets 00274 * the radio in transmission 00275 * 00276 * @param [IN]: buffer Buffer pointer 00277 * @param [IN]: size Buffer size 00278 */ 00279 virtual void Send( uint8_t *buffer, uint8_t size ); 00280 /*! 00281 * @brief Sets the radio in sleep mode 00282 */ 00283 virtual void Sleep( void ); 00284 /*! 00285 * @brief Sets the radio in standby mode 00286 */ 00287 virtual void Standby( void ); 00288 /*! 00289 * @brief Sets the radio in CAD mode 00290 */ 00291 virtual void StartCad( void ); 00292 /*! 00293 * @brief Sets the radio in reception mode for the given time 00294 * @param [IN] timeout Reception timeout [ms] 00295 * [0: continuous, others timeout] 00296 */ 00297 virtual void Rx( uint32_t timeout ); 00298 /*! 00299 * @brief Sets the radio in transmission mode for the given time 00300 * @param [IN] timeout Transmission timeout [ms] 00301 * [0: continuous, others timeout] 00302 */ 00303 virtual void Tx( uint32_t timeout ); 00304 /*! 00305 * @brief Sets the radio in continuous wave transmission mode 00306 * 00307 * @param [IN]: freq Channel RF frequency 00308 * @param [IN]: power Sets the output power [dBm] 00309 * @param [IN]: time Transmission mode timeout [s] 00310 */ 00311 virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ); 00312 /*! 00313 * @brief Reads the current RSSI value 00314 * 00315 * @retval rssiValue Current RSSI value in [dBm] 00316 */ 00317 virtual int16_t GetRssi ( RadioModems_t modem ); 00318 /*! 00319 * @brief Writes the radio register at the specified address 00320 * 00321 * @param [IN]: addr Register address 00322 * @param [IN]: data New register value 00323 */ 00324 virtual void Write ( uint8_t addr, uint8_t data ) = 0; 00325 /*! 00326 * @brief Reads the radio register at the specified address 00327 * 00328 * @param [IN]: addr Register address 00329 * @retval data Register value 00330 */ 00331 virtual uint8_t Read ( uint8_t addr ) = 0; 00332 /*! 00333 * @brief Writes multiple radio registers starting at address 00334 * 00335 * @param [IN] addr First Radio register address 00336 * @param [IN] buffer Buffer containing the new register's values 00337 * @param [IN] size Number of registers to be written 00338 */ 00339 virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0; 00340 /*! 00341 * @brief Reads multiple radio registers starting at address 00342 * 00343 * @param [IN] addr First Radio register address 00344 * @param [OUT] buffer Buffer where to copy the registers data 00345 * @param [IN] size Number of registers to be read 00346 */ 00347 virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0; 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 * @brief Reads the contents of the SX1276 FIFO 00357 * 00358 * @param [OUT] buffer Buffer where to copy the FIFO read data. 00359 * @param [IN] size Number of bytes to be read from the FIFO 00360 */ 00361 virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0; 00362 /*! 00363 * @brief Resets the SX1276 00364 */ 00365 virtual void Reset( void ) = 0; 00366 00367 /*! 00368 * @brief Sets the maximum payload length. 00369 * 00370 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa] 00371 * @param [IN] max Maximum payload length in bytes 00372 */ 00373 virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max ); 00374 00375 /*! 00376 * \brief Sets the network to public or private. Updates the sync byte. 00377 * 00378 * \remark Applies to LoRa modem only 00379 * 00380 * \param [IN] enable if true, it enables a public network 00381 */ 00382 virtual void SetPublicNetwork( bool enable ); 00383 00384 //------------------------------------------------------------------------- 00385 // Board relative functions 00386 //------------------------------------------------------------------------- 00387 00388 protected: 00389 /*! 00390 * @brief Initializes the radio I/Os pins interface 00391 */ 00392 virtual void IoInit( void ) = 0; 00393 00394 /*! 00395 * @brief Initializes the radio registers 00396 */ 00397 virtual void RadioRegistersInit( ) = 0; 00398 00399 /*! 00400 * @brief Initializes the radio SPI 00401 */ 00402 virtual void SpiInit( void ) = 0; 00403 00404 /*! 00405 * @brief Initializes DIO IRQ handlers 00406 * 00407 * @param [IN] irqHandlers Array containing the IRQ callback functions 00408 */ 00409 virtual void IoIrqInit( DioIrqHandler *irqHandlers ) = 0; 00410 00411 /*! 00412 * @brief De-initializes the radio I/Os pins interface. 00413 * 00414 * \remark Useful when going in MCU lowpower modes 00415 */ 00416 virtual void IoDeInit( void ) = 0; 00417 00418 /*! 00419 * @brief Sets the radio output power. 00420 * 00421 * @param [IN] power Sets the RF output power 00422 */ 00423 virtual void SetRfTxPower( int8_t power ) = 0; 00424 00425 /*! 00426 * @brief Gets the board PA selection configuration 00427 * 00428 * @param [IN] channel Channel frequency in Hz 00429 * @retval PaSelect RegPaConfig PaSelect value 00430 */ 00431 virtual uint8_t GetPaSelect( uint32_t channel ) = 0; 00432 00433 /*! 00434 * @brief Set the RF Switch I/Os pins in Low Power mode 00435 * 00436 * @param [IN] status enable or disable 00437 */ 00438 virtual void SetAntSwLowPower( bool status ) = 0; 00439 00440 /*! 00441 * @brief Initializes the RF Switch I/Os pins interface 00442 */ 00443 virtual void AntSwInit( void ) = 0; 00444 00445 /*! 00446 * @brief De-initializes the RF Switch I/Os pins interface 00447 * 00448 * \remark Needed to decrease the power consumption in MCU lowpower modes 00449 */ 00450 virtual void AntSwDeInit( void ) = 0; 00451 00452 /*! 00453 * @brief Controls the antenna switch if necessary. 00454 * 00455 * \remark see errata note 00456 * 00457 * @param [IN] opMode Current radio operating mode 00458 */ 00459 virtual void SetAntSw( uint8_t opMode ) = 0; 00460 protected: 00461 00462 /*! 00463 * @brief Sets the SX1276 operating mode 00464 * 00465 * @param [IN] opMode New operating mode 00466 */ 00467 virtual void SetOpMode( uint8_t opMode ); 00468 00469 /* 00470 * SX1276 DIO IRQ callback functions prototype 00471 */ 00472 00473 /*! 00474 * @brief DIO 0 IRQ callback 00475 */ 00476 virtual void OnDio0Irq( void ); 00477 00478 /*! 00479 * @brief DIO 1 IRQ callback 00480 */ 00481 virtual void OnDio1Irq( void ); 00482 00483 /*! 00484 * @brief DIO 2 IRQ callback 00485 */ 00486 virtual void OnDio2Irq( void ); 00487 00488 /*! 00489 * @brief DIO 3 IRQ callback 00490 */ 00491 virtual void OnDio3Irq( void ); 00492 00493 /*! 00494 * @brief DIO 4 IRQ callback 00495 */ 00496 virtual void OnDio4Irq( void ); 00497 00498 /*! 00499 * @brief DIO 5 IRQ callback 00500 */ 00501 virtual void OnDio5Irq( void ); 00502 00503 /*! 00504 * @brief Tx & Rx timeout timer callback 00505 */ 00506 virtual void OnTimeoutIrq( void ); 00507 00508 /*! 00509 * Returns the known FSK bandwidth registers value 00510 * 00511 * \param [IN] bandwidth Bandwidth value in Hz 00512 * \retval regValue Bandwidth register value. 00513 */ 00514 static uint8_t GetFskBandwidthRegValue ( uint32_t bandwidth ); 00515 00516 // Inizio nuova parte per RTOS 00517 00518 virtual void enqueueOnTimeoutIrq(); 00519 00520 virtual void enqueueRadioEvent_RxTimeout(); 00521 virtual void enqueueRadioEvent_TxTimeout(); 00522 virtual void enqueueRadioEvent_RxError(); 00523 virtual void enqueueRadioEvent_RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr); 00524 virtual void enqueueRadioEvent_TxDone(); 00525 virtual void enqueueRadioEvent_FhssChangeChannel(uint8_t currentChannel); 00526 virtual void enqueueRadioEvent_CadDone(bool channelActivityDetected); 00527 virtual void enqueueOnDio0Irq(); 00528 virtual void enqueueOnDio1Irq(); 00529 virtual void enqueueOnDio2Irq(); 00530 virtual void enqueueOnDio3Irq(); 00531 virtual void enqueueOnDio4Irq(); 00532 virtual void enqueueOnDio5Irq(); 00533 00534 private: 00535 00536 void radioEvent_RxTimeout(); 00537 void radioEvent_TxTimeout(); 00538 void radioEvent_RxError(); 00539 void radioEvent_RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr); 00540 void radioEvent_TxDone(); 00541 void radioEvent_FhssChangeChannel(uint8_t currentChannel); 00542 void radioEvent_CadDone(bool channelActivityDetected); 00543 00544 // Fine nuova parte per RTOS 00545 }; 00546 00547 #endif // __SX1276_H__
Generated on Tue Jul 12 2022 20:43:13 by
1.7.2
