12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868 |
- /*
- / _____) _ | |
- ( (____ _____ ____ _| |_ _____ ____| |__
- \____ \| ___ | (_ _) ___ |/ ___) _ \
- _____) ) ____| | | || |_| ____( (___| | | |
- (______/|_____)_|_|_| \__)_____)\____)_| |_|
- (C)2013 Semtech
- Description: Generic SX1276 driver implementation
- License: Revised BSD License, see LICENSE.TXT file include in the project
- Maintainer: Miguel Luis, Gregory Cristian and Wael Guibene
- */
- #include <math.h>
- #include <string.h>
- #include <math.h>
- #include "radio.h"
- #include "sx1276.h"
- #include "sx1276-board.h"
- /*
- * Local types definition
- */
- /*!
- * Radio registers definition
- */
- typedef struct
- {
- RadioModems_t Modem;
- uint8_t Addr;
- uint8_t Value;
- }RadioRegisters_t;
- /*!
- * FSK bandwidth definition
- */
- typedef struct
- {
- uint32_t bandwidth;
- uint8_t RegValue;
- }FskBandwidth_t;
- /*
- * Private functions prototypes
- */
- /*!
- * Performs the Rx chain calibration for LF and HF bands
- * \remark Must be called just after the reset so all registers are at their
- * default values
- */
- static void RxChainCalibration( void );
- /*!
- * \brief Resets the SX1276
- */
- void SX1276Reset( void );
- /*!
- * \brief Sets the SX1276 in transmission mode for the given time
- * \param [IN] timeout Transmission timeout [ms] [0: continuous, others timeout]
- */
- void SX1276SetTx( uint32_t timeout );
- /*!
- * \brief Writes the buffer contents to the SX1276 FIFO
- *
- * \param [IN] buffer Buffer containing data to be put on the FIFO.
- * \param [IN] size Number of bytes to be written to the FIFO
- */
- void SX1276WriteFifo( uint8_t *buffer, uint8_t size );
- /*!
- * \brief Reads the contents of the SX1276 FIFO
- *
- * \param [OUT] buffer Buffer where to copy the FIFO read data.
- * \param [IN] size Number of bytes to be read from the FIFO
- */
- void SX1276ReadFifo( uint8_t *buffer, uint8_t size );
- /*!
- * \brief Sets the SX1276 operating mode
- *
- * \param [IN] opMode New operating mode
- */
- void SX1276SetOpMode( uint8_t opMode );
- /*
- * SX1276 DIO IRQ callback functions prototype
- */
- /*!
- * \brief DIO 0 IRQ callback
- */
- void SX1276OnDio0Irq( void );
- /*!
- * \brief DIO 1 IRQ callback
- */
- void SX1276OnDio1Irq( void );
- /*!
- * \brief DIO 2 IRQ callback
- */
- void SX1276OnDio2Irq( void );
- /*!
- * \brief DIO 3 IRQ callback
- */
- void SX1276OnDio3Irq( void );
- /*!
- * \brief DIO 4 IRQ callback
- */
- void SX1276OnDio4Irq( void );
- /*!
- * \brief DIO 5 IRQ callback
- */
- void SX1276OnDio5Irq( void );
- /*!
- * \brief Tx & Rx timeout timer callback
- */
- void SX1276OnTimeoutIrq( void );
- /*
- * Private global constants
- */
- /*!
- * Radio hardware registers initialization
- *
- * \remark RADIO_INIT_REGISTERS_VALUE is defined in sx1276-board.h file
- */
- const RadioRegisters_t RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE;
- /*!
- * Constant values need to compute the RSSI value
- */
- #define RSSI_OFFSET_LF -164
- #define RSSI_OFFSET_HF -157
- /*!
- * Precomputed FSK bandwidth registers values
- */
- const FskBandwidth_t FskBandwidths[] =
- {
- { 2600 , 0x17 },
- { 3100 , 0x0F },
- { 3900 , 0x07 },
- { 5200 , 0x16 },
- { 6300 , 0x0E },
- { 7800 , 0x06 },
- { 10400 , 0x15 },
- { 12500 , 0x0D },
- { 15600 , 0x05 },
- { 20800 , 0x14 },
- { 25000 , 0x0C },
- { 31300 , 0x04 },
- { 41700 , 0x13 },
- { 50000 , 0x0B },
- { 62500 , 0x03 },
- { 83333 , 0x12 },
- { 100000, 0x0A },
- { 125000, 0x02 },
- { 166700, 0x11 },
- { 200000, 0x09 },
- { 250000, 0x01 },
- { 300000, 0x00 }, // Invalid Badwidth
- };
- /*
- * Private global variables
- */
- /*!
- * Radio callbacks variable
- */
- static RadioEvents_t *RadioEvents;
- /*!
- * Reception buffer
- */
- static uint8_t RxTxBuffer[RX_BUFFER_SIZE];
- /*
- * Public global variables
- */
- /*!
- * Radio hardware and global parameters
- */
- SX1276_t SX1276;
- /*!
- * Hardware DIO IRQ callback initialization
- */
- DioIrqHandler *DioIrq[] = { SX1276OnDio0Irq, SX1276OnDio1Irq,
- SX1276OnDio2Irq, SX1276OnDio3Irq,
- SX1276OnDio4Irq, NULL };
- /*!
- * Flag used to set the RF switch control pins in low power mode when the radio is not active.
- */
- static bool RadioIsActive = false;
- void SX1276SetAntSwLowPower( bool status )
- {
- if( RadioIsActive != status )
- {
- RadioIsActive = status;
-
- if( status == false )
- {
- SX1276AntSwInit( );
- }
- else
- {
- SX1276AntSwDeInit( );
- }
- }
- }
- /*
- * Radio driver functions implementation
- */
- void SX1276Init( RadioEvents_t *events )
- {
- uint8_t i;
- RadioEvents = events;
- // Initialize driver timeout timers
- SX1276TimerInit();
- SX1276IoInit();
- SX1276Reset( );
- RxChainCalibration( );
- SX1276SetOpMode( RF_OPMODE_SLEEP );
- SX1276IoIrqInit( DioIrq );
- for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ )
- {
- SX1276SetModem( RadioRegsInit[i].Modem );
- SX1276Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value );
- }
- SX1276SetModem( MODEM_FSK );
- SX1276.Settings.State = RF_IDLE;
- }
- RadioState_t SX1276GetStatus( void )
- {
- return SX1276.Settings.State;
- }
- void SX1276SetChannel( uint32_t freq )
- {
- SX1276.Settings.Channel = freq;
- freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
- SX1276Write( REG_FRFMSB, ( uint8_t )( ( freq >> 16 ) & 0xFF ) );
- SX1276Write( REG_FRFMID, ( uint8_t )( ( freq >> 8 ) & 0xFF ) );
- SX1276Write( REG_FRFLSB, ( uint8_t )( freq & 0xFF ) );
- }
- bool SX1276IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh )
- {
- int16_t rssi = 0;
- SX1276SetModem( modem );
- SX1276SetChannel( freq );
- SX1276SetOpMode( RF_OPMODE_RECEIVER );
- SX1276DelayMs( 1 );
- rssi = SX1276ReadRssi( modem );
- SX1276SetSleep( );
- if( rssi > rssiThresh )
- {
- return false;
- }
- return true;
- }
- uint32_t SX1276Random( void )
- {
- uint8_t i;
- uint32_t rnd = 0;
- /*
- * Radio setup for random number generation
- */
- // Set LoRa modem ON
- SX1276SetModem( MODEM_LORA );
- // Disable LoRa modem interrupts
- SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
- RFLR_IRQFLAGS_RXDONE |
- RFLR_IRQFLAGS_PAYLOADCRCERROR |
- RFLR_IRQFLAGS_VALIDHEADER |
- RFLR_IRQFLAGS_TXDONE |
- RFLR_IRQFLAGS_CADDONE |
- RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
- RFLR_IRQFLAGS_CADDETECTED );
- // Set radio in continuous reception
- SX1276SetOpMode( RF_OPMODE_RECEIVER );
- for( i = 0; i < 32; i++ )
- {
- SX1276DelayMs( 1 );
- // Unfiltered RSSI value reading. Only takes the LSB value
- rnd |= ( ( uint32_t )SX1276Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) << i;
- }
- SX1276SetSleep( );
- return rnd;
- }
- /*!
- * Performs the Rx chain calibration for LF and HF bands
- * \remark Must be called just after the reset so all registers are at their
- * default values
- */
- static void RxChainCalibration( void )
- {
- uint8_t regPaConfigInitVal;
- uint32_t initialFreq;
- // Save context
- regPaConfigInitVal = SX1276Read( REG_PACONFIG );
- initialFreq = ( double )( ( ( uint32_t )SX1276Read( REG_FRFMSB ) << 16 ) |
- ( ( uint32_t )SX1276Read( REG_FRFMID ) << 8 ) |
- ( ( uint32_t )SX1276Read( REG_FRFLSB ) ) ) * ( double )FREQ_STEP;
- // Cut the PA just in case, RFO output, power = -1 dBm
- SX1276Write( REG_PACONFIG, 0x00 );
- // Launch Rx chain calibration for LF band
- SX1276Write( REG_IMAGECAL, ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
- while( ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
- {
- }
- // Sets a Frequency in HF band
- SX1276SetChannel( 868000000 );
- // Launch Rx chain calibration for HF band
- SX1276Write( REG_IMAGECAL, ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
- while( ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
- {
- }
- // Restore context
- SX1276Write( REG_PACONFIG, regPaConfigInitVal );
- SX1276SetChannel( initialFreq );
- }
- /*!
- * Returns the known FSK bandwidth registers value
- *
- * \param [IN] bandwidth Bandwidth value in Hz
- * \retval regValue Bandwidth register value.
- */
- static uint8_t GetFskBandwidthRegValue( uint32_t bandwidth )
- {
- uint8_t i;
- for( i = 0; i < ( sizeof( FskBandwidths ) / sizeof( FskBandwidth_t ) ) - 1; i++ )
- {
- if( ( bandwidth >= FskBandwidths[i].bandwidth ) && ( bandwidth < FskBandwidths[i + 1].bandwidth ) )
- {
- return FskBandwidths[i].RegValue;
- }
- }
- // ERROR: Value not found
- while( 1 );
- }
- void SX1276SetRxConfig( RadioModems_t modem, uint32_t bandwidth,
- uint32_t datarate, uint8_t coderate,
- uint32_t bandwidthAfc, uint16_t preambleLen,
- uint16_t symbTimeout, bool fixLen,
- uint8_t payloadLen,
- bool crcOn, bool freqHopOn, uint8_t hopPeriod,
- bool iqInverted, bool rxContinuous )
- {
- SX1276SetModem( modem );
- switch( modem )
- {
- case MODEM_FSK:
- {
- SX1276.Settings.Fsk.Bandwidth = bandwidth;
- SX1276.Settings.Fsk.Datarate = datarate;
- SX1276.Settings.Fsk.BandwidthAfc = bandwidthAfc;
- SX1276.Settings.Fsk.FixLen = fixLen;
- SX1276.Settings.Fsk.PayloadLen = payloadLen;
- SX1276.Settings.Fsk.CrcOn = crcOn;
- SX1276.Settings.Fsk.IqInverted = iqInverted;
- SX1276.Settings.Fsk.RxContinuous = rxContinuous;
- SX1276.Settings.Fsk.PreambleLen = preambleLen;
- datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
- SX1276Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
- SX1276Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
- SX1276Write( REG_RXBW, GetFskBandwidthRegValue( bandwidth ) );
- SX1276Write( REG_AFCBW, GetFskBandwidthRegValue( bandwidthAfc ) );
- SX1276Write( REG_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
- SX1276Write( REG_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
- if( fixLen == 1 )
- {
- SX1276Write( REG_PAYLOADLENGTH, payloadLen );
- }
- else
- {
- SX1276Write( REG_PAYLOADLENGTH, 0xFF ); // Set payload length to the maximum
- }
- SX1276Write( REG_PACKETCONFIG1,
- ( SX1276Read( REG_PACKETCONFIG1 ) &
- RF_PACKETCONFIG1_CRC_MASK &
- RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
- ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
- ( crcOn << 4 ) );
- }
- break;
- case MODEM_LORA:
- {
- if( bandwidth > 2 )
- {
- // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
- while( 1 );
- }
- bandwidth += 7;
- SX1276.Settings.LoRa.Bandwidth = bandwidth;
- SX1276.Settings.LoRa.Datarate = datarate;
- SX1276.Settings.LoRa.Coderate = coderate;
- SX1276.Settings.LoRa.PreambleLen = preambleLen;
- SX1276.Settings.LoRa.FixLen = fixLen;
- SX1276.Settings.LoRa.PayloadLen = payloadLen;
- SX1276.Settings.LoRa.CrcOn = crcOn;
- SX1276.Settings.LoRa.FreqHopOn = freqHopOn;
- SX1276.Settings.LoRa.HopPeriod = hopPeriod;
- SX1276.Settings.LoRa.IqInverted = iqInverted;
- SX1276.Settings.LoRa.RxContinuous = rxContinuous;
- if( datarate > 12 )
- {
- datarate = 12;
- }
- else if( datarate < 6 )
- {
- datarate = 6;
- }
- if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
- ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
- {
- SX1276.Settings.LoRa.LowDatarateOptimize = 0x01;
- }
- else
- {
- SX1276.Settings.LoRa.LowDatarateOptimize = 0x00;
- }
- SX1276Write( REG_LR_MODEMCONFIG1,
- ( SX1276Read( REG_LR_MODEMCONFIG1 ) &
- RFLR_MODEMCONFIG1_BW_MASK &
- RFLR_MODEMCONFIG1_CODINGRATE_MASK &
- RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
- ( bandwidth << 4 ) | ( coderate << 1 ) |
- fixLen );
- SX1276Write( REG_LR_MODEMCONFIG2,
- ( SX1276Read( REG_LR_MODEMCONFIG2 ) &
- RFLR_MODEMCONFIG2_SF_MASK &
- RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK &
- RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) |
- ( datarate << 4 ) | ( crcOn << 2 ) |
- ( ( symbTimeout >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) );
- SX1276Write( REG_LR_MODEMCONFIG3,
- ( SX1276Read( REG_LR_MODEMCONFIG3 ) &
- RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
- ( SX1276.Settings.LoRa.LowDatarateOptimize << 3 ) );
- SX1276Write( REG_LR_SYMBTIMEOUTLSB, ( uint8_t )( symbTimeout & 0xFF ) );
- SX1276Write( REG_LR_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
- SX1276Write( REG_LR_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
- if( fixLen == 1 )
- {
- SX1276Write( REG_LR_PAYLOADLENGTH, payloadLen );
- }
- if( SX1276.Settings.LoRa.FreqHopOn == true )
- {
- SX1276Write( REG_LR_PLLHOP, ( SX1276Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
- SX1276Write( REG_LR_HOPPERIOD, SX1276.Settings.LoRa.HopPeriod );
- }
- if( ( bandwidth == 9 ) && ( SX1276.Settings.Channel > RF_MID_BAND_THRESH ) )
- {
- // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
- SX1276Write( REG_LR_TEST36, 0x02 );
- SX1276Write( REG_LR_TEST3A, 0x64 );
- }
- else if( bandwidth == 9 )
- {
- // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
- SX1276Write( REG_LR_TEST36, 0x02 );
- SX1276Write( REG_LR_TEST3A, 0x7F );
- }
- else
- {
- // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
- SX1276Write( REG_LR_TEST36, 0x03 );
- }
- if( datarate == 6 )
- {
- SX1276Write( REG_LR_DETECTOPTIMIZE,
- ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
- RFLR_DETECTIONOPTIMIZE_MASK ) |
- RFLR_DETECTIONOPTIMIZE_SF6 );
- SX1276Write( REG_LR_DETECTIONTHRESHOLD,
- RFLR_DETECTIONTHRESH_SF6 );
- }
- else
- {
- SX1276Write( REG_LR_DETECTOPTIMIZE,
- ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
- RFLR_DETECTIONOPTIMIZE_MASK ) |
- RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
- SX1276Write( REG_LR_DETECTIONTHRESHOLD,
- RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
- }
- }
- break;
- }
- }
- void SX1276SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
- uint32_t bandwidth, uint32_t datarate,
- uint8_t coderate, uint16_t preambleLen,
- bool fixLen, bool crcOn, bool freqHopOn,
- uint8_t hopPeriod, bool iqInverted, uint32_t timeout )
- {
- uint8_t paConfig = 0;
- uint8_t paDac = 0;
- SX1276SetModem( modem );
- paConfig = SX1276Read( REG_PACONFIG );
- paDac = SX1276Read( REG_PADAC );
- //paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | SX1276GetPaSelect( SX1276.Settings.Channel );
- //paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
- paConfig =0x80; //默认使用PABOOST引脚
- if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
- {
- if( power > 17 )
- {
- paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
- }
- else
- {
- paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
- }
- if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
- {
- if( power < 5 )
- {
- power = 5;
- }
- if( power > 20 )
- {
- power = 20;
- }
- paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
- }
- else
- {
- if( power < 2 )
- {
- power = 2;
- }
- if( power > 17 )
- {
- power = 17;
- }
- paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
- }
- }
- else
- {
- if( power < -1 )
- {
- power = -1;
- }
- if( power > 14 )
- {
- power = 14;
- }
- paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
- }
- SX1276Write( REG_PACONFIG, paConfig );
- SX1276Write( REG_PADAC, paDac );
- switch( modem )
- {
- case MODEM_FSK:
- {
- SX1276.Settings.Fsk.Power = power;
- SX1276.Settings.Fsk.Fdev = fdev;
- SX1276.Settings.Fsk.Bandwidth = bandwidth;
- SX1276.Settings.Fsk.Datarate = datarate;
- SX1276.Settings.Fsk.PreambleLen = preambleLen;
- SX1276.Settings.Fsk.FixLen = fixLen;
- SX1276.Settings.Fsk.CrcOn = crcOn;
- SX1276.Settings.Fsk.IqInverted = iqInverted;
- SX1276.Settings.Fsk.TxTimeout = timeout;
- fdev = ( uint16_t )( ( double )fdev / ( double )FREQ_STEP );
- SX1276Write( REG_FDEVMSB, ( uint8_t )( fdev >> 8 ) );
- SX1276Write( REG_FDEVLSB, ( uint8_t )( fdev & 0xFF ) );
- datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
- SX1276Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
- SX1276Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
- SX1276Write( REG_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
- SX1276Write( REG_PREAMBLELSB, preambleLen & 0xFF );
- SX1276Write( REG_PACKETCONFIG1,
- ( SX1276Read( REG_PACKETCONFIG1 ) &
- RF_PACKETCONFIG1_CRC_MASK &
- RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
- ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
- ( crcOn << 4 ) );
- }
- break;
- case MODEM_LORA:
- {
- SX1276.Settings.LoRa.Power = power;
- if( bandwidth > 2 )
- {
- // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
- while( 1 );
- }
- bandwidth += 7;
- SX1276.Settings.LoRa.Bandwidth = bandwidth;
- SX1276.Settings.LoRa.Datarate = datarate;
- SX1276.Settings.LoRa.Coderate = coderate;
- SX1276.Settings.LoRa.PreambleLen = preambleLen;
- SX1276.Settings.LoRa.FixLen = fixLen;
- SX1276.Settings.LoRa.FreqHopOn = freqHopOn;
- SX1276.Settings.LoRa.HopPeriod = hopPeriod;
- SX1276.Settings.LoRa.CrcOn = crcOn;
- SX1276.Settings.LoRa.IqInverted = iqInverted;
- SX1276.Settings.LoRa.TxTimeout = timeout;
- if( datarate > 12 )
- {
- datarate = 12;
- }
- else if( datarate < 6 )
- {
- datarate = 6;
- }
- if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
- ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
- {
- SX1276.Settings.LoRa.LowDatarateOptimize = 0x01;
- }
- else
- {
- SX1276.Settings.LoRa.LowDatarateOptimize = 0x00;
- }
- if( SX1276.Settings.LoRa.FreqHopOn == true )
- {
- SX1276Write( REG_LR_PLLHOP, ( SX1276Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
- SX1276Write( REG_LR_HOPPERIOD, SX1276.Settings.LoRa.HopPeriod );
- }
- SX1276Write( REG_LR_MODEMCONFIG1,
- ( SX1276Read( REG_LR_MODEMCONFIG1 ) &
- RFLR_MODEMCONFIG1_BW_MASK &
- RFLR_MODEMCONFIG1_CODINGRATE_MASK &
- RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
- ( bandwidth << 4 ) | ( coderate << 1 ) |
- fixLen );
- SX1276Write( REG_LR_MODEMCONFIG2,
- ( SX1276Read( REG_LR_MODEMCONFIG2 ) &
- RFLR_MODEMCONFIG2_SF_MASK &
- RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) |
- ( datarate << 4 ) | ( crcOn << 2 ) );
- SX1276Write( REG_LR_MODEMCONFIG3,
- ( SX1276Read( REG_LR_MODEMCONFIG3 ) &
- RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
- ( SX1276.Settings.LoRa.LowDatarateOptimize << 3 ) );
- SX1276Write( REG_LR_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
- SX1276Write( REG_LR_PREAMBLELSB, preambleLen & 0xFF );
- if( datarate == 6 )
- {
- SX1276Write( REG_LR_DETECTOPTIMIZE,
- ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
- RFLR_DETECTIONOPTIMIZE_MASK ) |
- RFLR_DETECTIONOPTIMIZE_SF6 );
- SX1276Write( REG_LR_DETECTIONTHRESHOLD,
- RFLR_DETECTIONTHRESH_SF6 );
- }
- else
- {
- SX1276Write( REG_LR_DETECTOPTIMIZE,
- ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
- RFLR_DETECTIONOPTIMIZE_MASK ) |
- RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
- SX1276Write( REG_LR_DETECTIONTHRESHOLD,
- RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
- }
- }
- break;
- }
- }
- uint32_t SX1276GetTimeOnAir( RadioModems_t modem, uint8_t pktLen )
- {
- uint32_t airTime = 0;
- double rs = 0;
- double ts = 0;
- double tPreamble = 0;
- double tmp = 0;
- double nPayload = 0;
- double tPayload = 0;
- double tOnAir = 0;
- switch( modem )
- {
- case MODEM_FSK:
- {
- airTime = round( ( 8 * ( SX1276.Settings.Fsk.PreambleLen +
- ( ( SX1276Read( REG_SYNCCONFIG ) & ~RF_SYNCCONFIG_SYNCSIZE_MASK ) + 1 ) +
- ( ( SX1276.Settings.Fsk.FixLen == 0x01 ) ? 0.0 : 1.0 ) +
- ( ( ( SX1276Read( REG_PACKETCONFIG1 ) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK ) != 0x00 ) ? 1.0 : 0 ) +
- pktLen +
- ( ( SX1276.Settings.Fsk.CrcOn == 0x01 ) ? 2.0 : 0 ) ) /
- SX1276.Settings.Fsk.Datarate ) * 1e3 );
- }
- break;
- case MODEM_LORA:
- {
- double bw = 0.0;
- // REMARK: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
- switch( SX1276.Settings.LoRa.Bandwidth )
- {
- //case 0: // 7.8 kHz
- // bw = 78e2;
- // break;
- //case 1: // 10.4 kHz
- // bw = 104e2;
- // break;
- //case 2: // 15.6 kHz
- // bw = 156e2;
- // break;
- //case 3: // 20.8 kHz
- // bw = 208e2;
- // break;
- //case 4: // 31.2 kHz
- // bw = 312e2;
- // break;
- //case 5: // 41.4 kHz
- // bw = 414e2;
- // break;
- //case 6: // 62.5 kHz
- // bw = 625e2;
- // break;
- case 7: // 125 kHz
- bw = 125e3;
- break;
- case 8: // 250 kHz
- bw = 250e3;
- break;
- case 9: // 500 kHz
- bw = 500e3;
- break;
- }
- // Symbol rate : time for one symbol (secs)
- rs = bw / ( 1 << SX1276.Settings.LoRa.Datarate );
- ts = 1 / rs;
- // time of preamble
- tPreamble = ( SX1276.Settings.LoRa.PreambleLen + 4.25 ) * ts;
- // Symbol length of payload and time
- tmp = ceil( ( 8 * pktLen - 4 * SX1276.Settings.LoRa.Datarate +
- 28 + 16 * SX1276.Settings.LoRa.CrcOn -
- ( SX1276.Settings.LoRa.FixLen ? 20 : 0 ) ) /
- ( double )( 4 * SX1276.Settings.LoRa.Datarate -
- ( ( SX1276.Settings.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) *
- ( SX1276.Settings.LoRa.Coderate + 4 );
- nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
- tPayload = nPayload * ts;
- // Time on air
- tOnAir = tPreamble + tPayload;
- // return us secs
- airTime = floor( tOnAir * 1e3 + 0.999 );
- }
- break;
- }
- return airTime;
- }
- void SX1276Send( uint8_t *buffer, uint8_t size )
- {
- uint32_t txTimeout = 0;
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- {
- SX1276.Settings.FskPacketHandler.NbBytes = 0;
- SX1276.Settings.FskPacketHandler.Size = size;
- if( SX1276.Settings.Fsk.FixLen == false )
- {
- SX1276WriteFifo( ( uint8_t* )&size, 1 );
- }
- else
- {
- SX1276Write( REG_PAYLOADLENGTH, size );
- }
- if( ( size > 0 ) && ( size <= 64 ) )
- {
- SX1276.Settings.FskPacketHandler.ChunkSize = size;
- }
- else
- {
- memcpy( RxTxBuffer, buffer, size );
- SX1276.Settings.FskPacketHandler.ChunkSize = 32;
- }
- // Write payload buffer
- SX1276WriteFifo( buffer, SX1276.Settings.FskPacketHandler.ChunkSize );
- SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.ChunkSize;
- txTimeout = SX1276.Settings.Fsk.TxTimeout;
- }
- break;
- case MODEM_LORA:
- {
- if( SX1276.Settings.LoRa.IqInverted == true )
- {
- SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_ON ) );
- SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
- }
- else
- {
- SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
- SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
- }
- SX1276.Settings.LoRaPacketHandler.Size = size;
- // Initializes the payload size
- SX1276Write( REG_LR_PAYLOADLENGTH, size );
- // Full buffer used for Tx
- SX1276Write( REG_LR_FIFOTXBASEADDR, 0 );
- SX1276Write( REG_LR_FIFOADDRPTR, 0 );
- // FIFO operations can not take place in Sleep mode
- if( ( SX1276Read( REG_OPMODE ) & ~RF_OPMODE_MASK ) == RF_OPMODE_SLEEP )
- {
- SX1276SetStby( );
- SX1276DelayMs( 1 );
- }
- // Write payload buffer
- SX1276WriteFifo( buffer, size );
- txTimeout = SX1276.Settings.LoRa.TxTimeout;
- }
- break;
- }
- SX1276SetTx( txTimeout );
- }
- void SX1276SetSleep( void )
- {
- SX1276RxTimeoutTimerStop();
- SX1276TxTimeoutTimerStop();
- SX1276SetOpMode( RF_OPMODE_SLEEP );
- SX1276.Settings.State = RF_IDLE;
- }
- void SX1276SetStby( void )
- {
- SX1276RxTimeoutTimerStop();
- SX1276TxTimeoutTimerStop();
- SX1276SetOpMode( RF_OPMODE_STANDBY );
- SX1276.Settings.State = RF_IDLE;
- }
- void SX1276SetRx( uint32_t timeout )
- {
- bool rxContinuous = false;
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- {
- rxContinuous = SX1276.Settings.Fsk.RxContinuous;
- // DIO0=PayloadReady
- // DIO1=FifoLevel
- // DIO2=SyncAddr
- // DIO3=FifoEmpty
- // DIO4=Preamble
- // DIO5=ModeReady
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
- RF_DIOMAPPING1_DIO1_MASK &
- RF_DIOMAPPING1_DIO2_MASK ) |
- RF_DIOMAPPING1_DIO0_00 |
- RF_DIOMAPPING1_DIO1_00 |
- RF_DIOMAPPING1_DIO2_11 );
- SX1276Write( REG_DIOMAPPING2, ( SX1276Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
- RF_DIOMAPPING2_MAP_MASK ) |
- RF_DIOMAPPING2_DIO4_11 |
- RF_DIOMAPPING2_MAP_PREAMBLEDETECT );
- SX1276.Settings.FskPacketHandler.FifoThresh = SX1276Read( REG_FIFOTHRESH ) & 0x3F;
- SX1276Write( REG_RXCONFIG, RF_RXCONFIG_AFCAUTO_ON | RF_RXCONFIG_AGCAUTO_ON | RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT );
- SX1276.Settings.FskPacketHandler.PreambleDetected = false;
- SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
- SX1276.Settings.FskPacketHandler.NbBytes = 0;
- SX1276.Settings.FskPacketHandler.Size = 0;
- }
- break;
- case MODEM_LORA:
- {
- if( SX1276.Settings.LoRa.IqInverted == true )
- {
- SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_ON | RFLR_INVERTIQ_TX_OFF ) );
- SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
- }
- else
- {
- SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
- SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
- }
- // ERRATA 2.3 - Receiver Spurious Reception of a LoRa Signal
- if( SX1276.Settings.LoRa.Bandwidth < 9 )
- {
- SX1276Write( REG_LR_DETECTOPTIMIZE, SX1276Read( REG_LR_DETECTOPTIMIZE ) & 0x7F );
- SX1276Write( REG_LR_TEST30, 0x00 );
- switch( SX1276.Settings.LoRa.Bandwidth )
- {
- case 0: // 7.8 kHz
- SX1276Write( REG_LR_TEST2F, 0x48 );
- SX1276SetChannel(SX1276.Settings.Channel + 7.81e3 );
- break;
- case 1: // 10.4 kHz
- SX1276Write( REG_LR_TEST2F, 0x44 );
- SX1276SetChannel(SX1276.Settings.Channel + 10.42e3 );
- break;
- case 2: // 15.6 kHz
- SX1276Write( REG_LR_TEST2F, 0x44 );
- SX1276SetChannel(SX1276.Settings.Channel + 15.62e3 );
- break;
- case 3: // 20.8 kHz
- SX1276Write( REG_LR_TEST2F, 0x44 );
- SX1276SetChannel(SX1276.Settings.Channel + 20.83e3 );
- break;
- case 4: // 31.2 kHz
- SX1276Write( REG_LR_TEST2F, 0x44 );
- SX1276SetChannel(SX1276.Settings.Channel + 31.25e3 );
- break;
- case 5: // 41.4 kHz
- SX1276Write( REG_LR_TEST2F, 0x44 );
- SX1276SetChannel(SX1276.Settings.Channel + 41.67e3 );
- break;
- case 6: // 62.5 kHz
- SX1276Write( REG_LR_TEST2F, 0x40 );
- break;
- case 7: // 125 kHz
- SX1276Write( REG_LR_TEST2F, 0x40 );
- break;
- case 8: // 250 kHz
- SX1276Write( REG_LR_TEST2F, 0x40 );
- break;
- }
- }
- else
- {
- SX1276Write( REG_LR_DETECTOPTIMIZE, SX1276Read( REG_LR_DETECTOPTIMIZE ) | 0x80 );
- }
- rxContinuous = SX1276.Settings.LoRa.RxContinuous;
- if( SX1276.Settings.LoRa.FreqHopOn == true )
- {
- SX1276Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
- //RFLR_IRQFLAGS_RXDONE |
- //RFLR_IRQFLAGS_PAYLOADCRCERROR |
- RFLR_IRQFLAGS_VALIDHEADER |
- RFLR_IRQFLAGS_TXDONE |
- RFLR_IRQFLAGS_CADDONE |
- //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
- RFLR_IRQFLAGS_CADDETECTED );
- // DIO0=RxDone, DIO2=FhssChangeChannel
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO2_00 );
- }
- else
- {
- SX1276Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
- //RFLR_IRQFLAGS_RXDONE |
- //RFLR_IRQFLAGS_PAYLOADCRCERROR |
- RFLR_IRQFLAGS_VALIDHEADER |
- RFLR_IRQFLAGS_TXDONE |
- RFLR_IRQFLAGS_CADDONE |
- RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
- RFLR_IRQFLAGS_CADDETECTED );
- // DIO0=RxDone
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
- }
- SX1276Write( REG_LR_FIFORXBASEADDR, 0 );
- SX1276Write( REG_LR_FIFOADDRPTR, 0 );
- }
- break;
- }
- memset( RxTxBuffer, 0, ( size_t )RX_BUFFER_SIZE );
- SX1276.Settings.State = RF_RX_RUNNING;
- if( timeout != 0 )
- {
- SX1276RxTimeoutTimerStart(timeout);
- }
- if( SX1276.Settings.Modem == MODEM_FSK )
- {
- SX1276SetOpMode( RF_OPMODE_RECEIVER );
- if( rxContinuous == false )
- {
- SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
- ( ( SX1276Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
- }
- }
- else
- {
- if( rxContinuous == true )
- {
- SX1276SetOpMode( RFLR_OPMODE_RECEIVER );
- }
- else
- {
- SX1276SetOpMode( RFLR_OPMODE_RECEIVER_SINGLE );
- }
- }
- SX1276Read(REG_LR_IRQFLAGS);//设置接收后读写任意寄存器可以开始接收
- }
- void SX1276SetTx( uint32_t timeout )
- {
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- {
- // DIO0=PacketSent
- // DIO1=FifoEmpty
- // DIO2=FifoFull
- // DIO3=FifoEmpty
- // DIO4=LowBat
- // DIO5=ModeReady
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
- RF_DIOMAPPING1_DIO1_MASK &
- RF_DIOMAPPING1_DIO2_MASK ) |
- RF_DIOMAPPING1_DIO1_01 );
- SX1276Write( REG_DIOMAPPING2, ( SX1276Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
- RF_DIOMAPPING2_MAP_MASK ) );
- SX1276.Settings.FskPacketHandler.FifoThresh = SX1276Read( REG_FIFOTHRESH ) & 0x3F;
- }
- break;
- case MODEM_LORA:
- {
- if( SX1276.Settings.LoRa.FreqHopOn == true )
- {
- SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
- RFLR_IRQFLAGS_RXDONE |
- RFLR_IRQFLAGS_PAYLOADCRCERROR |
- RFLR_IRQFLAGS_VALIDHEADER |
- //RFLR_IRQFLAGS_TXDONE |
- RFLR_IRQFLAGS_CADDONE |
- //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
- RFLR_IRQFLAGS_CADDETECTED );
- // DIO0=TxDone, DIO2=FhssChangeChannel
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO2_00 );
- }
- else
- {
- SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
- RFLR_IRQFLAGS_RXDONE |
- RFLR_IRQFLAGS_PAYLOADCRCERROR |
- RFLR_IRQFLAGS_VALIDHEADER |
- //RFLR_IRQFLAGS_TXDONE |
- RFLR_IRQFLAGS_CADDONE |
- RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
- RFLR_IRQFLAGS_CADDETECTED );
- // DIO0=TxDone
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_01 );
- }
- }
- break;
- }
- SX1276.Settings.State = RF_TX_RUNNING;
- SX1276RxTimeoutTimerStart(timeout);
- SX1276SetOpMode( RF_OPMODE_TRANSMITTER );
- SX1276Read(REG_LR_IRQFLAGS);//设置发送后读写任意寄存器可以开始发送
- }
- void SX1276StartCad( void )
- {
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- {
- }
- break;
- case MODEM_LORA:
- {
- SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
- RFLR_IRQFLAGS_RXDONE |
- RFLR_IRQFLAGS_PAYLOADCRCERROR |
- RFLR_IRQFLAGS_VALIDHEADER |
- RFLR_IRQFLAGS_TXDONE |
- //RFLR_IRQFLAGS_CADDONE |
- RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
- //RFLR_IRQFLAGS_CADDETECTED
- );
- // DIO3=CADDone
- SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
- SX1276.Settings.State = RF_CAD;
- SX1276SetOpMode( RFLR_OPMODE_CAD );
- }
- break;
- default:
- break;
- }
- }
- int16_t SX1276ReadRssi( RadioModems_t modem )
- {
- int16_t rssi = 0;
- switch( modem )
- {
- case MODEM_FSK:
- rssi = -( SX1276Read( REG_RSSIVALUE ) >> 1 );
- break;
- case MODEM_LORA:
- if( SX1276.Settings.Channel > RF_MID_BAND_THRESH )
- {
- rssi = RSSI_OFFSET_HF + SX1276Read( REG_LR_RSSIVALUE );
- }
- else
- {
- rssi = RSSI_OFFSET_LF + SX1276Read( REG_LR_RSSIVALUE );
- }
- break;
- default:
- rssi = -1;
- break;
- }
- return rssi;
- }
- void SX1276SetOpMode( uint8_t opMode )
- {
- if( opMode == RF_OPMODE_SLEEP )
- {
- SX1276SetAntSwLowPower( true );
- }
- else
- {
- SX1276SetAntSwLowPower( false );
- if( opMode == RF_OPMODE_TRANSMITTER )
- {
- SX1276SetAntSw( 1 );
- }
- else
- {
- SX1276SetAntSw( 0 );
- }
- }
- SX1276Write( REG_OPMODE, ( SX1276Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
- }
- void SX1276SetModem( RadioModems_t modem )
- {
- if( SX1276.Settings.Modem == modem )
- {
- return;
- }
- SX1276.Settings.Modem = modem;
- switch( SX1276.Settings.Modem )
- {
- default:
- case MODEM_FSK:
- SX1276SetOpMode( RF_OPMODE_SLEEP );
- SX1276Write( REG_OPMODE, ( SX1276Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF );
- SX1276Write( REG_DIOMAPPING1, 0x00 );
- SX1276Write( REG_DIOMAPPING2, 0x30 ); // DIO5=ModeReady
- break;
- case MODEM_LORA:
- SX1276SetOpMode( RF_OPMODE_SLEEP );
- SX1276Write( REG_OPMODE, ( SX1276Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON );
- SX1276Write( REG_DIOMAPPING1, 0x00 );
- SX1276Write( REG_DIOMAPPING2, 0x00 );
- break;
- }
- }
- void SX1276Write( uint8_t addr, uint8_t data )
- {
- SX1276WriteBuffer( addr, &data, 1 );
- }
- uint8_t SX1276Read( uint8_t addr )
- {
- uint8_t data;
- SX1276ReadBuffer( addr, &data, 1 );
- return data;
- }
- void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
- {
- uint8_t i;
- //NSS = 0;
- Sx1276SetNSS(0);
- Sx1276SpiInOut(addr | 0x80 );
- for( i = 0; i < size; i++ )
- {
- Sx1276SpiInOut(buffer[i] );
- }
- //NSS = 1;
- Sx1276SetNSS(1);
- }
- void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
- {
- uint8_t i;
- //NSS = 0;
- Sx1276SetNSS( 0 );
- Sx1276SpiInOut(addr & 0x7F );
- for( i = 0; i < size; i++ )
- {
- buffer[i] = Sx1276SpiInOut( 0 );
- }
- //NSS = 1;
- Sx1276SetNSS(1);
- }
- void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
- {
- SX1276WriteBuffer( 0, buffer, size );
- }
- void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
- {
- SX1276ReadBuffer( 0, buffer, size );
- }
- void SX1276SetMaxPayloadLength( RadioModems_t modem, uint8_t max )
- {
- SX1276SetModem( modem );
- switch( modem )
- {
- case MODEM_FSK:
- if( SX1276.Settings.Fsk.FixLen == false )
- {
- SX1276Write( REG_PAYLOADLENGTH, max );
- }
- break;
- case MODEM_LORA:
- SX1276Write( REG_LR_PAYLOADMAXLENGTH, max );
- break;
- }
- }
- /*
- 发射超时函数,判断此时发射机状态
- 处于lora状态还是fsk状态
-
- */
- void SX1276OnTimeoutIrq( void )
- {
- switch( SX1276.Settings.State )
- {
- case RF_RX_RUNNING:
- if( SX1276.Settings.Modem == MODEM_FSK )
- {
- SX1276.Settings.FskPacketHandler.PreambleDetected = false;
- SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
- SX1276.Settings.FskPacketHandler.NbBytes = 0;
- SX1276.Settings.FskPacketHandler.Size = 0;
- // Clear Irqs
- SX1276Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
- RF_IRQFLAGS1_PREAMBLEDETECT |
- RF_IRQFLAGS1_SYNCADDRESSMATCH );
- SX1276Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
- if( SX1276.Settings.Fsk.RxContinuous == true )
- {
- // Continuous mode restart Rx chain
- SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
- //TimerStart( &RxTimeoutSyncWord );
- SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
- ( ( SX1276Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
- }
- else
- {
- SX1276.Settings.State = RF_IDLE;
- SX1276SyncWordTimeoutTimerStop();
- }
- }
- if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
- {
- RadioEvents->RxTimeout( );
- }
- break;
- case RF_TX_RUNNING:
- SX1276.Settings.State = RF_IDLE;
- if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )
- {
- RadioEvents->TxTimeout( );
- }
- break;
- default:
- break;
- }
- }
- void SX1276OnDio0Irq( void )
- {
- volatile uint8_t irqFlags = 0;
- int16_t rssi = 0;
- switch( SX1276.Settings.State )
- {
- case RF_RX_RUNNING:
- SX1276RxTimeoutTimerStop();
- // RxDone interrupt
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- if( SX1276.Settings.Fsk.CrcOn == true )
- {
- irqFlags = SX1276Read( REG_IRQFLAGS2 );
- if( ( irqFlags & RF_IRQFLAGS2_CRCOK ) != RF_IRQFLAGS2_CRCOK )
- {
- // Clear Irqs
- SX1276Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
- RF_IRQFLAGS1_PREAMBLEDETECT |
- RF_IRQFLAGS1_SYNCADDRESSMATCH );
- SX1276Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
- SX1276RxTimeoutTimerStop();
- if( SX1276.Settings.Fsk.RxContinuous == false )
- {
- SX1276SyncWordTimeoutTimerStop();
- SX1276.Settings.State = RF_IDLE;
- }
- else
- {
- // Continuous mode restart Rx chain
- SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
- //TimerStart( &RxTimeoutSyncWord );
- SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
- ( ( SX1276Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
- }
- if( ( RadioEvents != NULL ) && ( RadioEvents->RxError != NULL ) )
- {
- RadioEvents->RxError( );
- }
- SX1276.Settings.FskPacketHandler.PreambleDetected = false;
- SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
- SX1276.Settings.FskPacketHandler.NbBytes = 0;
- SX1276.Settings.FskPacketHandler.Size = 0;
- break;
- }
- }
- // Read received packet size
- if( ( SX1276.Settings.FskPacketHandler.Size == 0 ) && ( SX1276.Settings.FskPacketHandler.NbBytes == 0 ) )
- {
- if( SX1276.Settings.Fsk.FixLen == false )
- {
- SX1276ReadFifo( ( uint8_t* )&SX1276.Settings.FskPacketHandler.Size, 1 );
- }
- else
- {
- SX1276.Settings.FskPacketHandler.Size = SX1276Read( REG_PAYLOADLENGTH );
- }
- SX1276ReadFifo( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes, SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- SX1276.Settings.FskPacketHandler.NbBytes += ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- }
- else
- {
- SX1276ReadFifo( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes, SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- SX1276.Settings.FskPacketHandler.NbBytes += ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- }
- if( SX1276.Settings.Fsk.RxContinuous == false )
- {
- SX1276.Settings.State = RF_IDLE;
- //TimerStart( &RxTimeoutSyncWord );
- SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
- ( ( SX1276Read( REG_SYNCCONFIG ) &
- ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
- 1.0 ) + 10.0 ) /
- ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
- }
- else
- {
- // Continuous mode restart Rx chain
- SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
- }
- SX1276RxTimeoutTimerStop();
- if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
- {
- RadioEvents->RxDone( RxTxBuffer, SX1276.Settings.FskPacketHandler.Size, SX1276.Settings.FskPacketHandler.RssiValue, 0 );
- }
- SX1276.Settings.FskPacketHandler.PreambleDetected = false;
- SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
- SX1276.Settings.FskPacketHandler.NbBytes = 0;
- SX1276.Settings.FskPacketHandler.Size = 0;
- break;
- case MODEM_LORA:
- {
- int8_t snr = 0;
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE );
- irqFlags = SX1276Read( REG_LR_IRQFLAGS );
- if( ( irqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK ) == RFLR_IRQFLAGS_PAYLOADCRCERROR )
- {
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR );
- if( SX1276.Settings.LoRa.RxContinuous == false )
- {
- SX1276.Settings.State = RF_IDLE;
- }
- SX1276RxTimeoutTimerStop();
- if( ( RadioEvents != NULL ) && ( RadioEvents->RxError != NULL ) )
- {
- RadioEvents->RxError( );
- }
- break;
- }
- SX1276.Settings.LoRaPacketHandler.SnrValue = SX1276Read( REG_LR_PKTSNRVALUE );
- if( SX1276.Settings.LoRaPacketHandler.SnrValue & 0x80 ) // The SNR sign bit is 1
- {
- // Invert and divide by 4
- snr = ( ( ~SX1276.Settings.LoRaPacketHandler.SnrValue + 1 ) & 0xFF ) >> 2;
- snr = -snr;
- }
- else
- {
- // Divide by 4
- snr = ( SX1276.Settings.LoRaPacketHandler.SnrValue & 0xFF ) >> 2;
- }
- rssi = SX1276Read( REG_LR_PKTRSSIVALUE );
- if( snr < 0 )
- {
- if( SX1276.Settings.Channel > RF_MID_BAND_THRESH )
- {
- SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 ) +
- snr;
- }
- else
- {
- SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 ) +
- snr;
- }
- }
- else
- {
- if( SX1276.Settings.Channel > RF_MID_BAND_THRESH )
- {
- SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 );
- }
- else
- {
- SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 );
- }
- }
- SX1276.Settings.LoRaPacketHandler.Size = SX1276Read( REG_LR_RXNBBYTES );
- SX1276ReadFifo( RxTxBuffer, SX1276.Settings.LoRaPacketHandler.Size );
- if( SX1276.Settings.LoRa.RxContinuous == false )
- {
- SX1276.Settings.State = RF_IDLE;
- }
- SX1276RxTimeoutTimerStop();
- if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
- {
- RadioEvents->RxDone( RxTxBuffer, SX1276.Settings.LoRaPacketHandler.Size, SX1276.Settings.LoRaPacketHandler.RssiValue, SX1276.Settings.LoRaPacketHandler.SnrValue );
- }
- }
- break;
- default:
- break;
- }
- break;
- case RF_TX_RUNNING:
- SX1276TxTimeoutTimerStop();
- // TxDone interrupt
- switch( SX1276.Settings.Modem )
- {
- case MODEM_LORA:
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
- // Intentional fall through
- case MODEM_FSK:
- default:
- SX1276.Settings.State = RF_IDLE;
- if( ( RadioEvents != NULL ) && ( RadioEvents->TxDone != NULL ) )
- {
- RadioEvents->TxDone( );
- }
- break;
- }
- break;
- default:
- break;
- }
- }
- void SX1276OnDio1Irq( void )
- {
- switch( SX1276.Settings.State )
- {
- case RF_RX_RUNNING:
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- // FifoLevel interrupt
- // Read received packet size
- if( ( SX1276.Settings.FskPacketHandler.Size == 0 ) && ( SX1276.Settings.FskPacketHandler.NbBytes == 0 ) )
- {
- if( SX1276.Settings.Fsk.FixLen == false )
- {
- SX1276ReadFifo( ( uint8_t* )&SX1276.Settings.FskPacketHandler.Size, 1 );
- }
- else
- {
- SX1276.Settings.FskPacketHandler.Size = SX1276Read( REG_PAYLOADLENGTH );
- }
- }
- if( ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes ) > SX1276.Settings.FskPacketHandler.FifoThresh )
- {
- SX1276ReadFifo( ( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes ), SX1276.Settings.FskPacketHandler.FifoThresh );
- SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.FifoThresh;
- }
- else
- {
- SX1276ReadFifo( ( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes ), SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- SX1276.Settings.FskPacketHandler.NbBytes += ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- }
- break;
- case MODEM_LORA:
- // Sync time out
- SX1276RxTimeoutTimerStop();
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT );
- SX1276.Settings.State = RF_IDLE;
- if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
- {
- RadioEvents->RxTimeout( );
- }
- break;
- default:
- break;
- }
- break;
- case RF_TX_RUNNING:
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- // FifoEmpty interrupt
- if( ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes ) > SX1276.Settings.FskPacketHandler.ChunkSize )
- {
- SX1276WriteFifo( ( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes ), SX1276.Settings.FskPacketHandler.ChunkSize );
- SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.ChunkSize;
- }
- else
- {
- // Write the last chunk of data
- SX1276WriteFifo( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes, SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
- SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes;
- }
- break;
- case MODEM_LORA:
- // Sync time out
- SX1276TxTimeoutTimerStop();
- // Clear Irq
- //SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT );
- SX1276.Settings.State = RF_IDLE;
- if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )
- {
- RadioEvents->TxTimeout( );
- }
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
- void SX1276OnDio2Irq( void )
- {
- switch( SX1276.Settings.State )
- {
- case RF_RX_RUNNING:
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- if( ( SX1276.Settings.FskPacketHandler.PreambleDetected == true ) && ( SX1276.Settings.FskPacketHandler.SyncWordDetected == false ) )
- {
- SX1276SyncWordTimeoutTimerStop();
- SX1276.Settings.FskPacketHandler.SyncWordDetected = true;
- SX1276.Settings.FskPacketHandler.RssiValue = -( SX1276Read( REG_RSSIVALUE ) >> 1 );
- SX1276.Settings.FskPacketHandler.AfcValue = ( int32_t )( double )( ( ( uint16_t )SX1276Read( REG_AFCMSB ) << 8 ) |
- ( uint16_t )SX1276Read( REG_AFCLSB ) ) *
- ( double )FREQ_STEP;
- SX1276.Settings.FskPacketHandler.RxGain = ( SX1276Read( REG_LNA ) >> 5 ) & 0x07;
- }
- break;
- case MODEM_LORA:
- if( SX1276.Settings.LoRa.FreqHopOn == true )
- {
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
- if( ( RadioEvents != NULL ) && ( RadioEvents->FhssChangeChannel != NULL ) )
- {
- RadioEvents->FhssChangeChannel( ( SX1276Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
- }
- }
- break;
- default:
- break;
- }
- break;
- case RF_TX_RUNNING:
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- break;
- case MODEM_LORA:
- if( SX1276.Settings.LoRa.FreqHopOn == true )
- {
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
- if( ( RadioEvents != NULL ) && ( RadioEvents->FhssChangeChannel != NULL ) )
- {
- RadioEvents->FhssChangeChannel( ( SX1276Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
- }
- }
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
- void SX1276OnDio3Irq( void )
- {
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- break;
- case MODEM_LORA:
- if( ( SX1276Read( REG_LR_IRQFLAGS ) & RFLR_IRQFLAGS_CADDETECTED ) == RFLR_IRQFLAGS_CADDETECTED )
- {
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED | RFLR_IRQFLAGS_CADDONE );
- if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
- {
- RadioEvents->CadDone( true );
- }
- }
- else
- {
- // Clear Irq
- SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
- if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
- {
- RadioEvents->CadDone( false );
- }
- }
- break;
- default:
- break;
- }
- }
- void SX1276OnDio4Irq( void )
- {
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- {
- if( SX1276.Settings.FskPacketHandler.PreambleDetected == false )
- {
- SX1276.Settings.FskPacketHandler.PreambleDetected = true;
- }
- }
- break;
- case MODEM_LORA:
- break;
- default:
- break;
- }
- }
- void SX1276OnDio5Irq( void )
- {
- switch( SX1276.Settings.Modem )
- {
- case MODEM_FSK:
- break;
- case MODEM_LORA:
- break;
- default:
- break;
- }
- }
- //一些和硬件相关写死的内容
- //切换射频输出口
- uint8_t SX1276GetPaSelect( uint32_t channel )
- {
- //硬件上都连接到 PABOOST 上了,没有使用RFO,所以统一返回 RF_PACONFIG_PASELECT_PABOOST
- return RF_PACONFIG_PASELECT_PABOOST;
- /*if( channel < RF_MID_BAND_THRESH )
- {
- return RF_PACONFIG_PASELECT_PABOOST;
- }
- else
- {
- return RF_PACONFIG_PASELECT_RFO;
- }*/
- }
- void SX1276AntSwInit( void )
- {
- /* 我们的RA-01/02模组的天线切换开关由硬件自动控制,不需要软件控制
- GpioInit( &AntSwitchLf, RADIO_ANT_SWITCH_LF, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 1 );
- GpioInit( &AntSwitchHf, RADIO_ANT_SWITCH_HF, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );*/
- }
- void SX1276AntSwDeInit( void )
- {
- /* 我们的RA-01/02模组的天线切换开关由硬件自动控制,不需要软件控制
- GpioInit( &AntSwitchLf, RADIO_ANT_SWITCH_LF, PIN_OUTPUT, PIN_OPEN_DRAIN, PIN_NO_PULL, 0 );
- GpioInit( &AntSwitchHf, RADIO_ANT_SWITCH_HF, PIN_OUTPUT, PIN_OPEN_DRAIN, PIN_NO_PULL, 0 );*/
- }
- void SX1276SetAntSw( uint8_t rxTx )
- {
- /* 我们的RA-01/02模组的天线切换开关由硬件自动控制,不需要软件控制
- if( rxTx != 0 ) // 1: TX, 0: RX
- {
- GpioWrite( &AntSwitchLf, 0 );
- GpioWrite( &AntSwitchHf, 1 );
- }
- else
- {
- GpioWrite( &AntSwitchLf, 1 );
- GpioWrite( &AntSwitchHf, 0 );
- }*/
- }
|