SX1278 RA-01, RA-02 LoRa library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sx1278.c Source File

sx1278.c

00001 /**
00002  *  @brief:  Implementation of a SX1278 radio functions
00003  *  @author: luk6xff based on SEMTCH code: https://github.com/Lora-net/LoRaMac-node
00004  *  @email:  luszko@op.pl
00005  *  @date:   2019-11-15
00006  */
00007 #include "registers.h"
00008 #include "sx1278.h"
00009 
00010 #include <math.h>
00011 #include <string.h>
00012 
00013 /**
00014  * ============================================================================
00015  * @brief Private global constants
00016  * ============================================================================
00017  */
00018 //-----------------------------------------------------------------------------
00019 /**
00020  * Precomputed FSK bandwidth registers values
00021  */
00022 static const BandwidthMap_t SX1278FskBandwidths[] =
00023 {
00024     { 2600  , 0x17 },
00025     { 3100  , 0x0F },
00026     { 3900  , 0x07 },
00027     { 5200  , 0x16 },
00028     { 6300  , 0x0E },
00029     { 7800  , 0x06 },
00030     { 10400 , 0x15 },
00031     { 12500 , 0x0D },
00032     { 15600 , 0x05 },
00033     { 20800 , 0x14 },
00034     { 25000 , 0x0C },
00035     { 31300 , 0x04 },
00036     { 41700 , 0x13 },
00037     { 50000 , 0x0B },
00038     { 62500 , 0x03 },
00039     { 83333 , 0x12 },
00040     { 100000, 0x0A },
00041     { 125000, 0x02 },
00042     { 166700, 0x11 },
00043     { 200000, 0x09 },
00044     { 250000, 0x01 },
00045     { 300000, 0x00 }, // Invalid Bandwidth
00046 };
00047 
00048 //-----------------------------------------------------------------------------
00049 /**
00050  * @brief Precomputed LORA bandwidth registers values
00051  */
00052 static const BandwidthMap_t SX1278LoRaBandwidths[] =
00053 {
00054     {   7800, 0 }, //  7.8 kHz requires TCXO
00055     {  10400, 1 }, // 10.4 kHz requires TCXO
00056     {  15600, 2 }, // 15.6 kHz requires TCXO
00057     {  20800, 3 }, // 20.8 kHz requires TCXO
00058     {  31250, 4 }, // 31.25 kHz requires TCXO
00059     {  41700, 5 }, // 41.7 kHz requires TCXO
00060     {  62500, 6 }, // 62.5 kHz requires TCXO
00061     { 125000, 7 }, // 125 kHz the LoRa protocol default
00062     { 250000, 8 }, // 250 kHz
00063     { 500000, 9 }, // 500 kHz
00064     { 600000, 10 },// Invalid Bandwidth, reserved
00065  };
00066 
00067 //-----------------------------------------------------------------------------
00068 /**
00069  * @brief Radio hardware registers initialization definition
00070  */
00071 static const RadioRegisters_t SX1278RadioRegsInit[] =
00072 {                                                 \
00073     { MODEM_FSK , REG_LNA                , 0x23 },\
00074     { MODEM_FSK , REG_RXCONFIG           , 0x1E },\
00075     { MODEM_FSK , REG_RSSICONFIG         , 0xD2 },\
00076     { MODEM_FSK , REG_AFCFEI             , 0x01 },\
00077     { MODEM_FSK , REG_PREAMBLEDETECT     , 0xAA },\
00078     { MODEM_FSK , REG_OSC                , 0x07 },\
00079     { MODEM_FSK , REG_SYNCCONFIG         , 0x12 },\
00080     { MODEM_FSK , REG_SYNCVALUE1         , 0xC1 },\
00081     { MODEM_FSK , REG_SYNCVALUE2         , 0x94 },\
00082     { MODEM_FSK , REG_SYNCVALUE3         , 0xC1 },\
00083     { MODEM_FSK , REG_PACKETCONFIG1      , 0xD8 },\
00084     { MODEM_FSK , REG_FIFOTHRESH         , 0x8F },\
00085     { MODEM_FSK , REG_IMAGECAL           , 0x02 },\
00086     { MODEM_FSK , REG_DIOMAPPING1        , 0x00 },\
00087     { MODEM_FSK , REG_DIOMAPPING2        , 0x30 },\
00088     { MODEM_LORA, REG_LR_PAYLOADMAXLENGTH, 0x40 },\
00089 };
00090 
00091 
00092 /**
00093  * ============================================================================
00094  * @brief Private functions prototypes
00095  * ============================================================================
00096  */
00097 
00098 /**
00099  * @brief Performs the Rx chain calibration for LF and HF bands
00100  * @note Must be called just after the reset so all registers are at their
00101  *         default values
00102  */
00103 static void RxChainCalibration(void);
00104 
00105 /**
00106  * Returns the known FSK bandwidth registers value
00107  *
00108  * @param [IN] bandwidth Bandwidth value in Hz
00109  * @retval regValue Bandwidth register value.
00110  */
00111 static uint8_t GetFskBandwidthRegValue(uint32_t bandwidth);
00112 
00113 /**
00114  * Returns the known LORA bandwidth registers value
00115  *
00116  * @param [IN] bandwidth Bandwidth value in Hz
00117  * @retval regValue Bandwidth register value.
00118  */
00119 static uint8_t GetLoRaBandwidthRegValue(uint32_t bandwidth);
00120 
00121 
00122 /**
00123  * @brief DIO 0 IRQ callback
00124  */
00125 static void OnDio0Irq();
00126 
00127 /**
00128  * @brief DIO 1 IRQ callback
00129  */
00130 static void OnDio1Irq();
00131 
00132 /**
00133  * @brief DIO 2 IRQ callback
00134  */
00135 static void OnDio2Irq();
00136 
00137 /**
00138  * @brief DIO 3 IRQ callback
00139  */
00140 static void OnDio3Irq();
00141 
00142 /**
00143  * @brief DIO 4 IRQ callback
00144  */
00145 static void OnDio4Irq();
00146 
00147 /**
00148  * @brief DIO 5 IRQ callback
00149  */
00150 static void OnDio5Irq();
00151 
00152 /**
00153  * @brief Tx & Rx timeout timer callback
00154  */
00155 static void OnTimeoutIrq();
00156 
00157 
00158 
00159 /**
00160  * ============================================================================
00161  * @brief Private global variables
00162  * ============================================================================
00163  */
00164 
00165 /**
00166  * Radio callbacks variable
00167  */
00168 static RadioEvents_t* RadioEvents;
00169 
00170 /**
00171  * Reception buffer
00172  */
00173 static uint8_t RxTxBuffer[RX_BUFFER_SIZE];
00174 
00175 /**
00176  * Hardware DIO IRQ functions
00177  */
00178 DioIrqHandler dioIrq[] = { OnDio0Irq, OnDio1Irq,
00179                             OnDio2Irq, OnDio3Irq,
00180                             OnDio4Irq, NULL };
00181 
00182 /**
00183  * Radio settings
00184  */
00185 RadioSettings_t settings;
00186 
00187 
00188 
00189 /**
00190  * ============================================================================
00191  * @brief Public functions definitions
00192  * ============================================================================
00193  */
00194 //-----------------------------------------------------------------------------
00195 bool SX1278Init(RadioEvents_t *events)
00196 {
00197     RadioEvents = events;
00198 
00199     if (SX1278Read(REG_VERSION) == 0x00)
00200     {
00201         return false;
00202     }
00203     
00204     SX1278Reset();
00205     RxChainCalibration();
00206     SX1278SetOpMode(RF_OPMODE_SLEEP);
00207 
00208     SX1278IoIrqInit(dioIrq);
00209     SX1278RadioRegistersInit();
00210     SX1278SetModem(MODEM_FSK);
00211     settings.State = RF_IDLE;
00212     return true;
00213 }
00214 
00215 //-----------------------------------------------------------------------------
00216 void SX1278RadioRegistersInit()
00217 {
00218     uint8_t i = 0;
00219     for(i = 0; i < sizeof(SX1278RadioRegsInit) / sizeof(RadioRegisters_t); i++)
00220     {
00221         SX1278SetModem(SX1278RadioRegsInit[i].Modem);
00222         SX1278Write(SX1278RadioRegsInit[i].Addr, SX1278RadioRegsInit[i].Value);
00223     }    
00224 }
00225 
00226 //-----------------------------------------------------------------------------
00227 RadioState_t SX1278GetStatus(void)
00228 {
00229     return settings.State;
00230 }
00231 
00232 //-----------------------------------------------------------------------------
00233 void SX1278SetChannel(uint32_t freq)
00234 {
00235     settings.Channel = freq;
00236     freq = (uint32_t)((double)freq / (double)FREQ_STEP);
00237     SX1278Write(REG_FRFMSB, (uint8_t)((freq >> 16) & 0xFF));
00238     SX1278Write(REG_FRFMID, (uint8_t)((freq >> 8) & 0xFF));
00239     SX1278Write(REG_FRFLSB, (uint8_t)(freq & 0xFF));
00240 }
00241 
00242 //-----------------------------------------------------------------------------
00243 bool SX1278IsChannelFree(RadioModems_t modem, uint32_t freq, int16_t rssiThresh, uint32_t maxCarrierSenseTime)
00244 {
00245     // TODO handle carrierSenseTime
00246     int16_t rssi = 0;
00247 
00248     SX1278SetModem(modem);
00249 
00250     SX1278SetChannel(freq);
00251 
00252     SX1278SetOpMode(RF_OPMODE_RECEIVER);
00253 
00254     SX1278DelayMs(1);
00255 
00256     rssi = SX1278GetRssi(modem);
00257 
00258     SX1278SetSleep();
00259     if (rssi > rssiThresh)
00260     {
00261         return false;
00262     }
00263     return true;
00264 }
00265 
00266 //-----------------------------------------------------------------------------
00267 uint32_t SX1278Random(void)
00268 {
00269     uint8_t i;
00270     uint32_t rnd = 0;
00271 
00272     /*
00273      * Radio setup for random number generation
00274      */
00275     // Set LoRa modem ON
00276     SX1278SetModem(MODEM_LORA);
00277 
00278     // Disable LoRa modem interrupts
00279     SX1278Write(REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
00280                   RFLR_IRQFLAGS_RXDONE |
00281                   RFLR_IRQFLAGS_PAYLOADCRCERROR |
00282                   RFLR_IRQFLAGS_VALIDHEADER |
00283                   RFLR_IRQFLAGS_TXDONE |
00284                   RFLR_IRQFLAGS_CADDONE |
00285                   RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
00286                   RFLR_IRQFLAGS_CADDETECTED);
00287 
00288     // Set radio in continuous reception
00289     SX1278SetOpMode(RF_OPMODE_RECEIVER);
00290 
00291     for(i = 0; i < 32; i++)
00292     {
00293         SX1278DelayMs(1);
00294         // Unfiltered RSSI value SX1278Reading. Only takes the LSB value
00295         rnd |= ((uint32_t)SX1278Read(REG_LR_RSSIWIDEBAND) & 0x01) << i;
00296     }
00297 
00298     SX1278SetSleep();
00299 
00300     return rnd;
00301 }
00302 
00303 //-----------------------------------------------------------------------------
00304 void SX1278SetRxConfig(RadioModems_t modem, uint32_t bandwidth,
00305                          uint32_t datarate, uint8_t coderate,
00306                          uint32_t bandwidthAfc, uint16_t preambleLen,
00307                          uint16_t symbTimeout, bool fixLen,
00308                          uint8_t payloadLen,
00309                          bool crcOn, bool freqHopOn, uint8_t hopPeriod,
00310                          bool iqInverted, bool rxContinuous)
00311 {
00312     SX1278SetModem(modem);
00313 
00314     switch (modem)
00315     {
00316         case MODEM_FSK:
00317         {
00318             settings.Fsk.Bandwidth = bandwidth;
00319             settings.Fsk.Datarate = datarate;
00320             settings.Fsk.BandwidthAfc = bandwidthAfc;
00321             settings.Fsk.FixLen = fixLen;
00322             settings.Fsk.PayloadLen = payloadLen;
00323             settings.Fsk.CrcOn = crcOn;
00324             settings.Fsk.IqInverted = iqInverted;
00325             settings.Fsk.RxContinuous = rxContinuous;
00326             settings.Fsk.PreambleLen = preambleLen;
00327             settings.Fsk.RxSingleTimeout = symbTimeout * ((1.0 / (double)datarate) * 8.0) * 1000;
00328 
00329             datarate = (uint16_t)((double)XTAL_FREQ / (double)datarate);
00330             SX1278Write(REG_BITRATEMSB, (uint8_t)(datarate >> 8));
00331             SX1278Write(REG_BITRATELSB, (uint8_t)(datarate & 0xFF));
00332 
00333             SX1278Write(REG_RXBW, GetFskBandwidthRegValue(bandwidth));
00334             SX1278Write(REG_AFCBW, GetFskBandwidthRegValue(bandwidthAfc));
00335 
00336             SX1278Write(REG_PREAMBLEMSB, (uint8_t)((preambleLen >> 8) & 0xFF));
00337             SX1278Write(REG_PREAMBLELSB, (uint8_t)(preambleLen & 0xFF));
00338 
00339             if (fixLen == 1)
00340             {
00341                 SX1278Write(REG_PAYLOADLENGTH, payloadLen);
00342             }
00343             else
00344             {
00345                 SX1278Write(REG_PAYLOADLENGTH, 0xFF); // Set payload length to the maximum
00346             }
00347             
00348             SX1278Write(REG_PACKETCONFIG1,
00349                          (SX1278Read(REG_PACKETCONFIG1) &
00350                            RF_PACKETCONFIG1_CRC_MASK &
00351                            RF_PACKETCONFIG1_PACKETFORMAT_MASK) |
00352                            ((fixLen == 1) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE) |
00353                            (crcOn << 4));
00354             SX1278Write(REG_PACKETCONFIG2, (SX1278Read(REG_PACKETCONFIG2) | RF_PACKETCONFIG2_DATAMODE_PACKET));
00355         }
00356         break;
00357         case MODEM_LORA:
00358         {
00359             if (bandwidth > 11) // specified in Hz, needs mapping
00360             {
00361                 bandwidth = GetLoRaBandwidthRegValue(bandwidth);
00362             }
00363             if (bandwidth > LORA_BANDWIDTH_500kHz)
00364             {
00365                 // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
00366                 while(1);
00367             }
00368             settings.LoRa.Bandwidth = bandwidth;
00369             settings.LoRa.Datarate = datarate;
00370             settings.LoRa.Coderate = coderate;
00371             settings.LoRa.PreambleLen = preambleLen;
00372             settings.LoRa.FixLen = fixLen;
00373             settings.LoRa.PayloadLen = payloadLen;
00374             settings.LoRa.CrcOn = crcOn;
00375             settings.LoRa.FreqHopOn = freqHopOn;
00376             settings.LoRa.HopPeriod = hopPeriod;
00377             settings.LoRa.IqInverted = iqInverted;
00378             settings.LoRa.RxContinuous = rxContinuous;
00379 
00380             if (datarate > LORA_SF12)
00381             {
00382                 datarate = LORA_SF12;
00383             }
00384             else if (datarate < LORA_SF6)
00385             {
00386                 datarate = LORA_SF6;
00387             }
00388 
00389             if (((bandwidth == LORA_BANDWIDTH_125kHz) && ((datarate == LORA_SF11) || (datarate == LORA_SF12))) ||
00390                ((bandwidth == LORA_BANDWIDTH_250kHz) && (datarate == LORA_SF12)))
00391             {
00392                 settings.LoRa.LowDatarateOptimize = 0x01;
00393             }
00394             else
00395             {
00396                 settings.LoRa.LowDatarateOptimize = 0x00;
00397             }
00398 
00399             SX1278Write(REG_LR_MODEMCONFIG1,
00400                          (SX1278Read(REG_LR_MODEMCONFIG1) &
00401                            RFLR_MODEMCONFIG1_BW_MASK &
00402                            RFLR_MODEMCONFIG1_CODINGRATE_MASK &
00403                            RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK) |
00404                            (bandwidth << 4) | (coderate << 1) |
00405                            fixLen);
00406 
00407             SX1278Write(REG_LR_MODEMCONFIG2,
00408                          (SX1278Read(REG_LR_MODEMCONFIG2) &
00409                            RFLR_MODEMCONFIG2_SF_MASK &
00410                            RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK &
00411                            RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK) |
00412                            (datarate << 4) | (crcOn << 2) |
00413                            ((symbTimeout >> 8) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK));
00414 
00415             SX1278Write(REG_LR_MODEMCONFIG3,
00416                          (SX1278Read(REG_LR_MODEMCONFIG3) &
00417                            RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK) |
00418                            (settings.LoRa.LowDatarateOptimize << 3));
00419 
00420             SX1278Write(REG_LR_SYMBTIMEOUTLSB, (uint8_t)(symbTimeout & 0xFF));
00421 
00422             SX1278Write(REG_LR_PREAMBLEMSB, (uint8_t)((preambleLen >> 8) & 0xFF));
00423             SX1278Write(REG_LR_PREAMBLELSB, (uint8_t)(preambleLen & 0xFF));
00424 
00425             if (fixLen == 1)
00426             {
00427                 SX1278Write(REG_LR_PAYLOADLENGTH, payloadLen);
00428             }
00429 
00430             if (settings.LoRa.FreqHopOn == true)
00431             {
00432                 SX1278Write(REG_LR_PLLHOP, (SX1278Read(REG_LR_PLLHOP) & RFLR_PLLHOP_FASTHOP_MASK) | RFLR_PLLHOP_FASTHOP_ON);
00433                 SX1278Write(REG_LR_HOPPERIOD, settings.LoRa.HopPeriod);
00434             }
00435 
00436             if ((bandwidth == LORA_BANDWIDTH_500kHz) && (settings.Channel > RF_MID_BAND_THRESH))
00437             {
00438                 // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
00439                 SX1278Write(REG_LR_HIGHBWOPTIMIZE1, 0x02);
00440                 SX1278Write(REG_LR_HIGHBWOPTIMIZE2, 0x64);
00441             }
00442             else if (bandwidth == LORA_BANDWIDTH_500kHz)
00443             {
00444                 // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
00445                 SX1278Write(REG_LR_HIGHBWOPTIMIZE1, 0x02);
00446                 SX1278Write(REG_LR_HIGHBWOPTIMIZE2, 0x7F);
00447             }
00448             else
00449             {
00450                 // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
00451                 SX1278Write(REG_LR_HIGHBWOPTIMIZE1, 0x03);
00452             }
00453 
00454             if (datarate == LORA_SF6)
00455             {
00456                 SX1278Write(REG_LR_DETECTOPTIMIZE,
00457                              (SX1278Read(REG_LR_DETECTOPTIMIZE) &
00458                                RFLR_DETECTIONOPTIMIZE_MASK) |
00459                                RFLR_DETECTIONOPTIMIZE_SF6);
00460                 SX1278Write(REG_LR_DETECTIONTHRESHOLD,
00461                              RFLR_DETECTIONTHRESH_SF6);
00462             }
00463             else
00464             {
00465                 SX1278Write(REG_LR_DETECTOPTIMIZE,
00466                             (SX1278Read(REG_LR_DETECTOPTIMIZE) &
00467                             RFLR_DETECTIONOPTIMIZE_MASK) |
00468                             RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12);
00469                 SX1278Write(REG_LR_DETECTIONTHRESHOLD,
00470                             RFLR_DETECTIONTHRESH_SF7_TO_SF12);
00471             }
00472         }
00473         break;
00474     }
00475 }
00476 
00477 //-----------------------------------------------------------------------------
00478 void SX1278SetTxConfig(RadioModems_t modem, int8_t power, uint32_t fdev,
00479                         uint32_t bandwidth, uint32_t datarate,
00480                         uint8_t coderate, uint16_t preambleLen,
00481                         bool fixLen, bool crcOn, bool freqHopOn,
00482                         uint8_t hopPeriod, bool iqInverted, uint32_t timeout)
00483 {
00484     SX1278SetModem(modem);
00485     SX1278SetRfTxPower(power);
00486 
00487     switch (modem)
00488     {
00489         case MODEM_FSK:
00490         {
00491             settings.Fsk.Power = power;
00492             settings.Fsk.Fdev = fdev;
00493             settings.Fsk.Bandwidth = bandwidth;
00494             settings.Fsk.Datarate = datarate;
00495             settings.Fsk.PreambleLen = preambleLen;
00496             settings.Fsk.FixLen = fixLen;
00497             settings.Fsk.CrcOn = crcOn;
00498             settings.Fsk.IqInverted = iqInverted;
00499             settings.Fsk.TxTimeout = timeout;
00500 
00501             fdev = (uint16_t)((double)fdev / (double)FREQ_STEP);
00502             SX1278Write(REG_FDEVMSB, (uint8_t)(fdev >> 8));
00503             SX1278Write(REG_FDEVLSB, (uint8_t)(fdev & 0xFF));
00504 
00505             datarate = (uint16_t)((double)XTAL_FREQ / (double)datarate);
00506             SX1278Write(REG_BITRATEMSB, (uint8_t)(datarate >> 8));
00507             SX1278Write(REG_BITRATELSB, (uint8_t)(datarate & 0xFF));
00508 
00509             SX1278Write(REG_PREAMBLEMSB, (preambleLen >> 8) & 0x00FF);
00510             SX1278Write(REG_PREAMBLELSB, preambleLen & 0xFF);
00511 
00512             SX1278Write(REG_PACKETCONFIG1,
00513                         (SX1278Read(REG_PACKETCONFIG1) &
00514                         RF_PACKETCONFIG1_CRC_MASK &
00515                         RF_PACKETCONFIG1_PACKETFORMAT_MASK) |
00516                         ((fixLen == 1) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE) |
00517                         (crcOn << 4));
00518             SX1278Write(REG_PACKETCONFIG2, (SX1278Read(REG_PACKETCONFIG2) | RF_PACKETCONFIG2_DATAMODE_PACKET));
00519         }
00520         break;
00521         case MODEM_LORA:
00522         {
00523             settings.LoRa.Power = power;
00524             if (bandwidth > LORA_BANDWIDTH_500kHz)
00525             {
00526                 // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
00527                 while(1);
00528             }
00529 
00530             settings.LoRa.Bandwidth = bandwidth;
00531             settings.LoRa.Datarate = datarate;
00532             settings.LoRa.Coderate = coderate;
00533             settings.LoRa.PreambleLen = preambleLen;
00534             settings.LoRa.FixLen = fixLen;
00535             settings.LoRa.FreqHopOn = freqHopOn;
00536             settings.LoRa.HopPeriod = hopPeriod;
00537             settings.LoRa.CrcOn = crcOn;
00538             settings.LoRa.IqInverted = iqInverted;
00539             settings.LoRa.TxTimeout = timeout;
00540 
00541             if (datarate > LORA_SF12)
00542             {
00543                 datarate = LORA_SF12;
00544             }
00545             else if (datarate < LORA_SF6)
00546             {
00547                 datarate = LORA_SF6;
00548             }
00549             if (((bandwidth == LORA_BANDWIDTH_125kHz) && ((datarate == LORA_SF11) || (datarate == LORA_SF12))) ||
00550                 ((bandwidth == LORA_BANDWIDTH_250kHz) && (datarate == LORA_SF12)))
00551             {
00552                 settings.LoRa.LowDatarateOptimize = 0x01;
00553             }
00554             else
00555             {
00556                 settings.LoRa.LowDatarateOptimize = 0x00;
00557             }
00558 
00559             if (settings.LoRa.FreqHopOn == true)
00560             {
00561                 SX1278Write(REG_LR_PLLHOP, (SX1278Read(REG_LR_PLLHOP) & RFLR_PLLHOP_FASTHOP_MASK) | RFLR_PLLHOP_FASTHOP_ON);
00562                 SX1278Write(REG_LR_HOPPERIOD, settings.LoRa.HopPeriod);
00563             }
00564 
00565             SX1278Write(REG_LR_MODEMCONFIG1,
00566                          (SX1278Read(REG_LR_MODEMCONFIG1) &
00567                            RFLR_MODEMCONFIG1_BW_MASK &
00568                            RFLR_MODEMCONFIG1_CODINGRATE_MASK &
00569                            RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK) |
00570                            (bandwidth << 4) | (coderate << 1) |
00571                            fixLen);
00572 
00573             SX1278Write(REG_LR_MODEMCONFIG2,
00574                          (SX1278Read(REG_LR_MODEMCONFIG2) &
00575                            RFLR_MODEMCONFIG2_SF_MASK &
00576                            RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK) |
00577                            (datarate << 4) | (crcOn << 2));
00578 
00579             SX1278Write(REG_LR_MODEMCONFIG3,
00580                          (SX1278Read(REG_LR_MODEMCONFIG3) &
00581                            RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK) |
00582                            (settings.LoRa.LowDatarateOptimize << 3));
00583 
00584             SX1278Write(REG_LR_PREAMBLEMSB, (preambleLen >> 8) & 0x00FF);
00585             SX1278Write(REG_LR_PREAMBLELSB, preambleLen & 0xFF);
00586 
00587             if (datarate == LORA_SF6)
00588             {
00589                 SX1278Write(REG_LR_DETECTOPTIMIZE,
00590                              (SX1278Read(REG_LR_DETECTOPTIMIZE) &
00591                                RFLR_DETECTIONOPTIMIZE_MASK) |
00592                                RFLR_DETECTIONOPTIMIZE_SF6);
00593                 SX1278Write(REG_LR_DETECTIONTHRESHOLD,
00594                              RFLR_DETECTIONTHRESH_SF6);
00595             }
00596             else
00597             {
00598                 SX1278Write(REG_LR_DETECTOPTIMIZE,
00599                              (SX1278Read(REG_LR_DETECTOPTIMIZE) &
00600                              RFLR_DETECTIONOPTIMIZE_MASK) |
00601                              RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12);
00602                 SX1278Write(REG_LR_DETECTIONTHRESHOLD,
00603                              RFLR_DETECTIONTHRESH_SF7_TO_SF12);
00604             }
00605         }
00606         break;
00607     }
00608 }
00609 
00610 //-----------------------------------------------------------------------------
00611 uint32_t SX1278TimeOnAir(RadioModems_t modem, uint8_t pktLen)
00612 {
00613     uint32_t airTime = 0;
00614 
00615     switch (modem)
00616     {
00617     case MODEM_FSK:
00618         {
00619             airTime = rint((8 * (settings.Fsk.PreambleLen +
00620                                 ((SX1278Read(REG_SYNCCONFIG) & ~RF_SYNCCONFIG_SYNCSIZE_MASK) + 1) +
00621                                 ((settings.Fsk.FixLen == 0x01) ? 0.0 : 1.0) +
00622                                 (((SX1278Read(REG_PACKETCONFIG1) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK) != 0x00) ? 1.0 : 0) +
00623                                 pktLen +
00624                                 ((settings.Fsk.CrcOn == 0x01) ? 2.0 : 0)) /
00625                                 settings.Fsk.Datarate) * 1000);
00626         }
00627         break;
00628     case MODEM_LORA:
00629         {
00630             double bw = 0.0;
00631             // NOTE: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
00632             switch (settings.LoRa.Bandwidth)
00633             {
00634                 case LORA_BANDWIDTH_7kHz: // 7.8 kHz
00635                     bw = 78e2;
00636                     break;
00637                 case LORA_BANDWIDTH_10kHz: // 10.4 kHz
00638                     bw = 104e2;
00639                     break;
00640                 case LORA_BANDWIDTH_15kHz: // 15.6 kHz
00641                     bw = 156e2;
00642                     break;
00643                 case LORA_BANDWIDTH_20kHz: // 20.8 kHz
00644                     bw = 208e2;
00645                     break;
00646                 case LORA_BANDWIDTH_31kHz: // 31.25 kHz
00647                     bw = 312e2;
00648                     break;
00649                 case LORA_BANDWIDTH_41kHz: // 41.7 kHz
00650                     bw = 414e2;
00651                     break;
00652                 case LORA_BANDWIDTH_62kHz: // 62.5 kHz
00653                     bw = 625e2;
00654                     break;
00655                 case LORA_BANDWIDTH_125kHz: // 125 kHz
00656                     bw = 125e3;
00657                     break;
00658                 case LORA_BANDWIDTH_250kHz: // 250 kHz
00659                     bw = 250e3;
00660                     break;
00661                 case LORA_BANDWIDTH_500kHz: // 500 kHz
00662                     bw = 500e3;
00663                 break;
00664             }
00665 
00666             // Symbol rate : time for one symbol (secs)
00667             double rs = bw / (1 << settings.LoRa.Datarate);
00668             double ts = 1 / rs;
00669             // time of preamble
00670             double tPreamble = (settings.LoRa.PreambleLen + 4.25) * ts;
00671             // Symbol length of payload and time
00672             double tmp = ceil((8 * pktLen - 4 * settings.LoRa.Datarate +
00673                                  28 + 16 * settings.LoRa.CrcOn -
00674                                  (settings.LoRa.FixLen ? 20 : 0)) /
00675                                  (double)(4 * (settings.LoRa.Datarate -
00676                                  ((settings.LoRa.LowDatarateOptimize > 0) ? 2 : 0)))) *
00677                                  (settings.LoRa.Coderate + 4);
00678             double nPayload = 8 + ((tmp > 0) ? tmp : 0);
00679             double tPayload = nPayload * ts;
00680             // Time on air
00681             double tOnAir = tPreamble + tPayload;
00682             // return ms secs
00683             airTime = floor(tOnAir * 1000 + 0.999);
00684         }
00685         break;
00686     }
00687     return airTime;
00688 }
00689 
00690 //-----------------------------------------------------------------------------
00691 void SX1278Send(uint8_t *buffer, uint8_t size)
00692 {
00693     uint32_t txTimeout = 0;
00694 
00695     switch (settings.Modem)
00696     {
00697         case MODEM_FSK:
00698         {
00699             settings.FskPacketHandler.NbBytes = 0;
00700             settings.FskPacketHandler.Size = size;
00701 
00702             if (settings.Fsk.FixLen == false)
00703             {
00704                 SX1278WriteFifo((uint8_t*)&size, 1);
00705             }
00706             else
00707             {
00708                 SX1278Write(REG_PAYLOADLENGTH, size);
00709             }
00710 
00711             if ((size > 0) && (size <= 64))
00712             {
00713                 settings.FskPacketHandler.ChunkSize = size;
00714             }
00715             else
00716             {
00717                 memcpy(RxTxBuffer, buffer, size);
00718                 settings.FskPacketHandler.ChunkSize = 32;
00719             }
00720 
00721             // Write payload buffer
00722             SX1278WriteFifo(buffer, settings.FskPacketHandler.ChunkSize);
00723             settings.FskPacketHandler.NbBytes += settings.FskPacketHandler.ChunkSize;
00724             txTimeout = settings.Fsk.TxTimeout;
00725         }
00726         break;
00727         case MODEM_LORA:
00728         {
00729             if (settings.LoRa.IqInverted == true)
00730             {
00731                 SX1278Write(REG_LR_INVERTIQ, ((SX1278Read(REG_LR_INVERTIQ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_ON));
00732                 SX1278Write(REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON);
00733             }
00734             else
00735             {
00736                 SX1278Write(REG_LR_INVERTIQ, ((SX1278Read(REG_LR_INVERTIQ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF));
00737                 SX1278Write(REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF);
00738             }
00739 
00740             settings.LoRaPacketHandler.Size = size;
00741 
00742             // Initializes the payload size
00743             SX1278Write(REG_LR_PAYLOADLENGTH, size);
00744 
00745             // Full buffer used for Tx
00746             SX1278Write(REG_LR_FIFOTXBASEADDR, 0);
00747             SX1278Write(REG_LR_FIFOADDRPTR, 0);
00748 
00749             // FIFO operations can not take place in SX1278SetSleep mode
00750             if ((SX1278Read(REG_OPMODE) & ~RF_OPMODE_MASK) == RF_OPMODE_SLEEP)
00751             {
00752                 SX1278SetStandby();
00753                 SX1278DelayMs(1);
00754             }
00755             // SX1278Write payload buffer
00756             SX1278WriteFifo(buffer, size);
00757             txTimeout = settings.LoRa.TxTimeout;
00758         }
00759         break;
00760     }
00761 
00762     SX1278SetTx(txTimeout);
00763 }
00764 
00765 //-----------------------------------------------------------------------------
00766 void SX1278SetSleep(void)
00767 {
00768     SX1278SetTimeout(TXTimeoutTimer, NULL, 0);
00769     SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
00770 
00771     SX1278SetOpMode(RF_OPMODE_SLEEP);
00772     //TODO Disable TCXO radio is in SLEEP mode if available
00773     settings.State = RF_IDLE;
00774 }
00775 
00776 //-----------------------------------------------------------------------------
00777 void SX1278SetStandby(void)
00778 {
00779     SX1278SetTimeout(TXTimeoutTimer, NULL, 0);
00780     SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
00781     SX1278SetTimeout(RXTimeoutSyncWordTimer, NULL, 0);
00782 
00783     SX1278SetOpMode(RF_OPMODE_STANDBY);
00784     settings.State = RF_IDLE;
00785 }
00786 
00787 //-----------------------------------------------------------------------------
00788 void SX1278SetRx(uint32_t timeout)
00789 {
00790     bool rxContinuous = false;
00791 
00792     switch (settings.Modem)
00793     {
00794     case MODEM_FSK:
00795         {
00796             rxContinuous = settings.Fsk.RxContinuous;
00797 
00798             // DIO0=PayloadSX1278Ready
00799             // DIO1=FifoLevel
00800             // DIO2=SyncAddr
00801             // DIO3=FifoEmpty
00802             // DIO4=Preamble
00803             // DIO5=ModeSX1278Ready
00804             SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1) & RF_DIOMAPPING1_DIO0_MASK &
00805                                                                         RF_DIOMAPPING1_DIO1_MASK &
00806                                                                         RF_DIOMAPPING1_DIO2_MASK) |
00807                                                                         RF_DIOMAPPING1_DIO0_00 |
00808                                                                         RF_DIOMAPPING1_DIO1_00 |
00809                                                                         RF_DIOMAPPING1_DIO2_11);
00810 
00811             SX1278Write(REG_DIOMAPPING2, (SX1278Read(REG_DIOMAPPING2) & RF_DIOMAPPING2_DIO4_MASK &
00812                                                                         RF_DIOMAPPING2_MAP_MASK) |
00813                                                                         RF_DIOMAPPING2_DIO4_11 |
00814                                                                         RF_DIOMAPPING2_MAP_PREAMBLEDETECT);
00815 
00816             settings.FskPacketHandler.FifoThresh = SX1278Read(REG_FIFOTHRESH) & 0x3F;
00817 
00818             SX1278Write(REG_RXCONFIG, RF_RXCONFIG_AFCAUTO_ON | RF_RXCONFIG_AGCAUTO_ON | RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT);
00819 
00820             settings.FskPacketHandler.PreambleDetected = false;
00821             settings.FskPacketHandler.SyncWordDetected = false;
00822             settings.FskPacketHandler.NbBytes = 0;
00823             settings.FskPacketHandler.Size = 0;
00824         }
00825         break;
00826     case MODEM_LORA:
00827         {
00828             if (settings.LoRa.IqInverted == true)
00829             {
00830                 SX1278Write(REG_LR_INVERTIQ, ((SX1278Read(REG_LR_INVERTIQ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK) | RFLR_INVERTIQ_RX_ON | RFLR_INVERTIQ_TX_OFF));
00831                 SX1278Write(REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON);
00832             }
00833             else
00834             {
00835                 SX1278Write(REG_LR_INVERTIQ, ((SX1278Read(REG_LR_INVERTIQ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF));
00836                 SX1278Write(REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF);
00837             }
00838 
00839             // ERRATA 2.3 - Receiver Spurious Reception of a LoRa Signal
00840             if (settings.LoRa.Bandwidth < LORA_BANDWIDTH_500kHz)
00841             {
00842                 SX1278Write(REG_LR_DETECTOPTIMIZE, SX1278Read(REG_LR_DETECTOPTIMIZE) & 0x7F);
00843                 SX1278Write(REG_LR_IFFREQ2, 0x00);
00844                 switch (settings.LoRa.Bandwidth)
00845                 {
00846                     case LORA_BANDWIDTH_7kHz: // 7.8 kHz
00847                         SX1278Write(REG_LR_IFFREQ1, 0x48 );
00848                         SX1278SetChannel(settings.Channel + 7810);
00849                         break;
00850                     case LORA_BANDWIDTH_10kHz: // 10.4 kHz
00851                         SX1278Write(REG_LR_IFFREQ1, 0x44 );
00852                         SX1278SetChannel(settings.Channel + 10420);
00853                         break;
00854                     case LORA_BANDWIDTH_15kHz: // 15.6 kHz
00855                         SX1278Write(REG_LR_IFFREQ1, 0x44 );
00856                         SX1278SetChannel(settings.Channel + 15620);
00857                         break;
00858                     case LORA_BANDWIDTH_20kHz: // 20.8 kHz
00859                         SX1278Write(REG_LR_IFFREQ1, 0x44 );
00860                         SX1278SetChannel(settings.Channel + 20830);
00861                         break;
00862                     case LORA_BANDWIDTH_31kHz: // 31.25 kHz
00863                         SX1278Write(REG_LR_IFFREQ1, 0x44 );
00864                         SX1278SetChannel(settings.Channel + 31250);
00865                         break;
00866                     case LORA_BANDWIDTH_41kHz: // 41.4 kHz
00867                         SX1278Write(REG_LR_IFFREQ1, 0x44 );
00868                         SX1278SetChannel(settings.Channel + 41670);
00869                         break;
00870                     case LORA_BANDWIDTH_62kHz: // 62.5 kHz
00871                         SX1278Write(REG_LR_IFFREQ1, 0x40 );
00872                         break;
00873                     case LORA_BANDWIDTH_125kHz: // 125 kHz
00874                         SX1278Write(REG_LR_IFFREQ1, 0x40 );
00875                         break;
00876                     case LORA_BANDWIDTH_250kHz: // 250 kHz
00877                         SX1278Write(REG_LR_IFFREQ1, 0x40 );
00878                         break;
00879                 }
00880             }
00881             else
00882             {
00883                 SX1278Write(REG_LR_DETECTOPTIMIZE, SX1278Read(REG_LR_DETECTOPTIMIZE) | 0x80);
00884             }
00885 
00886             rxContinuous = settings.LoRa.RxContinuous;
00887 
00888             if (settings.LoRa.FreqHopOn == true)
00889             {
00890                 SX1278Write(REG_LR_IRQFLAGSMASK,//RFLR_IRQFLAGS_RXTIMEOUT |
00891                                                 //RFLR_IRQFLAGS_RXDONE |
00892                                                 //RFLR_IRQFLAGS_PAYLOADCRCERROR |
00893                                                 RFLR_IRQFLAGS_VALIDHEADER |
00894                                                 RFLR_IRQFLAGS_TXDONE |
00895                                                 RFLR_IRQFLAGS_CADDONE |
00896                                                 //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
00897                                                 RFLR_IRQFLAGS_CADDETECTED);
00898 
00899                 // DIO0=RxDone, DIO2=FhssChangeChannel
00900                 SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO2_00);
00901             }
00902             else
00903             {
00904                 SX1278Write(REG_LR_IRQFLAGSMASK,//RFLR_IRQFLAGS_RXTIMEOUT |
00905                                                 //RFLR_IRQFLAGS_RXDONE |
00906                                                 //RFLR_IRQFLAGS_PAYLOADCRCERROR |
00907                                                 RFLR_IRQFLAGS_VALIDHEADER |
00908                                                 RFLR_IRQFLAGS_TXDONE |
00909                                                 RFLR_IRQFLAGS_CADDONE |
00910                                                 RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
00911                                                 RFLR_IRQFLAGS_CADDETECTED);
00912 
00913                 // DIO0=RxDone
00914                 SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1) & RFLR_DIOMAPPING1_DIO0_MASK) | RFLR_DIOMAPPING1_DIO0_00);
00915             }
00916             SX1278Write(REG_LR_FIFORXBASEADDR, 0);
00917             SX1278Write(REG_LR_FIFOADDRPTR, 0);
00918         }
00919         break;
00920     }
00921 
00922     memset(RxTxBuffer, 0, (size_t)RX_BUFFER_SIZE);
00923 
00924     settings.State = RF_RX_RUNNING;
00925     if (timeout != 0)
00926     {
00927         SX1278SetTimeout(RXTimeoutTimer, &OnTimeoutIrq, timeout);
00928     }
00929 
00930     if (settings.Modem == MODEM_FSK)
00931     {
00932         SX1278SetOpMode(RF_OPMODE_RECEIVER);
00933 
00934         if (rxContinuous == false)
00935         {
00936             SX1278SetTimeout(RXTimeoutSyncWordTimer, &OnTimeoutIrq, settings.Fsk.RxSingleTimeout);
00937         }
00938     }
00939     else // MODEM_LORA
00940     {
00941         if (rxContinuous == true)
00942         {
00943             SX1278SetOpMode(RFLR_OPMODE_RECEIVER);
00944         }
00945         else
00946         {
00947             SX1278SetOpMode(RFLR_OPMODE_RECEIVER_SINGLE);
00948         }
00949     }
00950 }
00951 
00952 //-----------------------------------------------------------------------------
00953 void SX1278SetTx(uint32_t timeout)
00954 {
00955 
00956     switch (settings.Modem)
00957     {
00958     case MODEM_FSK:
00959         {
00960             // DIO0=PacketSent
00961             // DIO1=FifoEmpty
00962             // DIO2=FifoFull
00963             // DIO3=FifoEmpty
00964             // DIO4=LowBat
00965             // DIO5=ModeSX1278Ready
00966             SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1) & RF_DIOMAPPING1_DIO0_MASK &
00967                                                                         RF_DIOMAPPING1_DIO1_MASK &
00968                                                                         RF_DIOMAPPING1_DIO2_MASK) |
00969                                                                         RF_DIOMAPPING1_DIO1_01);
00970 
00971             SX1278Write(REG_DIOMAPPING2, (SX1278Read(REG_DIOMAPPING2) & RF_DIOMAPPING2_DIO4_MASK &
00972                                                                             RF_DIOMAPPING2_MAP_MASK));
00973             settings.FskPacketHandler.FifoThresh = SX1278Read(REG_FIFOTHRESH) & 0x3F;
00974         }
00975         break;
00976     case MODEM_LORA:
00977         {
00978             if (settings.LoRa.FreqHopOn == true)
00979             {
00980                 SX1278Write(REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
00981                                                   RFLR_IRQFLAGS_RXDONE |
00982                                                   RFLR_IRQFLAGS_PAYLOADCRCERROR |
00983                                                   RFLR_IRQFLAGS_VALIDHEADER |
00984                                                   //RFLR_IRQFLAGS_TXDONE |
00985                                                   RFLR_IRQFLAGS_CADDONE |
00986                                                   //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
00987                                                   RFLR_IRQFLAGS_CADDETECTED);
00988 
00989                 // DIO0=TxDone, DIO2=FhssChangeChannel
00990                 SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK) | RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO2_00);
00991             }
00992             else
00993             {
00994                 SX1278Write(REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
00995                                                   RFLR_IRQFLAGS_RXDONE |
00996                                                   RFLR_IRQFLAGS_PAYLOADCRCERROR |
00997                                                   RFLR_IRQFLAGS_VALIDHEADER |
00998                                                   //RFLR_IRQFLAGS_TXDONE |
00999                                                   RFLR_IRQFLAGS_CADDONE |
01000                                                   RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
01001                                                   RFLR_IRQFLAGS_CADDETECTED);
01002 
01003                 // DIO0=TxDone
01004                 SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1) & RFLR_DIOMAPPING1_DIO0_MASK) | RFLR_DIOMAPPING1_DIO0_01);
01005             }
01006         }
01007         break;
01008     }
01009 
01010     settings.State = RF_TX_RUNNING;
01011     SX1278SetTimeout(TXTimeoutTimer, &OnTimeoutIrq, timeout);
01012     SX1278SetOpMode(RF_OPMODE_TRANSMITTER);
01013 }
01014 
01015 //-----------------------------------------------------------------------------
01016 void SX1278StartCad(void)
01017 {
01018     switch (settings.Modem)
01019     {
01020     case MODEM_FSK:
01021         {
01022 
01023         }
01024         break;
01025     case MODEM_LORA:
01026         {
01027             SX1278Write(REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
01028                                         RFLR_IRQFLAGS_RXDONE |
01029                                         RFLR_IRQFLAGS_PAYLOADCRCERROR |
01030                                         RFLR_IRQFLAGS_VALIDHEADER |
01031                                         RFLR_IRQFLAGS_TXDONE |
01032                                         //RFLR_IRQFLAGS_CADDONE |
01033                                         RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
01034                                         //RFLR_IRQFLAGS_CADDETECTED
01035                                        );
01036 
01037             if (dioIrq[3]) 
01038             {
01039                 // DIO3=CADDone
01040                 SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO3_MASK ) | RFLR_DIOMAPPING1_DIO3_00 );
01041             } 
01042             else 
01043             {
01044                 // DIO0=CADDone
01045                 SX1278Write(REG_DIOMAPPING1, (SX1278Read(REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_10 );
01046             }
01047 
01048             settings.State = RF_CAD;
01049             SX1278SetOpMode(RFLR_OPMODE_CAD);
01050         }
01051         break;
01052     default:
01053         break;
01054     }
01055 }
01056 
01057 //-----------------------------------------------------------------------------
01058 void SX1278SetTxContinuousWave(uint32_t freq, int8_t power, uint16_t time)
01059 {
01060     uint32_t timeout = (uint32_t)(time);
01061 
01062     SX1278SetChannel(freq);
01063 
01064     SX1278SetTxConfig(MODEM_FSK, power, 0, 0, 4800, 0, 5, false, false, 0, 0, 0, timeout);
01065 
01066     SX1278Write(REG_PACKETCONFIG2, (SX1278Read(REG_PACKETCONFIG2) & RF_PACKETCONFIG2_DATAMODE_MASK));
01067     // Disable radio interrupts
01068     SX1278Write(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_11 | RF_DIOMAPPING1_DIO1_11);
01069     SX1278Write(REG_DIOMAPPING2, RF_DIOMAPPING2_DIO4_10 | RF_DIOMAPPING2_DIO5_10);
01070 
01071     settings.State = RF_TX_RUNNING;
01072     SX1278SetTimeout(TXTimeoutTimer, &OnTimeoutIrq, timeout);
01073     SX1278SetOpMode(RF_OPMODE_TRANSMITTER);
01074 }
01075 
01076 //-----------------------------------------------------------------------------
01077 int16_t SX1278GetRssi(RadioModems_t modem)
01078 {
01079     int16_t rssi = 0;
01080 
01081     switch (modem)
01082     {
01083         case MODEM_FSK:
01084             rssi = -(SX1278Read(REG_RSSIVALUE) >> 1);
01085             break;
01086         case MODEM_LORA:
01087             if (settings.Channel > RF_MID_BAND_THRESH)
01088             {
01089                 rssi = RSSI_OFFSET_HF + SX1278Read(REG_LR_RSSIVALUE);
01090             }
01091             else
01092             {
01093                 rssi = RSSI_OFFSET_LF + SX1278Read(REG_LR_RSSIVALUE);
01094             }
01095             break;
01096         default:
01097             rssi = -1;
01098             break;
01099     }
01100     return rssi;
01101 }
01102 
01103 //-----------------------------------------------------------------------------
01104 int32_t SX1278GetFrequencyError(RadioModems_t modem )
01105 {
01106     int32_t val = 0;
01107     
01108     if (modem != MODEM_LORA)
01109         return 0;
01110     
01111     val = (SX1278Read(REG_LR_FEIMSB) & 0b1111) << 16; // high word, 4 valid bits only
01112     val |= ((SX1278Read(REG_LR_FEIMID) << 8) | SX1278Read(REG_LR_FEILSB)); // high byte, low byte
01113     if (val & 0x80000) //convert sign bit
01114         val |= 0xfff00000;
01115     
01116     int32_t bandwidth = 0;
01117     for (int i = 0; i < (int)(sizeof(SX1278LoRaBandwidths) / sizeof(BandwidthMap_t)) -1; i++ ) {
01118         if (SX1278LoRaBandwidths[i].RegValue == settings.LoRa.Bandwidth) {
01119             bandwidth = SX1278LoRaBandwidths[i].bandwidth;
01120             break;
01121         }
01122     }
01123     if (!bandwidth)
01124         return 0;
01125     
01126     float bandWidthkHz = (float)bandwidth/1000;
01127     
01128     int32_t hz = (((float)val * (float)(1<<24)) / ((float)XTAL_FREQ)) * (bandWidthkHz / 500.0);
01129         
01130     return hz;
01131 }
01132 
01133 //-----------------------------------------------------------------------------
01134 void SX1278SetOpMode(uint8_t opMode)
01135 {
01136     // if(opMode == RF_OPMODE_SLEEP ) // TODO NOT USED on RA-01
01137     // {
01138     //     SX1278SetAntSwLowPower( true );
01139     // }
01140     // else
01141     // {
01142     //     // Enable TCXO if operating mode different from SLEEP.
01143     //     SX1278SetBoardTcxo( true );
01144     //     SX1278SetAntSwLowPower( false );
01145     //     SX1278SetAntSw( opMode );
01146     // }
01147     SX1278Write(REG_OPMODE, (SX1278Read(REG_OPMODE) & RF_OPMODE_MASK) | opMode);
01148 }
01149 
01150 //-----------------------------------------------------------------------------
01151 void SX1278SetModem(RadioModems_t modem)
01152 {
01153     if ((SX1278Read(REG_OPMODE) & RFLR_OPMODE_LONGRANGEMODE_ON) != 0)
01154     {
01155         settings.Modem = MODEM_LORA;
01156     }
01157     else
01158     {
01159         settings.Modem = MODEM_FSK;
01160     }
01161 
01162     if (settings.Modem == modem)
01163     {
01164         return;
01165     }
01166 
01167     settings.Modem = modem;
01168     switch (settings.Modem)
01169     {
01170         default:
01171         case MODEM_FSK:
01172             SX1278SetSleep();
01173             SX1278Write(REG_OPMODE, (SX1278Read(REG_OPMODE) & RFLR_OPMODE_LONGRANGEMODE_MASK) | RFLR_OPMODE_LONGRANGEMODE_OFF);
01174 
01175             SX1278Write(REG_DIOMAPPING1, 0x00);
01176             SX1278Write(REG_DIOMAPPING2, 0x30); // DIO5=ModeSX1278Ready
01177             break;
01178         case MODEM_LORA:
01179             SX1278SetSleep();
01180             SX1278Write(REG_OPMODE, (SX1278Read(REG_OPMODE) & RFLR_OPMODE_LONGRANGEMODE_MASK) | RFLR_OPMODE_LONGRANGEMODE_ON);
01181 
01182             SX1278Write(REG_DIOMAPPING1, 0x00);
01183             SX1278Write(REG_DIOMAPPING2, 0x00);
01184             break;
01185     }
01186 }
01187 
01188 //-----------------------------------------------------------------------------
01189 void SX1278SetMaxPayloadLength(RadioModems_t modem, uint8_t max)
01190 {
01191     SX1278SetModem(modem);
01192 
01193     switch (modem)
01194     {
01195     case MODEM_FSK:
01196         if (settings.Fsk.FixLen == false)
01197         {
01198             SX1278Write(REG_PAYLOADLENGTH, max);
01199         }
01200         break;
01201     case MODEM_LORA:
01202         SX1278Write(REG_LR_PAYLOADMAXLENGTH, max);
01203         break;
01204     }
01205 }
01206 
01207 //-----------------------------------------------------------------------------
01208 void SX1278SetPublicNetwork(bool enable)
01209 {
01210     SX1278SetModem(MODEM_LORA);
01211     settings.LoRa.PublicNetwork = enable;
01212     if (enable == true)
01213     {
01214         // Change LoRa modem SyncWord
01215         SX1278Write(REG_LR_SYNCWORD, LORA_MAC_PUBLIC_SYNCWORD);
01216     }
01217     else
01218     {
01219         // Change LoRa modem SyncWord
01220         SX1278Write(REG_LR_SYNCWORD, LORA_MAC_PRIVATE_SYNCWORD);
01221     }
01222 }
01223 
01224 //-----------------------------------------------------------------------------
01225 void OnTimeoutIrq()
01226 {
01227     switch (settings.State)
01228     {
01229     case RF_RX_RUNNING:
01230         if (settings.Modem == MODEM_FSK)
01231         {
01232             settings.FskPacketHandler.PreambleDetected = false;
01233             settings.FskPacketHandler.SyncWordDetected = false;
01234             settings.FskPacketHandler.NbBytes = 0;
01235             settings.FskPacketHandler.Size = 0;
01236 
01237             // Clear Irqs
01238             SX1278Write(REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
01239                                         RF_IRQFLAGS1_PREAMBLEDETECT |
01240                                         RF_IRQFLAGS1_SYNCADDRESSMATCH);
01241             SX1278Write(REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN);
01242 
01243             if (settings.Fsk.RxContinuous == true)
01244             {
01245                 // Continuous mode restart Rx chain
01246                 SX1278Write(REG_RXCONFIG, SX1278Read(REG_RXCONFIG) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK);
01247                 SX1278SetTimeout(RXTimeoutSyncWordTimer, &OnTimeoutIrq, settings.Fsk.RxSingleTimeout);
01248             }
01249             else
01250             {
01251                 settings.State = RF_IDLE;
01252                 SX1278SetTimeout(RXTimeoutSyncWordTimer, NULL, 0);
01253             }
01254         }
01255         if ((RadioEvents != NULL) && (RadioEvents->RxTimeout != NULL))
01256         {
01257             RadioEvents->RxTimeout();
01258         }
01259         break;
01260     case RF_TX_RUNNING:
01261         // Tx timeout shouldn't happen.
01262         // But it has been observed that when it happens it is a result of a corrupted SPI transfer
01263         // it depends on the platform design.
01264         // 
01265         // The workaround is to put the radio in a known state. Thus, we re-initialize it.
01266 
01267         // BEGIN WORKAROUND
01268 
01269         // Reset the radio
01270         SX1278Reset();
01271 
01272         // Calibrate Rx chain
01273         RxChainCalibration();
01274 
01275         // Initialize radio default values
01276         SX1278SetOpMode(RF_OPMODE_SLEEP);
01277         SX1278RadioRegistersInit();
01278 
01279         SX1278SetModem(MODEM_FSK);
01280 
01281         // Restore previous network type setting.
01282         SX1278SetPublicNetwork(settings.LoRa.PublicNetwork);
01283         // END WORKAROUND
01284 
01285         settings.State = RF_IDLE;
01286         if ((RadioEvents != NULL) && (RadioEvents->TxTimeout != NULL))
01287         {
01288             RadioEvents->TxTimeout();
01289         }
01290         break;
01291     default:
01292         break;
01293     }
01294 }
01295 
01296 //-----------------------------------------------------------------------------
01297 void SX1278SetRfTxPower(int8_t power)
01298 {
01299     uint8_t paConfig = 0;
01300     uint8_t paDac = 0;
01301 
01302     paConfig = SX1278Read(REG_PACONFIG);
01303     paDac = SX1278Read(REG_PADAC);
01304 
01305     paConfig = (paConfig & RF_PACONFIG_PASELECT_MASK) | SX1278GetPaSelect(settings.Channel);
01306     paConfig = (paConfig & RF_PACONFIG_MAX_POWER_MASK) | 0x70;
01307 
01308     if((paConfig & RF_PACONFIG_PASELECT_PABOOST) == RF_PACONFIG_PASELECT_PABOOST)
01309     {
01310         if(power > 17)
01311         {
01312             paDac = (paDac & RF_PADAC_20DBM_MASK) | RF_PADAC_20DBM_ON;
01313         }
01314         else
01315         {
01316             paDac = (paDac & RF_PADAC_20DBM_MASK) | RF_PADAC_20DBM_OFF;
01317         }
01318         if((paDac & RF_PADAC_20DBM_ON) == RF_PADAC_20DBM_ON)
01319         {
01320             if(power < 5)
01321             {
01322                 power = 5;
01323             }
01324             if(power > 20)
01325             {
01326                 power = 20;
01327             }
01328             paConfig = (paConfig & RF_PACONFIG_OUTPUTPOWER_MASK) | (uint8_t)((uint16_t)(power - 5) & 0x0F);
01329         }
01330         else
01331         {
01332             if(power < 2)
01333             {
01334                 power = 2;
01335             }
01336             if(power > 17)
01337             {
01338                 power = 17;
01339             }
01340             paConfig = (paConfig & RF_PACONFIG_OUTPUTPOWER_MASK) | (uint8_t)((uint16_t)(power - 2) & 0x0F);
01341         }
01342     }
01343     else
01344     {
01345         if(power < -1)
01346         {
01347             power = -1;
01348         }
01349         if(power > 14)
01350         {
01351             power = 14;
01352         }
01353         paConfig = (paConfig & RF_PACONFIG_OUTPUTPOWER_MASK) | (uint8_t)((uint16_t)(power + 1) & 0x0F);
01354     }
01355     SX1278Write(REG_PACONFIG, paConfig);
01356     SX1278Write(REG_PADAC, paDac);
01357 }
01358 
01359 //-----------------------------------------------------------------------------
01360 uint8_t SX1278GetPaSelect(uint32_t channel)
01361 {
01362     if(channel > RF_MID_BAND_THRESH)
01363     {
01364         return RF_PACONFIG_PASELECT_PABOOST;
01365     }
01366     else
01367     {
01368         return RF_PACONFIG_PASELECT_RFO;
01369     }
01370 }
01371 
01372 //-----------------------------------------------------------------------------
01373 bool SX1278CheckRfFrequency(uint32_t frequency)
01374 {
01375     // Implement check. Currently all frequencies are supported
01376     return true;
01377 }
01378 
01379 //-----------------------------------------------------------------------------
01380 void SX1278Write(uint8_t addr, uint8_t data)
01381 {
01382     SX1278WriteBuffer(addr, &data, 1);
01383 }
01384 
01385 //-----------------------------------------------------------------------------
01386 uint8_t SX1278Read(uint8_t addr)
01387 {
01388     uint8_t data;
01389     SX1278ReadBuffer(addr, &data, 1);
01390     return data;
01391 }
01392 
01393 //-----------------------------------------------------------------------------
01394 void SX1278WriteFifo(uint8_t *buffer, uint8_t size)
01395 {
01396     SX1278WriteBuffer(0, buffer, size);
01397 }
01398 
01399 //-----------------------------------------------------------------------------
01400 void SX1278ReadFifo(uint8_t *buffer, uint8_t size)
01401 {
01402     SX1278ReadBuffer(0, buffer, size);
01403 }
01404 
01405 
01406 //-----------------------------------------------------------------------------
01407 
01408 
01409 
01410 /**
01411  * ============================================================================
01412  * @brief Private functions definitions
01413  * ============================================================================
01414  */
01415 //-----------------------------------------------------------------------------
01416 void RxChainCalibration(void)
01417 {
01418     uint8_t regPaConfigInitVal;
01419     uint32_t initialFreq;
01420 
01421     // Save context
01422     regPaConfigInitVal = SX1278Read(REG_PACONFIG);
01423     initialFreq = (double)(((uint32_t)SX1278Read(REG_FRFMSB) << 16) |
01424                               ((uint32_t)SX1278Read(REG_FRFMID) << 8) |
01425                               ((uint32_t)SX1278Read(REG_FRFLSB))) * (double)FREQ_STEP;
01426 
01427     // Cut the PA just in case, RFO output, power = -1 dBm
01428     SX1278Write(REG_PACONFIG, 0x00);
01429 
01430     // Launch Rx chain calibration for LF band
01431     SX1278Write (REG_IMAGECAL, (SX1278Read(REG_IMAGECAL) & RF_IMAGECAL_IMAGECAL_MASK) | RF_IMAGECAL_IMAGECAL_START);
01432     while((SX1278Read(REG_IMAGECAL) & RF_IMAGECAL_IMAGECAL_RUNNING) == RF_IMAGECAL_IMAGECAL_RUNNING)
01433     {
01434     }
01435 
01436     // Sets a Frequency in HF band
01437     SX1278SetChannel(868000000);
01438 
01439     // Launch Rx chain calibration for HF band
01440     SX1278Write(REG_IMAGECAL, (SX1278Read(REG_IMAGECAL) & RF_IMAGECAL_IMAGECAL_MASK) | RF_IMAGECAL_IMAGECAL_START);
01441     while((SX1278Read(REG_IMAGECAL) & RF_IMAGECAL_IMAGECAL_RUNNING) == RF_IMAGECAL_IMAGECAL_RUNNING)
01442     {
01443     }
01444 
01445     // Restore context
01446     SX1278Write(REG_PACONFIG, regPaConfigInitVal);
01447     SX1278SetChannel(initialFreq);
01448 }
01449 
01450 //-----------------------------------------------------------------------------
01451 uint8_t GetFskBandwidthRegValue(uint32_t bandwidth)
01452 {
01453     uint8_t i;
01454 
01455     for (i = 0; i < (sizeof(SX1278FskBandwidths) / sizeof(BandwidthMap_t)) - 1; i++)
01456     {
01457         if ((bandwidth >= SX1278FskBandwidths[i].bandwidth) && (bandwidth < SX1278FskBandwidths[i + 1].bandwidth))
01458         {
01459             return SX1278FskBandwidths[i].RegValue;
01460         }
01461     }
01462     // ERROR: Value not found
01463     while(1);
01464 }
01465 
01466 //-----------------------------------------------------------------------------
01467 uint8_t GetLoRaBandwidthRegValue(uint32_t bandwidth)
01468 {
01469     uint8_t i;
01470     
01471     for (i = 0; i < (sizeof(SX1278LoRaBandwidths) / sizeof(BandwidthMap_t)) - 1; i++)
01472     {
01473         if ((bandwidth >= SX1278LoRaBandwidths[i].bandwidth) && (bandwidth < SX1278LoRaBandwidths[i + 1].bandwidth))
01474         {
01475             return SX1278LoRaBandwidths[i].RegValue;
01476         }
01477     }
01478     // ERROR: Value not found
01479     while(1);
01480 }
01481 
01482 //-----------------------------------------------------------------------------
01483 void OnDio0Irq()
01484 {
01485     volatile uint8_t irqFlags = 0;
01486 
01487     switch (settings.State)
01488     {
01489         case RF_RX_RUNNING:
01490             //TimerStop(&RxTimeoutTimer);
01491             // RxDone interrupt
01492             switch (settings.Modem)
01493             {
01494             case MODEM_FSK:
01495                 if (settings.Fsk.CrcOn == true)
01496                 {
01497                     irqFlags = SX1278Read(REG_IRQFLAGS2);
01498                     if ((irqFlags & RF_IRQFLAGS2_CRCOK) != RF_IRQFLAGS2_CRCOK)
01499                     {
01500                         // Clear Irqs
01501                         SX1278Write(REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
01502                                                    RF_IRQFLAGS1_PREAMBLEDETECT |
01503                                                    RF_IRQFLAGS1_SYNCADDRESSMATCH);
01504                         SX1278Write(REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN);
01505 
01506                         SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
01507 
01508                         if (settings.Fsk.RxContinuous == false)
01509                         {
01510                             SX1278SetTimeout(RXTimeoutSyncWordTimer, NULL, 0);
01511                             settings.State = RF_IDLE;
01512                         }
01513                         else
01514                         {
01515                             // Continuous mode restart Rx chain
01516                             SX1278Write(REG_RXCONFIG, SX1278Read(REG_RXCONFIG) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK);
01517                             SX1278SetTimeout(RXTimeoutSyncWordTimer, &OnTimeoutIrq, settings.Fsk.RxSingleTimeout);
01518                         }
01519 
01520                         if ((RadioEvents != NULL) && (RadioEvents->RxError != NULL))
01521                         {
01522                             RadioEvents->RxError();
01523                         }
01524                         settings.FskPacketHandler.PreambleDetected = false;
01525                         settings.FskPacketHandler.SyncWordDetected = false;
01526                         settings.FskPacketHandler.NbBytes = 0;
01527                         settings.FskPacketHandler.Size = 0;
01528                         break;
01529                     }
01530                 }
01531 
01532                 // SX1278Read received packet size
01533                 if ((settings.FskPacketHandler.Size == 0) && (settings.FskPacketHandler.NbBytes == 0))
01534                 {
01535                     if (settings.Fsk.FixLen == false)
01536                     {
01537                         SX1278ReadFifo((uint8_t*)&settings.FskPacketHandler.Size, 1);
01538                     }
01539                     else
01540                     {
01541                         settings.FskPacketHandler.Size = SX1278Read(REG_PAYLOADLENGTH);
01542                     }
01543                     SX1278ReadFifo(RxTxBuffer + settings.FskPacketHandler.NbBytes, settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01544                     settings.FskPacketHandler.NbBytes += (settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01545                 }
01546                 else
01547                 {
01548                     SX1278ReadFifo(RxTxBuffer + settings.FskPacketHandler.NbBytes, settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01549                     settings.FskPacketHandler.NbBytes += (settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01550                 }
01551 
01552                 SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
01553 
01554                 if (settings.Fsk.RxContinuous == false)
01555                 {
01556                     settings.State = RF_IDLE;
01557                     SX1278SetTimeout(RXTimeoutSyncWordTimer, NULL, 0);
01558                 }
01559                 else
01560                 {
01561                     // Continuous mode restart Rx chain
01562                     SX1278Write(REG_RXCONFIG, SX1278Read(REG_RXCONFIG) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK);
01563                     SX1278SetTimeout(RXTimeoutSyncWordTimer, &OnTimeoutIrq, settings.Fsk.RxSingleTimeout);
01564                 }
01565 
01566                 if ((RadioEvents != NULL) && (RadioEvents->RxDone != NULL))
01567                 {
01568                     RadioEvents->RxDone(RxTxBuffer, settings.FskPacketHandler.Size, settings.FskPacketHandler.RssiValue, 0);
01569                 }
01570                 settings.FskPacketHandler.PreambleDetected = false;
01571                 settings.FskPacketHandler.SyncWordDetected = false;
01572                 settings.FskPacketHandler.NbBytes = 0;
01573                 settings.FskPacketHandler.Size = 0;
01574                 break;
01575             case MODEM_LORA:
01576                 {
01577                     // Clear Irq
01578                     SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE);
01579 
01580                     irqFlags = SX1278Read(REG_LR_IRQFLAGS);
01581                     if ((irqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK) == RFLR_IRQFLAGS_PAYLOADCRCERROR)
01582                     {
01583                         // Clear Irq
01584                         SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR);
01585 
01586                         if (settings.LoRa.RxContinuous == false)
01587                         {
01588                             settings.State = RF_IDLE;
01589                         }
01590                         SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
01591 
01592                         if ((RadioEvents != NULL) && (RadioEvents->RxError != NULL))
01593                         {
01594                             RadioEvents->RxError();
01595                         }
01596                         break;
01597                     }
01598                     // Returns SNR value [dB] rounded to the nearest integer value
01599                     settings.LoRaPacketHandler.SnrValue = (((int8_t)SX1278Read(REG_LR_PKTSNRVALUE)) + 2) >> 2;
01600                     int16_t rssi = SX1278Read(REG_LR_PKTRSSIVALUE);
01601                     if (settings.LoRaPacketHandler.SnrValue < 0)
01602                     {
01603                         if (settings.Channel > RF_MID_BAND_THRESH)
01604                         {
01605                             settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 ) +
01606                                                                    settings.LoRaPacketHandler.SnrValue;
01607                         }
01608                         else
01609                         {
01610                             settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 ) +
01611                                                                    settings.LoRaPacketHandler.SnrValue;
01612                         }
01613                     }
01614                     else
01615                     {
01616                         if(settings.Channel > RF_MID_BAND_THRESH)
01617                         {
01618                             settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 );
01619                         }
01620                         else
01621                         {
01622                             settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 );
01623                         }
01624                     }
01625 
01626                     settings.LoRaPacketHandler.Size = SX1278Read( REG_LR_RXNBBYTES);
01627                     SX1278Write( REG_LR_FIFOADDRPTR, SX1278Read( REG_LR_FIFORXCURRENTADDR));
01628                     SX1278ReadFifo( RxTxBuffer, settings.LoRaPacketHandler.Size);
01629 
01630                     if(settings.LoRa.RxContinuous == false)
01631                     {
01632                         settings.State = RF_IDLE;
01633                     }
01634 
01635                     SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
01636 
01637                     if ((RadioEvents != NULL) && (RadioEvents->RxDone != NULL))
01638                     {
01639                         RadioEvents->RxDone(RxTxBuffer, settings.LoRaPacketHandler.Size, settings.LoRaPacketHandler.RssiValue, settings.LoRaPacketHandler.SnrValue);
01640                     }
01641                 }
01642                 break;
01643             default:
01644                 break;
01645             }
01646             break;
01647         case RF_TX_RUNNING:
01648             SX1278SetTimeout(TXTimeoutTimer, NULL, 0);
01649             // TxDone interrupt
01650             switch (settings.Modem)
01651             {
01652             case MODEM_LORA:
01653                 // Clear Irq
01654                 SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE);
01655                 // Intentional fall through
01656             case MODEM_FSK:
01657             default:
01658                 settings.State = RF_IDLE;
01659                 if ((RadioEvents != NULL) && (RadioEvents->TxDone != NULL))
01660                 {
01661                     RadioEvents->TxDone();
01662                 }
01663                 break;
01664             }
01665             break;
01666         default:
01667             break;
01668     }
01669 }
01670 
01671 //-----------------------------------------------------------------------------
01672 void OnDio1Irq()
01673 {
01674     switch (settings.State)
01675     {
01676         case RF_RX_RUNNING:
01677             switch (settings.Modem)
01678             {
01679                 case MODEM_FSK:
01680                     // Stop Timer
01681                     SX1278SetTimeout(RXTimeoutSyncWordTimer, NULL, 0);
01682                     
01683                     // FifoLevel interrupt
01684                     // SX1278Read received packet size
01685                     if ((settings.FskPacketHandler.Size == 0) && (settings.FskPacketHandler.NbBytes == 0))
01686                     {
01687                         if (settings.Fsk.FixLen == false)
01688                         {
01689                             SX1278ReadFifo((uint8_t*)&settings.FskPacketHandler.Size, 1);
01690                         }
01691                         else
01692                         {
01693                             settings.FskPacketHandler.Size = SX1278Read(REG_PAYLOADLENGTH);
01694                         }
01695                     }
01696                     // ERRATA 3.1 - PayloadReady Set for 31.25ns if FIFO is Empty
01697                     //
01698                     //              When FifoLevel interrupt is used to offload the
01699                     //              FIFO, the microcontroller should  monitor  both
01700                     //              PayloadReady  and FifoLevel interrupts, and
01701                     //              read only (FifoThreshold-1) bytes off the FIFO
01702                     //              when FifoLevel fires
01703                     if ((settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes) > settings.FskPacketHandler.FifoThresh)
01704                     {
01705                         SX1278ReadFifo((RxTxBuffer + settings.FskPacketHandler.NbBytes), settings.FskPacketHandler.FifoThresh);
01706                         settings.FskPacketHandler.NbBytes += settings.FskPacketHandler.FifoThresh;
01707                     }
01708                     else
01709                     {
01710                         SX1278ReadFifo((RxTxBuffer + settings.FskPacketHandler.NbBytes), settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01711                         settings.FskPacketHandler.NbBytes += (settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01712                     }
01713                     break;
01714                 case MODEM_LORA:
01715                     // Sync time out
01716                     SX1278SetTimeout(RXTimeoutTimer, NULL, 0);
01717                     // Clear Irq
01718                     SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT);
01719 
01720                     settings.State = RF_IDLE;
01721                     if ((RadioEvents != NULL) && (RadioEvents->RxTimeout != NULL))
01722                     {
01723                         RadioEvents->RxTimeout();
01724                     }
01725                     break;
01726                 default:
01727                     break;
01728                 }
01729                 break;
01730             case RF_TX_RUNNING:
01731                 switch (settings.Modem)
01732                 {
01733                 case MODEM_FSK:
01734                     // FifoEmpty interrupt
01735                     if ((settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes) > settings.FskPacketHandler.ChunkSize)
01736                     {
01737                         SX1278WriteFifo((RxTxBuffer + settings.FskPacketHandler.NbBytes), settings.FskPacketHandler.ChunkSize);
01738                         settings.FskPacketHandler.NbBytes += settings.FskPacketHandler.ChunkSize;
01739                     }
01740                     else
01741                     {
01742                         // SX1278Write the last chunk of data
01743                         SX1278WriteFifo(RxTxBuffer + settings.FskPacketHandler.NbBytes, settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes);
01744                         settings.FskPacketHandler.NbBytes += settings.FskPacketHandler.Size - settings.FskPacketHandler.NbBytes;
01745                     }
01746                     break;
01747                 case MODEM_LORA:
01748                     break;
01749                 default:
01750                     break;
01751                 }
01752             break;
01753         default:
01754             break;
01755     }
01756 }
01757 
01758 //-----------------------------------------------------------------------------
01759 void OnDio2Irq()
01760 {
01761     switch (settings.State)
01762     {
01763         case RF_RX_RUNNING:
01764             switch (settings.Modem)
01765             {
01766                 case MODEM_FSK:
01767                     // Checks if DIO4 is connected. If it is not PreambleDtected is set to true.
01768                     if (dioIrq[4] == NULL)
01769                     {
01770                         settings.FskPacketHandler.PreambleDetected = true;
01771                     }
01772 
01773                     if ((settings.FskPacketHandler.PreambleDetected == true) && (settings.FskPacketHandler.SyncWordDetected == false))
01774                     {
01775                         SX1278SetTimeout(RXTimeoutSyncWordTimer, NULL, 0);
01776 
01777                         settings.FskPacketHandler.SyncWordDetected = true;
01778 
01779                         settings.FskPacketHandler.RssiValue = -(SX1278Read(REG_RSSIVALUE) >> 1);
01780 
01781                         settings.FskPacketHandler.AfcValue = (int32_t)(double)(((uint16_t)SX1278Read(REG_AFCMSB) << 8) |
01782                                                                             (uint16_t)SX1278Read(REG_AFCLSB)) *
01783                                                                             (double)FREQ_STEP;
01784                         settings.FskPacketHandler.RxGain = (SX1278Read(REG_LNA) >> 5) & 0x07;
01785                     }
01786                     break;
01787                 case MODEM_LORA:
01788                     if (settings.LoRa.FreqHopOn == true)
01789                     {
01790                         // Clear Irq
01791                         SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL);
01792 
01793                         if ((RadioEvents != NULL) && (RadioEvents->FhssChangeChannel != NULL))
01794                         {
01795                             RadioEvents->FhssChangeChannel((SX1278Read(REG_LR_HOPCHANNEL) & RFLR_HOPCHANNEL_CHANNEL_MASK));
01796                         }
01797                     }
01798                     break;
01799                 default:
01800                     break;
01801             }
01802             break;
01803         case RF_TX_RUNNING:
01804             switch (settings.Modem)
01805             {
01806                 case MODEM_FSK:
01807                     break;
01808                 case MODEM_LORA:
01809                     if (settings.LoRa.FreqHopOn == true)
01810                     {
01811                         // Clear Irq
01812                         SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL);
01813 
01814                         if ((RadioEvents != NULL) && (RadioEvents->FhssChangeChannel != NULL))
01815                         {
01816                             RadioEvents->FhssChangeChannel((SX1278Read(REG_LR_HOPCHANNEL) & RFLR_HOPCHANNEL_CHANNEL_MASK));
01817                         }
01818                     }
01819                     break;
01820                 default:
01821                     break;
01822             }
01823             break;
01824         default:
01825             break;
01826     }
01827 }
01828 
01829 //-----------------------------------------------------------------------------
01830 void OnDio3Irq()
01831 {
01832     switch (settings.Modem)
01833     {
01834         case MODEM_FSK:
01835             break;
01836         case MODEM_LORA:
01837             if ((SX1278Read(REG_LR_IRQFLAGS) & RFLR_IRQFLAGS_CADDETECTED) == RFLR_IRQFLAGS_CADDETECTED)
01838             {
01839                 // Clear Irq
01840                 SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED | RFLR_IRQFLAGS_CADDONE);
01841                 if ((RadioEvents != NULL) && (RadioEvents->CadDone != NULL))
01842                 {
01843                     RadioEvents->CadDone(true);
01844                 }
01845             }
01846             else
01847             {
01848                 // Clear Irq
01849                 SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE);
01850                 if ((RadioEvents != NULL) && (RadioEvents->CadDone != NULL))
01851                 {
01852                     RadioEvents->CadDone(false);
01853                 }
01854             }
01855             break;
01856         default:
01857             break;
01858     }
01859 }
01860 
01861 //-----------------------------------------------------------------------------
01862 void OnDio4Irq()
01863 {
01864     switch (settings.Modem)
01865     {
01866     case MODEM_FSK:
01867         {
01868             if (settings.FskPacketHandler.PreambleDetected == false)
01869             {
01870                 settings.FskPacketHandler.PreambleDetected = true;
01871             }
01872         }
01873         break;
01874     case MODEM_LORA:
01875         break;
01876     default:
01877         break;
01878     }
01879 }
01880 
01881 //-----------------------------------------------------------------------------
01882 void OnDio5Irq()
01883 {
01884     switch (settings.Modem)
01885     {
01886     case MODEM_FSK:
01887         break;
01888     case MODEM_LORA:
01889         break;
01890     default:
01891         break;
01892     }
01893 }
01894 
01895 //-----------------------------------------------------------------------------