sx1276.c 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868
  1. /*
  2. / _____) _ | |
  3. ( (____ _____ ____ _| |_ _____ ____| |__
  4. \____ \| ___ | (_ _) ___ |/ ___) _ \
  5. _____) ) ____| | | || |_| ____( (___| | | |
  6. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  7. (C)2013 Semtech
  8. Description: Generic SX1276 driver implementation
  9. License: Revised BSD License, see LICENSE.TXT file include in the project
  10. Maintainer: Miguel Luis, Gregory Cristian and Wael Guibene
  11. */
  12. #include <math.h>
  13. #include <string.h>
  14. #include <math.h>
  15. #include "radio.h"
  16. #include "sx1276.h"
  17. #include "sx1276-board.h"
  18. /*
  19. * Local types definition
  20. */
  21. /*!
  22. * Radio registers definition
  23. */
  24. typedef struct
  25. {
  26. RadioModems_t Modem;
  27. uint8_t Addr;
  28. uint8_t Value;
  29. }RadioRegisters_t;
  30. /*!
  31. * FSK bandwidth definition
  32. */
  33. typedef struct
  34. {
  35. uint32_t bandwidth;
  36. uint8_t RegValue;
  37. }FskBandwidth_t;
  38. /*
  39. * Private functions prototypes
  40. */
  41. /*!
  42. * Performs the Rx chain calibration for LF and HF bands
  43. * \remark Must be called just after the reset so all registers are at their
  44. * default values
  45. */
  46. static void RxChainCalibration( void );
  47. /*!
  48. * \brief Resets the SX1276
  49. */
  50. void SX1276Reset( void );
  51. /*!
  52. * \brief Sets the SX1276 in transmission mode for the given time
  53. * \param [IN] timeout Transmission timeout [ms] [0: continuous, others timeout]
  54. */
  55. void SX1276SetTx( uint32_t timeout );
  56. /*!
  57. * \brief Writes the buffer contents to the SX1276 FIFO
  58. *
  59. * \param [IN] buffer Buffer containing data to be put on the FIFO.
  60. * \param [IN] size Number of bytes to be written to the FIFO
  61. */
  62. void SX1276WriteFifo( uint8_t *buffer, uint8_t size );
  63. /*!
  64. * \brief Reads the contents of the SX1276 FIFO
  65. *
  66. * \param [OUT] buffer Buffer where to copy the FIFO read data.
  67. * \param [IN] size Number of bytes to be read from the FIFO
  68. */
  69. void SX1276ReadFifo( uint8_t *buffer, uint8_t size );
  70. /*!
  71. * \brief Sets the SX1276 operating mode
  72. *
  73. * \param [IN] opMode New operating mode
  74. */
  75. void SX1276SetOpMode( uint8_t opMode );
  76. /*
  77. * SX1276 DIO IRQ callback functions prototype
  78. */
  79. /*!
  80. * \brief DIO 0 IRQ callback
  81. */
  82. void SX1276OnDio0Irq( void );
  83. /*!
  84. * \brief DIO 1 IRQ callback
  85. */
  86. void SX1276OnDio1Irq( void );
  87. /*!
  88. * \brief DIO 2 IRQ callback
  89. */
  90. void SX1276OnDio2Irq( void );
  91. /*!
  92. * \brief DIO 3 IRQ callback
  93. */
  94. void SX1276OnDio3Irq( void );
  95. /*!
  96. * \brief DIO 4 IRQ callback
  97. */
  98. void SX1276OnDio4Irq( void );
  99. /*!
  100. * \brief DIO 5 IRQ callback
  101. */
  102. void SX1276OnDio5Irq( void );
  103. /*!
  104. * \brief Tx & Rx timeout timer callback
  105. */
  106. void SX1276OnTimeoutIrq( void );
  107. /*
  108. * Private global constants
  109. */
  110. /*!
  111. * Radio hardware registers initialization
  112. *
  113. * \remark RADIO_INIT_REGISTERS_VALUE is defined in sx1276-board.h file
  114. */
  115. const RadioRegisters_t RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE;
  116. /*!
  117. * Constant values need to compute the RSSI value
  118. */
  119. #define RSSI_OFFSET_LF -164
  120. #define RSSI_OFFSET_HF -157
  121. /*!
  122. * Precomputed FSK bandwidth registers values
  123. */
  124. const FskBandwidth_t FskBandwidths[] =
  125. {
  126. { 2600 , 0x17 },
  127. { 3100 , 0x0F },
  128. { 3900 , 0x07 },
  129. { 5200 , 0x16 },
  130. { 6300 , 0x0E },
  131. { 7800 , 0x06 },
  132. { 10400 , 0x15 },
  133. { 12500 , 0x0D },
  134. { 15600 , 0x05 },
  135. { 20800 , 0x14 },
  136. { 25000 , 0x0C },
  137. { 31300 , 0x04 },
  138. { 41700 , 0x13 },
  139. { 50000 , 0x0B },
  140. { 62500 , 0x03 },
  141. { 83333 , 0x12 },
  142. { 100000, 0x0A },
  143. { 125000, 0x02 },
  144. { 166700, 0x11 },
  145. { 200000, 0x09 },
  146. { 250000, 0x01 },
  147. { 300000, 0x00 }, // Invalid Badwidth
  148. };
  149. /*
  150. * Private global variables
  151. */
  152. /*!
  153. * Radio callbacks variable
  154. */
  155. static RadioEvents_t *RadioEvents;
  156. /*!
  157. * Reception buffer
  158. */
  159. static uint8_t RxTxBuffer[RX_BUFFER_SIZE];
  160. /*
  161. * Public global variables
  162. */
  163. /*!
  164. * Radio hardware and global parameters
  165. */
  166. SX1276_t SX1276;
  167. /*!
  168. * Hardware DIO IRQ callback initialization
  169. */
  170. DioIrqHandler *DioIrq[] = { SX1276OnDio0Irq, SX1276OnDio1Irq,
  171. SX1276OnDio2Irq, SX1276OnDio3Irq,
  172. SX1276OnDio4Irq, NULL };
  173. /*!
  174. * Flag used to set the RF switch control pins in low power mode when the radio is not active.
  175. */
  176. static bool RadioIsActive = false;
  177. void SX1276SetAntSwLowPower( bool status )
  178. {
  179. if( RadioIsActive != status )
  180. {
  181. RadioIsActive = status;
  182. if( status == false )
  183. {
  184. SX1276AntSwInit( );
  185. }
  186. else
  187. {
  188. SX1276AntSwDeInit( );
  189. }
  190. }
  191. }
  192. /*
  193. * Radio driver functions implementation
  194. */
  195. void SX1276Init( RadioEvents_t *events )
  196. {
  197. uint8_t i;
  198. RadioEvents = events;
  199. // Initialize driver timeout timers
  200. SX1276TimerInit();
  201. SX1276IoInit();
  202. SX1276Reset( );
  203. RxChainCalibration( );
  204. SX1276SetOpMode( RF_OPMODE_SLEEP );
  205. SX1276IoIrqInit( DioIrq );
  206. for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ )
  207. {
  208. SX1276SetModem( RadioRegsInit[i].Modem );
  209. SX1276Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value );
  210. }
  211. SX1276SetModem( MODEM_FSK );
  212. SX1276.Settings.State = RF_IDLE;
  213. }
  214. RadioState_t SX1276GetStatus( void )
  215. {
  216. return SX1276.Settings.State;
  217. }
  218. void SX1276SetChannel( uint32_t freq )
  219. {
  220. SX1276.Settings.Channel = freq;
  221. freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
  222. SX1276Write( REG_FRFMSB, ( uint8_t )( ( freq >> 16 ) & 0xFF ) );
  223. SX1276Write( REG_FRFMID, ( uint8_t )( ( freq >> 8 ) & 0xFF ) );
  224. SX1276Write( REG_FRFLSB, ( uint8_t )( freq & 0xFF ) );
  225. }
  226. bool SX1276IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh )
  227. {
  228. int16_t rssi = 0;
  229. SX1276SetModem( modem );
  230. SX1276SetChannel( freq );
  231. SX1276SetOpMode( RF_OPMODE_RECEIVER );
  232. SX1276DelayMs( 1 );
  233. rssi = SX1276ReadRssi( modem );
  234. SX1276SetSleep( );
  235. if( rssi > rssiThresh )
  236. {
  237. return false;
  238. }
  239. return true;
  240. }
  241. uint32_t SX1276Random( void )
  242. {
  243. uint8_t i;
  244. uint32_t rnd = 0;
  245. /*
  246. * Radio setup for random number generation
  247. */
  248. // Set LoRa modem ON
  249. SX1276SetModem( MODEM_LORA );
  250. // Disable LoRa modem interrupts
  251. SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  252. RFLR_IRQFLAGS_RXDONE |
  253. RFLR_IRQFLAGS_PAYLOADCRCERROR |
  254. RFLR_IRQFLAGS_VALIDHEADER |
  255. RFLR_IRQFLAGS_TXDONE |
  256. RFLR_IRQFLAGS_CADDONE |
  257. RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  258. RFLR_IRQFLAGS_CADDETECTED );
  259. // Set radio in continuous reception
  260. SX1276SetOpMode( RF_OPMODE_RECEIVER );
  261. for( i = 0; i < 32; i++ )
  262. {
  263. SX1276DelayMs( 1 );
  264. // Unfiltered RSSI value reading. Only takes the LSB value
  265. rnd |= ( ( uint32_t )SX1276Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) << i;
  266. }
  267. SX1276SetSleep( );
  268. return rnd;
  269. }
  270. /*!
  271. * Performs the Rx chain calibration for LF and HF bands
  272. * \remark Must be called just after the reset so all registers are at their
  273. * default values
  274. */
  275. static void RxChainCalibration( void )
  276. {
  277. uint8_t regPaConfigInitVal;
  278. uint32_t initialFreq;
  279. // Save context
  280. regPaConfigInitVal = SX1276Read( REG_PACONFIG );
  281. initialFreq = ( double )( ( ( uint32_t )SX1276Read( REG_FRFMSB ) << 16 ) |
  282. ( ( uint32_t )SX1276Read( REG_FRFMID ) << 8 ) |
  283. ( ( uint32_t )SX1276Read( REG_FRFLSB ) ) ) * ( double )FREQ_STEP;
  284. // Cut the PA just in case, RFO output, power = -1 dBm
  285. SX1276Write( REG_PACONFIG, 0x00 );
  286. // Launch Rx chain calibration for LF band
  287. SX1276Write( REG_IMAGECAL, ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
  288. while( ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
  289. {
  290. }
  291. // Sets a Frequency in HF band
  292. SX1276SetChannel( 868000000 );
  293. // Launch Rx chain calibration for HF band
  294. SX1276Write( REG_IMAGECAL, ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_MASK ) | RF_IMAGECAL_IMAGECAL_START );
  295. while( ( SX1276Read( REG_IMAGECAL ) & RF_IMAGECAL_IMAGECAL_RUNNING ) == RF_IMAGECAL_IMAGECAL_RUNNING )
  296. {
  297. }
  298. // Restore context
  299. SX1276Write( REG_PACONFIG, regPaConfigInitVal );
  300. SX1276SetChannel( initialFreq );
  301. }
  302. /*!
  303. * Returns the known FSK bandwidth registers value
  304. *
  305. * \param [IN] bandwidth Bandwidth value in Hz
  306. * \retval regValue Bandwidth register value.
  307. */
  308. static uint8_t GetFskBandwidthRegValue( uint32_t bandwidth )
  309. {
  310. uint8_t i;
  311. for( i = 0; i < ( sizeof( FskBandwidths ) / sizeof( FskBandwidth_t ) ) - 1; i++ )
  312. {
  313. if( ( bandwidth >= FskBandwidths[i].bandwidth ) && ( bandwidth < FskBandwidths[i + 1].bandwidth ) )
  314. {
  315. return FskBandwidths[i].RegValue;
  316. }
  317. }
  318. // ERROR: Value not found
  319. while( 1 );
  320. }
  321. void SX1276SetRxConfig( RadioModems_t modem, uint32_t bandwidth,
  322. uint32_t datarate, uint8_t coderate,
  323. uint32_t bandwidthAfc, uint16_t preambleLen,
  324. uint16_t symbTimeout, bool fixLen,
  325. uint8_t payloadLen,
  326. bool crcOn, bool freqHopOn, uint8_t hopPeriod,
  327. bool iqInverted, bool rxContinuous )
  328. {
  329. SX1276SetModem( modem );
  330. switch( modem )
  331. {
  332. case MODEM_FSK:
  333. {
  334. SX1276.Settings.Fsk.Bandwidth = bandwidth;
  335. SX1276.Settings.Fsk.Datarate = datarate;
  336. SX1276.Settings.Fsk.BandwidthAfc = bandwidthAfc;
  337. SX1276.Settings.Fsk.FixLen = fixLen;
  338. SX1276.Settings.Fsk.PayloadLen = payloadLen;
  339. SX1276.Settings.Fsk.CrcOn = crcOn;
  340. SX1276.Settings.Fsk.IqInverted = iqInverted;
  341. SX1276.Settings.Fsk.RxContinuous = rxContinuous;
  342. SX1276.Settings.Fsk.PreambleLen = preambleLen;
  343. datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
  344. SX1276Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
  345. SX1276Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
  346. SX1276Write( REG_RXBW, GetFskBandwidthRegValue( bandwidth ) );
  347. SX1276Write( REG_AFCBW, GetFskBandwidthRegValue( bandwidthAfc ) );
  348. SX1276Write( REG_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
  349. SX1276Write( REG_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
  350. if( fixLen == 1 )
  351. {
  352. SX1276Write( REG_PAYLOADLENGTH, payloadLen );
  353. }
  354. else
  355. {
  356. SX1276Write( REG_PAYLOADLENGTH, 0xFF ); // Set payload length to the maximum
  357. }
  358. SX1276Write( REG_PACKETCONFIG1,
  359. ( SX1276Read( REG_PACKETCONFIG1 ) &
  360. RF_PACKETCONFIG1_CRC_MASK &
  361. RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
  362. ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
  363. ( crcOn << 4 ) );
  364. }
  365. break;
  366. case MODEM_LORA:
  367. {
  368. if( bandwidth > 2 )
  369. {
  370. // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
  371. while( 1 );
  372. }
  373. bandwidth += 7;
  374. SX1276.Settings.LoRa.Bandwidth = bandwidth;
  375. SX1276.Settings.LoRa.Datarate = datarate;
  376. SX1276.Settings.LoRa.Coderate = coderate;
  377. SX1276.Settings.LoRa.PreambleLen = preambleLen;
  378. SX1276.Settings.LoRa.FixLen = fixLen;
  379. SX1276.Settings.LoRa.PayloadLen = payloadLen;
  380. SX1276.Settings.LoRa.CrcOn = crcOn;
  381. SX1276.Settings.LoRa.FreqHopOn = freqHopOn;
  382. SX1276.Settings.LoRa.HopPeriod = hopPeriod;
  383. SX1276.Settings.LoRa.IqInverted = iqInverted;
  384. SX1276.Settings.LoRa.RxContinuous = rxContinuous;
  385. if( datarate > 12 )
  386. {
  387. datarate = 12;
  388. }
  389. else if( datarate < 6 )
  390. {
  391. datarate = 6;
  392. }
  393. if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
  394. ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
  395. {
  396. SX1276.Settings.LoRa.LowDatarateOptimize = 0x01;
  397. }
  398. else
  399. {
  400. SX1276.Settings.LoRa.LowDatarateOptimize = 0x00;
  401. }
  402. SX1276Write( REG_LR_MODEMCONFIG1,
  403. ( SX1276Read( REG_LR_MODEMCONFIG1 ) &
  404. RFLR_MODEMCONFIG1_BW_MASK &
  405. RFLR_MODEMCONFIG1_CODINGRATE_MASK &
  406. RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
  407. ( bandwidth << 4 ) | ( coderate << 1 ) |
  408. fixLen );
  409. SX1276Write( REG_LR_MODEMCONFIG2,
  410. ( SX1276Read( REG_LR_MODEMCONFIG2 ) &
  411. RFLR_MODEMCONFIG2_SF_MASK &
  412. RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK &
  413. RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) |
  414. ( datarate << 4 ) | ( crcOn << 2 ) |
  415. ( ( symbTimeout >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) );
  416. SX1276Write( REG_LR_MODEMCONFIG3,
  417. ( SX1276Read( REG_LR_MODEMCONFIG3 ) &
  418. RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
  419. ( SX1276.Settings.LoRa.LowDatarateOptimize << 3 ) );
  420. SX1276Write( REG_LR_SYMBTIMEOUTLSB, ( uint8_t )( symbTimeout & 0xFF ) );
  421. SX1276Write( REG_LR_PREAMBLEMSB, ( uint8_t )( ( preambleLen >> 8 ) & 0xFF ) );
  422. SX1276Write( REG_LR_PREAMBLELSB, ( uint8_t )( preambleLen & 0xFF ) );
  423. if( fixLen == 1 )
  424. {
  425. SX1276Write( REG_LR_PAYLOADLENGTH, payloadLen );
  426. }
  427. if( SX1276.Settings.LoRa.FreqHopOn == true )
  428. {
  429. SX1276Write( REG_LR_PLLHOP, ( SX1276Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
  430. SX1276Write( REG_LR_HOPPERIOD, SX1276.Settings.LoRa.HopPeriod );
  431. }
  432. if( ( bandwidth == 9 ) && ( SX1276.Settings.Channel > RF_MID_BAND_THRESH ) )
  433. {
  434. // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
  435. SX1276Write( REG_LR_TEST36, 0x02 );
  436. SX1276Write( REG_LR_TEST3A, 0x64 );
  437. }
  438. else if( bandwidth == 9 )
  439. {
  440. // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
  441. SX1276Write( REG_LR_TEST36, 0x02 );
  442. SX1276Write( REG_LR_TEST3A, 0x7F );
  443. }
  444. else
  445. {
  446. // ERRATA 2.1 - Sensitivity Optimization with a 500 kHz Bandwidth
  447. SX1276Write( REG_LR_TEST36, 0x03 );
  448. }
  449. if( datarate == 6 )
  450. {
  451. SX1276Write( REG_LR_DETECTOPTIMIZE,
  452. ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
  453. RFLR_DETECTIONOPTIMIZE_MASK ) |
  454. RFLR_DETECTIONOPTIMIZE_SF6 );
  455. SX1276Write( REG_LR_DETECTIONTHRESHOLD,
  456. RFLR_DETECTIONTHRESH_SF6 );
  457. }
  458. else
  459. {
  460. SX1276Write( REG_LR_DETECTOPTIMIZE,
  461. ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
  462. RFLR_DETECTIONOPTIMIZE_MASK ) |
  463. RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
  464. SX1276Write( REG_LR_DETECTIONTHRESHOLD,
  465. RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
  466. }
  467. }
  468. break;
  469. }
  470. }
  471. void SX1276SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
  472. uint32_t bandwidth, uint32_t datarate,
  473. uint8_t coderate, uint16_t preambleLen,
  474. bool fixLen, bool crcOn, bool freqHopOn,
  475. uint8_t hopPeriod, bool iqInverted, uint32_t timeout )
  476. {
  477. uint8_t paConfig = 0;
  478. uint8_t paDac = 0;
  479. SX1276SetModem( modem );
  480. paConfig = SX1276Read( REG_PACONFIG );
  481. paDac = SX1276Read( REG_PADAC );
  482. //paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | SX1276GetPaSelect( SX1276.Settings.Channel );
  483. //paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
  484. paConfig =0x80; //默认使用PABOOST引脚
  485. if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
  486. {
  487. if( power > 17 )
  488. {
  489. paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
  490. }
  491. else
  492. {
  493. paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
  494. }
  495. if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
  496. {
  497. if( power < 5 )
  498. {
  499. power = 5;
  500. }
  501. if( power > 20 )
  502. {
  503. power = 20;
  504. }
  505. paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
  506. }
  507. else
  508. {
  509. if( power < 2 )
  510. {
  511. power = 2;
  512. }
  513. if( power > 17 )
  514. {
  515. power = 17;
  516. }
  517. paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
  518. }
  519. }
  520. else
  521. {
  522. if( power < -1 )
  523. {
  524. power = -1;
  525. }
  526. if( power > 14 )
  527. {
  528. power = 14;
  529. }
  530. paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
  531. }
  532. SX1276Write( REG_PACONFIG, paConfig );
  533. SX1276Write( REG_PADAC, paDac );
  534. switch( modem )
  535. {
  536. case MODEM_FSK:
  537. {
  538. SX1276.Settings.Fsk.Power = power;
  539. SX1276.Settings.Fsk.Fdev = fdev;
  540. SX1276.Settings.Fsk.Bandwidth = bandwidth;
  541. SX1276.Settings.Fsk.Datarate = datarate;
  542. SX1276.Settings.Fsk.PreambleLen = preambleLen;
  543. SX1276.Settings.Fsk.FixLen = fixLen;
  544. SX1276.Settings.Fsk.CrcOn = crcOn;
  545. SX1276.Settings.Fsk.IqInverted = iqInverted;
  546. SX1276.Settings.Fsk.TxTimeout = timeout;
  547. fdev = ( uint16_t )( ( double )fdev / ( double )FREQ_STEP );
  548. SX1276Write( REG_FDEVMSB, ( uint8_t )( fdev >> 8 ) );
  549. SX1276Write( REG_FDEVLSB, ( uint8_t )( fdev & 0xFF ) );
  550. datarate = ( uint16_t )( ( double )XTAL_FREQ / ( double )datarate );
  551. SX1276Write( REG_BITRATEMSB, ( uint8_t )( datarate >> 8 ) );
  552. SX1276Write( REG_BITRATELSB, ( uint8_t )( datarate & 0xFF ) );
  553. SX1276Write( REG_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
  554. SX1276Write( REG_PREAMBLELSB, preambleLen & 0xFF );
  555. SX1276Write( REG_PACKETCONFIG1,
  556. ( SX1276Read( REG_PACKETCONFIG1 ) &
  557. RF_PACKETCONFIG1_CRC_MASK &
  558. RF_PACKETCONFIG1_PACKETFORMAT_MASK ) |
  559. ( ( fixLen == 1 ) ? RF_PACKETCONFIG1_PACKETFORMAT_FIXED : RF_PACKETCONFIG1_PACKETFORMAT_VARIABLE ) |
  560. ( crcOn << 4 ) );
  561. }
  562. break;
  563. case MODEM_LORA:
  564. {
  565. SX1276.Settings.LoRa.Power = power;
  566. if( bandwidth > 2 )
  567. {
  568. // Fatal error: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
  569. while( 1 );
  570. }
  571. bandwidth += 7;
  572. SX1276.Settings.LoRa.Bandwidth = bandwidth;
  573. SX1276.Settings.LoRa.Datarate = datarate;
  574. SX1276.Settings.LoRa.Coderate = coderate;
  575. SX1276.Settings.LoRa.PreambleLen = preambleLen;
  576. SX1276.Settings.LoRa.FixLen = fixLen;
  577. SX1276.Settings.LoRa.FreqHopOn = freqHopOn;
  578. SX1276.Settings.LoRa.HopPeriod = hopPeriod;
  579. SX1276.Settings.LoRa.CrcOn = crcOn;
  580. SX1276.Settings.LoRa.IqInverted = iqInverted;
  581. SX1276.Settings.LoRa.TxTimeout = timeout;
  582. if( datarate > 12 )
  583. {
  584. datarate = 12;
  585. }
  586. else if( datarate < 6 )
  587. {
  588. datarate = 6;
  589. }
  590. if( ( ( bandwidth == 7 ) && ( ( datarate == 11 ) || ( datarate == 12 ) ) ) ||
  591. ( ( bandwidth == 8 ) && ( datarate == 12 ) ) )
  592. {
  593. SX1276.Settings.LoRa.LowDatarateOptimize = 0x01;
  594. }
  595. else
  596. {
  597. SX1276.Settings.LoRa.LowDatarateOptimize = 0x00;
  598. }
  599. if( SX1276.Settings.LoRa.FreqHopOn == true )
  600. {
  601. SX1276Write( REG_LR_PLLHOP, ( SX1276Read( REG_LR_PLLHOP ) & RFLR_PLLHOP_FASTHOP_MASK ) | RFLR_PLLHOP_FASTHOP_ON );
  602. SX1276Write( REG_LR_HOPPERIOD, SX1276.Settings.LoRa.HopPeriod );
  603. }
  604. SX1276Write( REG_LR_MODEMCONFIG1,
  605. ( SX1276Read( REG_LR_MODEMCONFIG1 ) &
  606. RFLR_MODEMCONFIG1_BW_MASK &
  607. RFLR_MODEMCONFIG1_CODINGRATE_MASK &
  608. RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) |
  609. ( bandwidth << 4 ) | ( coderate << 1 ) |
  610. fixLen );
  611. SX1276Write( REG_LR_MODEMCONFIG2,
  612. ( SX1276Read( REG_LR_MODEMCONFIG2 ) &
  613. RFLR_MODEMCONFIG2_SF_MASK &
  614. RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) |
  615. ( datarate << 4 ) | ( crcOn << 2 ) );
  616. SX1276Write( REG_LR_MODEMCONFIG3,
  617. ( SX1276Read( REG_LR_MODEMCONFIG3 ) &
  618. RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) |
  619. ( SX1276.Settings.LoRa.LowDatarateOptimize << 3 ) );
  620. SX1276Write( REG_LR_PREAMBLEMSB, ( preambleLen >> 8 ) & 0x00FF );
  621. SX1276Write( REG_LR_PREAMBLELSB, preambleLen & 0xFF );
  622. if( datarate == 6 )
  623. {
  624. SX1276Write( REG_LR_DETECTOPTIMIZE,
  625. ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
  626. RFLR_DETECTIONOPTIMIZE_MASK ) |
  627. RFLR_DETECTIONOPTIMIZE_SF6 );
  628. SX1276Write( REG_LR_DETECTIONTHRESHOLD,
  629. RFLR_DETECTIONTHRESH_SF6 );
  630. }
  631. else
  632. {
  633. SX1276Write( REG_LR_DETECTOPTIMIZE,
  634. ( SX1276Read( REG_LR_DETECTOPTIMIZE ) &
  635. RFLR_DETECTIONOPTIMIZE_MASK ) |
  636. RFLR_DETECTIONOPTIMIZE_SF7_TO_SF12 );
  637. SX1276Write( REG_LR_DETECTIONTHRESHOLD,
  638. RFLR_DETECTIONTHRESH_SF7_TO_SF12 );
  639. }
  640. }
  641. break;
  642. }
  643. }
  644. uint32_t SX1276GetTimeOnAir( RadioModems_t modem, uint8_t pktLen )
  645. {
  646. uint32_t airTime = 0;
  647. double rs = 0;
  648. double ts = 0;
  649. double tPreamble = 0;
  650. double tmp = 0;
  651. double nPayload = 0;
  652. double tPayload = 0;
  653. double tOnAir = 0;
  654. switch( modem )
  655. {
  656. case MODEM_FSK:
  657. {
  658. airTime = round( ( 8 * ( SX1276.Settings.Fsk.PreambleLen +
  659. ( ( SX1276Read( REG_SYNCCONFIG ) & ~RF_SYNCCONFIG_SYNCSIZE_MASK ) + 1 ) +
  660. ( ( SX1276.Settings.Fsk.FixLen == 0x01 ) ? 0.0 : 1.0 ) +
  661. ( ( ( SX1276Read( REG_PACKETCONFIG1 ) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK ) != 0x00 ) ? 1.0 : 0 ) +
  662. pktLen +
  663. ( ( SX1276.Settings.Fsk.CrcOn == 0x01 ) ? 2.0 : 0 ) ) /
  664. SX1276.Settings.Fsk.Datarate ) * 1e3 );
  665. }
  666. break;
  667. case MODEM_LORA:
  668. {
  669. double bw = 0.0;
  670. // REMARK: When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
  671. switch( SX1276.Settings.LoRa.Bandwidth )
  672. {
  673. //case 0: // 7.8 kHz
  674. // bw = 78e2;
  675. // break;
  676. //case 1: // 10.4 kHz
  677. // bw = 104e2;
  678. // break;
  679. //case 2: // 15.6 kHz
  680. // bw = 156e2;
  681. // break;
  682. //case 3: // 20.8 kHz
  683. // bw = 208e2;
  684. // break;
  685. //case 4: // 31.2 kHz
  686. // bw = 312e2;
  687. // break;
  688. //case 5: // 41.4 kHz
  689. // bw = 414e2;
  690. // break;
  691. //case 6: // 62.5 kHz
  692. // bw = 625e2;
  693. // break;
  694. case 7: // 125 kHz
  695. bw = 125e3;
  696. break;
  697. case 8: // 250 kHz
  698. bw = 250e3;
  699. break;
  700. case 9: // 500 kHz
  701. bw = 500e3;
  702. break;
  703. }
  704. // Symbol rate : time for one symbol (secs)
  705. rs = bw / ( 1 << SX1276.Settings.LoRa.Datarate );
  706. ts = 1 / rs;
  707. // time of preamble
  708. tPreamble = ( SX1276.Settings.LoRa.PreambleLen + 4.25 ) * ts;
  709. // Symbol length of payload and time
  710. tmp = ceil( ( 8 * pktLen - 4 * SX1276.Settings.LoRa.Datarate +
  711. 28 + 16 * SX1276.Settings.LoRa.CrcOn -
  712. ( SX1276.Settings.LoRa.FixLen ? 20 : 0 ) ) /
  713. ( double )( 4 * SX1276.Settings.LoRa.Datarate -
  714. ( ( SX1276.Settings.LoRa.LowDatarateOptimize > 0 ) ? 2 : 0 ) ) ) *
  715. ( SX1276.Settings.LoRa.Coderate + 4 );
  716. nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
  717. tPayload = nPayload * ts;
  718. // Time on air
  719. tOnAir = tPreamble + tPayload;
  720. // return us secs
  721. airTime = floor( tOnAir * 1e3 + 0.999 );
  722. }
  723. break;
  724. }
  725. return airTime;
  726. }
  727. void SX1276Send( uint8_t *buffer, uint8_t size )
  728. {
  729. uint32_t txTimeout = 0;
  730. switch( SX1276.Settings.Modem )
  731. {
  732. case MODEM_FSK:
  733. {
  734. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  735. SX1276.Settings.FskPacketHandler.Size = size;
  736. if( SX1276.Settings.Fsk.FixLen == false )
  737. {
  738. SX1276WriteFifo( ( uint8_t* )&size, 1 );
  739. }
  740. else
  741. {
  742. SX1276Write( REG_PAYLOADLENGTH, size );
  743. }
  744. if( ( size > 0 ) && ( size <= 64 ) )
  745. {
  746. SX1276.Settings.FskPacketHandler.ChunkSize = size;
  747. }
  748. else
  749. {
  750. memcpy( RxTxBuffer, buffer, size );
  751. SX1276.Settings.FskPacketHandler.ChunkSize = 32;
  752. }
  753. // Write payload buffer
  754. SX1276WriteFifo( buffer, SX1276.Settings.FskPacketHandler.ChunkSize );
  755. SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.ChunkSize;
  756. txTimeout = SX1276.Settings.Fsk.TxTimeout;
  757. }
  758. break;
  759. case MODEM_LORA:
  760. {
  761. if( SX1276.Settings.LoRa.IqInverted == true )
  762. {
  763. SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_ON ) );
  764. SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
  765. }
  766. else
  767. {
  768. SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
  769. SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
  770. }
  771. SX1276.Settings.LoRaPacketHandler.Size = size;
  772. // Initializes the payload size
  773. SX1276Write( REG_LR_PAYLOADLENGTH, size );
  774. // Full buffer used for Tx
  775. SX1276Write( REG_LR_FIFOTXBASEADDR, 0 );
  776. SX1276Write( REG_LR_FIFOADDRPTR, 0 );
  777. // FIFO operations can not take place in Sleep mode
  778. if( ( SX1276Read( REG_OPMODE ) & ~RF_OPMODE_MASK ) == RF_OPMODE_SLEEP )
  779. {
  780. SX1276SetStby( );
  781. SX1276DelayMs( 1 );
  782. }
  783. // Write payload buffer
  784. SX1276WriteFifo( buffer, size );
  785. txTimeout = SX1276.Settings.LoRa.TxTimeout;
  786. }
  787. break;
  788. }
  789. SX1276SetTx( txTimeout );
  790. }
  791. void SX1276SetSleep( void )
  792. {
  793. SX1276RxTimeoutTimerStop();
  794. SX1276TxTimeoutTimerStop();
  795. SX1276SetOpMode( RF_OPMODE_SLEEP );
  796. SX1276.Settings.State = RF_IDLE;
  797. }
  798. void SX1276SetStby( void )
  799. {
  800. SX1276RxTimeoutTimerStop();
  801. SX1276TxTimeoutTimerStop();
  802. SX1276SetOpMode( RF_OPMODE_STANDBY );
  803. SX1276.Settings.State = RF_IDLE;
  804. }
  805. void SX1276SetRx( uint32_t timeout )
  806. {
  807. bool rxContinuous = false;
  808. switch( SX1276.Settings.Modem )
  809. {
  810. case MODEM_FSK:
  811. {
  812. rxContinuous = SX1276.Settings.Fsk.RxContinuous;
  813. // DIO0=PayloadReady
  814. // DIO1=FifoLevel
  815. // DIO2=SyncAddr
  816. // DIO3=FifoEmpty
  817. // DIO4=Preamble
  818. // DIO5=ModeReady
  819. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
  820. RF_DIOMAPPING1_DIO1_MASK &
  821. RF_DIOMAPPING1_DIO2_MASK ) |
  822. RF_DIOMAPPING1_DIO0_00 |
  823. RF_DIOMAPPING1_DIO1_00 |
  824. RF_DIOMAPPING1_DIO2_11 );
  825. SX1276Write( REG_DIOMAPPING2, ( SX1276Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
  826. RF_DIOMAPPING2_MAP_MASK ) |
  827. RF_DIOMAPPING2_DIO4_11 |
  828. RF_DIOMAPPING2_MAP_PREAMBLEDETECT );
  829. SX1276.Settings.FskPacketHandler.FifoThresh = SX1276Read( REG_FIFOTHRESH ) & 0x3F;
  830. SX1276Write( REG_RXCONFIG, RF_RXCONFIG_AFCAUTO_ON | RF_RXCONFIG_AGCAUTO_ON | RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT );
  831. SX1276.Settings.FskPacketHandler.PreambleDetected = false;
  832. SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
  833. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  834. SX1276.Settings.FskPacketHandler.Size = 0;
  835. }
  836. break;
  837. case MODEM_LORA:
  838. {
  839. if( SX1276.Settings.LoRa.IqInverted == true )
  840. {
  841. SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_ON | RFLR_INVERTIQ_TX_OFF ) );
  842. SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
  843. }
  844. else
  845. {
  846. SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
  847. SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
  848. }
  849. // ERRATA 2.3 - Receiver Spurious Reception of a LoRa Signal
  850. if( SX1276.Settings.LoRa.Bandwidth < 9 )
  851. {
  852. SX1276Write( REG_LR_DETECTOPTIMIZE, SX1276Read( REG_LR_DETECTOPTIMIZE ) & 0x7F );
  853. SX1276Write( REG_LR_TEST30, 0x00 );
  854. switch( SX1276.Settings.LoRa.Bandwidth )
  855. {
  856. case 0: // 7.8 kHz
  857. SX1276Write( REG_LR_TEST2F, 0x48 );
  858. SX1276SetChannel(SX1276.Settings.Channel + 7.81e3 );
  859. break;
  860. case 1: // 10.4 kHz
  861. SX1276Write( REG_LR_TEST2F, 0x44 );
  862. SX1276SetChannel(SX1276.Settings.Channel + 10.42e3 );
  863. break;
  864. case 2: // 15.6 kHz
  865. SX1276Write( REG_LR_TEST2F, 0x44 );
  866. SX1276SetChannel(SX1276.Settings.Channel + 15.62e3 );
  867. break;
  868. case 3: // 20.8 kHz
  869. SX1276Write( REG_LR_TEST2F, 0x44 );
  870. SX1276SetChannel(SX1276.Settings.Channel + 20.83e3 );
  871. break;
  872. case 4: // 31.2 kHz
  873. SX1276Write( REG_LR_TEST2F, 0x44 );
  874. SX1276SetChannel(SX1276.Settings.Channel + 31.25e3 );
  875. break;
  876. case 5: // 41.4 kHz
  877. SX1276Write( REG_LR_TEST2F, 0x44 );
  878. SX1276SetChannel(SX1276.Settings.Channel + 41.67e3 );
  879. break;
  880. case 6: // 62.5 kHz
  881. SX1276Write( REG_LR_TEST2F, 0x40 );
  882. break;
  883. case 7: // 125 kHz
  884. SX1276Write( REG_LR_TEST2F, 0x40 );
  885. break;
  886. case 8: // 250 kHz
  887. SX1276Write( REG_LR_TEST2F, 0x40 );
  888. break;
  889. }
  890. }
  891. else
  892. {
  893. SX1276Write( REG_LR_DETECTOPTIMIZE, SX1276Read( REG_LR_DETECTOPTIMIZE ) | 0x80 );
  894. }
  895. rxContinuous = SX1276.Settings.LoRa.RxContinuous;
  896. if( SX1276.Settings.LoRa.FreqHopOn == true )
  897. {
  898. SX1276Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
  899. //RFLR_IRQFLAGS_RXDONE |
  900. //RFLR_IRQFLAGS_PAYLOADCRCERROR |
  901. RFLR_IRQFLAGS_VALIDHEADER |
  902. RFLR_IRQFLAGS_TXDONE |
  903. RFLR_IRQFLAGS_CADDONE |
  904. //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  905. RFLR_IRQFLAGS_CADDETECTED );
  906. // DIO0=RxDone, DIO2=FhssChangeChannel
  907. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO2_00 );
  908. }
  909. else
  910. {
  911. SX1276Write( REG_LR_IRQFLAGSMASK, //RFLR_IRQFLAGS_RXTIMEOUT |
  912. //RFLR_IRQFLAGS_RXDONE |
  913. //RFLR_IRQFLAGS_PAYLOADCRCERROR |
  914. RFLR_IRQFLAGS_VALIDHEADER |
  915. RFLR_IRQFLAGS_TXDONE |
  916. RFLR_IRQFLAGS_CADDONE |
  917. RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  918. RFLR_IRQFLAGS_CADDETECTED );
  919. // DIO0=RxDone
  920. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
  921. }
  922. SX1276Write( REG_LR_FIFORXBASEADDR, 0 );
  923. SX1276Write( REG_LR_FIFOADDRPTR, 0 );
  924. }
  925. break;
  926. }
  927. memset( RxTxBuffer, 0, ( size_t )RX_BUFFER_SIZE );
  928. SX1276.Settings.State = RF_RX_RUNNING;
  929. if( timeout != 0 )
  930. {
  931. SX1276RxTimeoutTimerStart(timeout);
  932. }
  933. if( SX1276.Settings.Modem == MODEM_FSK )
  934. {
  935. SX1276SetOpMode( RF_OPMODE_RECEIVER );
  936. if( rxContinuous == false )
  937. {
  938. SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
  939. ( ( SX1276Read( REG_SYNCCONFIG ) &
  940. ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
  941. 1.0 ) + 10.0 ) /
  942. ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
  943. }
  944. }
  945. else
  946. {
  947. if( rxContinuous == true )
  948. {
  949. SX1276SetOpMode( RFLR_OPMODE_RECEIVER );
  950. }
  951. else
  952. {
  953. SX1276SetOpMode( RFLR_OPMODE_RECEIVER_SINGLE );
  954. }
  955. }
  956. SX1276Read(REG_LR_IRQFLAGS);//设置接收后读写任意寄存器可以开始接收
  957. }
  958. void SX1276SetTx( uint32_t timeout )
  959. {
  960. switch( SX1276.Settings.Modem )
  961. {
  962. case MODEM_FSK:
  963. {
  964. // DIO0=PacketSent
  965. // DIO1=FifoEmpty
  966. // DIO2=FifoFull
  967. // DIO3=FifoEmpty
  968. // DIO4=LowBat
  969. // DIO5=ModeReady
  970. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RF_DIOMAPPING1_DIO0_MASK &
  971. RF_DIOMAPPING1_DIO1_MASK &
  972. RF_DIOMAPPING1_DIO2_MASK ) |
  973. RF_DIOMAPPING1_DIO1_01 );
  974. SX1276Write( REG_DIOMAPPING2, ( SX1276Read( REG_DIOMAPPING2 ) & RF_DIOMAPPING2_DIO4_MASK &
  975. RF_DIOMAPPING2_MAP_MASK ) );
  976. SX1276.Settings.FskPacketHandler.FifoThresh = SX1276Read( REG_FIFOTHRESH ) & 0x3F;
  977. }
  978. break;
  979. case MODEM_LORA:
  980. {
  981. if( SX1276.Settings.LoRa.FreqHopOn == true )
  982. {
  983. SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  984. RFLR_IRQFLAGS_RXDONE |
  985. RFLR_IRQFLAGS_PAYLOADCRCERROR |
  986. RFLR_IRQFLAGS_VALIDHEADER |
  987. //RFLR_IRQFLAGS_TXDONE |
  988. RFLR_IRQFLAGS_CADDONE |
  989. //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  990. RFLR_IRQFLAGS_CADDETECTED );
  991. // DIO0=TxDone, DIO2=FhssChangeChannel
  992. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK & RFLR_DIOMAPPING1_DIO2_MASK ) | RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO2_00 );
  993. }
  994. else
  995. {
  996. SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  997. RFLR_IRQFLAGS_RXDONE |
  998. RFLR_IRQFLAGS_PAYLOADCRCERROR |
  999. RFLR_IRQFLAGS_VALIDHEADER |
  1000. //RFLR_IRQFLAGS_TXDONE |
  1001. RFLR_IRQFLAGS_CADDONE |
  1002. RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
  1003. RFLR_IRQFLAGS_CADDETECTED );
  1004. // DIO0=TxDone
  1005. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_01 );
  1006. }
  1007. }
  1008. break;
  1009. }
  1010. SX1276.Settings.State = RF_TX_RUNNING;
  1011. SX1276RxTimeoutTimerStart(timeout);
  1012. SX1276SetOpMode( RF_OPMODE_TRANSMITTER );
  1013. SX1276Read(REG_LR_IRQFLAGS);//设置发送后读写任意寄存器可以开始发送
  1014. }
  1015. void SX1276StartCad( void )
  1016. {
  1017. switch( SX1276.Settings.Modem )
  1018. {
  1019. case MODEM_FSK:
  1020. {
  1021. }
  1022. break;
  1023. case MODEM_LORA:
  1024. {
  1025. SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
  1026. RFLR_IRQFLAGS_RXDONE |
  1027. RFLR_IRQFLAGS_PAYLOADCRCERROR |
  1028. RFLR_IRQFLAGS_VALIDHEADER |
  1029. RFLR_IRQFLAGS_TXDONE |
  1030. //RFLR_IRQFLAGS_CADDONE |
  1031. RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
  1032. //RFLR_IRQFLAGS_CADDETECTED
  1033. );
  1034. // DIO3=CADDone
  1035. SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
  1036. SX1276.Settings.State = RF_CAD;
  1037. SX1276SetOpMode( RFLR_OPMODE_CAD );
  1038. }
  1039. break;
  1040. default:
  1041. break;
  1042. }
  1043. }
  1044. int16_t SX1276ReadRssi( RadioModems_t modem )
  1045. {
  1046. int16_t rssi = 0;
  1047. switch( modem )
  1048. {
  1049. case MODEM_FSK:
  1050. rssi = -( SX1276Read( REG_RSSIVALUE ) >> 1 );
  1051. break;
  1052. case MODEM_LORA:
  1053. if( SX1276.Settings.Channel > RF_MID_BAND_THRESH )
  1054. {
  1055. rssi = RSSI_OFFSET_HF + SX1276Read( REG_LR_RSSIVALUE );
  1056. }
  1057. else
  1058. {
  1059. rssi = RSSI_OFFSET_LF + SX1276Read( REG_LR_RSSIVALUE );
  1060. }
  1061. break;
  1062. default:
  1063. rssi = -1;
  1064. break;
  1065. }
  1066. return rssi;
  1067. }
  1068. void SX1276SetOpMode( uint8_t opMode )
  1069. {
  1070. if( opMode == RF_OPMODE_SLEEP )
  1071. {
  1072. SX1276SetAntSwLowPower( true );
  1073. }
  1074. else
  1075. {
  1076. SX1276SetAntSwLowPower( false );
  1077. if( opMode == RF_OPMODE_TRANSMITTER )
  1078. {
  1079. SX1276SetAntSw( 1 );
  1080. }
  1081. else
  1082. {
  1083. SX1276SetAntSw( 0 );
  1084. }
  1085. }
  1086. SX1276Write( REG_OPMODE, ( SX1276Read( REG_OPMODE ) & RF_OPMODE_MASK ) | opMode );
  1087. }
  1088. void SX1276SetModem( RadioModems_t modem )
  1089. {
  1090. if( SX1276.Settings.Modem == modem )
  1091. {
  1092. return;
  1093. }
  1094. SX1276.Settings.Modem = modem;
  1095. switch( SX1276.Settings.Modem )
  1096. {
  1097. default:
  1098. case MODEM_FSK:
  1099. SX1276SetOpMode( RF_OPMODE_SLEEP );
  1100. SX1276Write( REG_OPMODE, ( SX1276Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF );
  1101. SX1276Write( REG_DIOMAPPING1, 0x00 );
  1102. SX1276Write( REG_DIOMAPPING2, 0x30 ); // DIO5=ModeReady
  1103. break;
  1104. case MODEM_LORA:
  1105. SX1276SetOpMode( RF_OPMODE_SLEEP );
  1106. SX1276Write( REG_OPMODE, ( SX1276Read( REG_OPMODE ) & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON );
  1107. SX1276Write( REG_DIOMAPPING1, 0x00 );
  1108. SX1276Write( REG_DIOMAPPING2, 0x00 );
  1109. break;
  1110. }
  1111. }
  1112. void SX1276Write( uint8_t addr, uint8_t data )
  1113. {
  1114. SX1276WriteBuffer( addr, &data, 1 );
  1115. }
  1116. uint8_t SX1276Read( uint8_t addr )
  1117. {
  1118. uint8_t data;
  1119. SX1276ReadBuffer( addr, &data, 1 );
  1120. return data;
  1121. }
  1122. void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
  1123. {
  1124. uint8_t i;
  1125. //NSS = 0;
  1126. Sx1276SetNSS(0);
  1127. Sx1276SpiInOut(addr | 0x80 );
  1128. for( i = 0; i < size; i++ )
  1129. {
  1130. Sx1276SpiInOut(buffer[i] );
  1131. }
  1132. //NSS = 1;
  1133. Sx1276SetNSS(1);
  1134. }
  1135. void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
  1136. {
  1137. uint8_t i;
  1138. //NSS = 0;
  1139. Sx1276SetNSS( 0 );
  1140. Sx1276SpiInOut(addr & 0x7F );
  1141. for( i = 0; i < size; i++ )
  1142. {
  1143. buffer[i] = Sx1276SpiInOut( 0 );
  1144. }
  1145. //NSS = 1;
  1146. Sx1276SetNSS(1);
  1147. }
  1148. void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
  1149. {
  1150. SX1276WriteBuffer( 0, buffer, size );
  1151. }
  1152. void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
  1153. {
  1154. SX1276ReadBuffer( 0, buffer, size );
  1155. }
  1156. void SX1276SetMaxPayloadLength( RadioModems_t modem, uint8_t max )
  1157. {
  1158. SX1276SetModem( modem );
  1159. switch( modem )
  1160. {
  1161. case MODEM_FSK:
  1162. if( SX1276.Settings.Fsk.FixLen == false )
  1163. {
  1164. SX1276Write( REG_PAYLOADLENGTH, max );
  1165. }
  1166. break;
  1167. case MODEM_LORA:
  1168. SX1276Write( REG_LR_PAYLOADMAXLENGTH, max );
  1169. break;
  1170. }
  1171. }
  1172. /*
  1173. 发射超时函数,判断此时发射机状态
  1174. 处于lora状态还是fsk状态
  1175. */
  1176. void SX1276OnTimeoutIrq( void )
  1177. {
  1178. switch( SX1276.Settings.State )
  1179. {
  1180. case RF_RX_RUNNING:
  1181. if( SX1276.Settings.Modem == MODEM_FSK )
  1182. {
  1183. SX1276.Settings.FskPacketHandler.PreambleDetected = false;
  1184. SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
  1185. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  1186. SX1276.Settings.FskPacketHandler.Size = 0;
  1187. // Clear Irqs
  1188. SX1276Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
  1189. RF_IRQFLAGS1_PREAMBLEDETECT |
  1190. RF_IRQFLAGS1_SYNCADDRESSMATCH );
  1191. SX1276Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
  1192. if( SX1276.Settings.Fsk.RxContinuous == true )
  1193. {
  1194. // Continuous mode restart Rx chain
  1195. SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  1196. //TimerStart( &RxTimeoutSyncWord );
  1197. SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
  1198. ( ( SX1276Read( REG_SYNCCONFIG ) &
  1199. ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
  1200. 1.0 ) + 10.0 ) /
  1201. ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
  1202. }
  1203. else
  1204. {
  1205. SX1276.Settings.State = RF_IDLE;
  1206. SX1276SyncWordTimeoutTimerStop();
  1207. }
  1208. }
  1209. if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
  1210. {
  1211. RadioEvents->RxTimeout( );
  1212. }
  1213. break;
  1214. case RF_TX_RUNNING:
  1215. SX1276.Settings.State = RF_IDLE;
  1216. if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )
  1217. {
  1218. RadioEvents->TxTimeout( );
  1219. }
  1220. break;
  1221. default:
  1222. break;
  1223. }
  1224. }
  1225. void SX1276OnDio0Irq( void )
  1226. {
  1227. volatile uint8_t irqFlags = 0;
  1228. int16_t rssi = 0;
  1229. switch( SX1276.Settings.State )
  1230. {
  1231. case RF_RX_RUNNING:
  1232. SX1276RxTimeoutTimerStop();
  1233. // RxDone interrupt
  1234. switch( SX1276.Settings.Modem )
  1235. {
  1236. case MODEM_FSK:
  1237. if( SX1276.Settings.Fsk.CrcOn == true )
  1238. {
  1239. irqFlags = SX1276Read( REG_IRQFLAGS2 );
  1240. if( ( irqFlags & RF_IRQFLAGS2_CRCOK ) != RF_IRQFLAGS2_CRCOK )
  1241. {
  1242. // Clear Irqs
  1243. SX1276Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
  1244. RF_IRQFLAGS1_PREAMBLEDETECT |
  1245. RF_IRQFLAGS1_SYNCADDRESSMATCH );
  1246. SX1276Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
  1247. SX1276RxTimeoutTimerStop();
  1248. if( SX1276.Settings.Fsk.RxContinuous == false )
  1249. {
  1250. SX1276SyncWordTimeoutTimerStop();
  1251. SX1276.Settings.State = RF_IDLE;
  1252. }
  1253. else
  1254. {
  1255. // Continuous mode restart Rx chain
  1256. SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  1257. //TimerStart( &RxTimeoutSyncWord );
  1258. SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
  1259. ( ( SX1276Read( REG_SYNCCONFIG ) &
  1260. ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
  1261. 1.0 ) + 10.0 ) /
  1262. ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
  1263. }
  1264. if( ( RadioEvents != NULL ) && ( RadioEvents->RxError != NULL ) )
  1265. {
  1266. RadioEvents->RxError( );
  1267. }
  1268. SX1276.Settings.FskPacketHandler.PreambleDetected = false;
  1269. SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
  1270. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  1271. SX1276.Settings.FskPacketHandler.Size = 0;
  1272. break;
  1273. }
  1274. }
  1275. // Read received packet size
  1276. if( ( SX1276.Settings.FskPacketHandler.Size == 0 ) && ( SX1276.Settings.FskPacketHandler.NbBytes == 0 ) )
  1277. {
  1278. if( SX1276.Settings.Fsk.FixLen == false )
  1279. {
  1280. SX1276ReadFifo( ( uint8_t* )&SX1276.Settings.FskPacketHandler.Size, 1 );
  1281. }
  1282. else
  1283. {
  1284. SX1276.Settings.FskPacketHandler.Size = SX1276Read( REG_PAYLOADLENGTH );
  1285. }
  1286. SX1276ReadFifo( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes, SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1287. SX1276.Settings.FskPacketHandler.NbBytes += ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1288. }
  1289. else
  1290. {
  1291. SX1276ReadFifo( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes, SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1292. SX1276.Settings.FskPacketHandler.NbBytes += ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1293. }
  1294. if( SX1276.Settings.Fsk.RxContinuous == false )
  1295. {
  1296. SX1276.Settings.State = RF_IDLE;
  1297. //TimerStart( &RxTimeoutSyncWord );
  1298. SX1276SyncWordTimeoutTimerStart(ceil( ( 8.0 * ( SX1276.Settings.Fsk.PreambleLen +
  1299. ( ( SX1276Read( REG_SYNCCONFIG ) &
  1300. ~RF_SYNCCONFIG_SYNCSIZE_MASK ) +
  1301. 1.0 ) + 10.0 ) /
  1302. ( double )SX1276.Settings.Fsk.Datarate ) * 1e3 ) + 4 );
  1303. }
  1304. else
  1305. {
  1306. // Continuous mode restart Rx chain
  1307. SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  1308. }
  1309. SX1276RxTimeoutTimerStop();
  1310. if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
  1311. {
  1312. RadioEvents->RxDone( RxTxBuffer, SX1276.Settings.FskPacketHandler.Size, SX1276.Settings.FskPacketHandler.RssiValue, 0 );
  1313. }
  1314. SX1276.Settings.FskPacketHandler.PreambleDetected = false;
  1315. SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
  1316. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  1317. SX1276.Settings.FskPacketHandler.Size = 0;
  1318. break;
  1319. case MODEM_LORA:
  1320. {
  1321. int8_t snr = 0;
  1322. // Clear Irq
  1323. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE );
  1324. irqFlags = SX1276Read( REG_LR_IRQFLAGS );
  1325. if( ( irqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK ) == RFLR_IRQFLAGS_PAYLOADCRCERROR )
  1326. {
  1327. // Clear Irq
  1328. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR );
  1329. if( SX1276.Settings.LoRa.RxContinuous == false )
  1330. {
  1331. SX1276.Settings.State = RF_IDLE;
  1332. }
  1333. SX1276RxTimeoutTimerStop();
  1334. if( ( RadioEvents != NULL ) && ( RadioEvents->RxError != NULL ) )
  1335. {
  1336. RadioEvents->RxError( );
  1337. }
  1338. break;
  1339. }
  1340. SX1276.Settings.LoRaPacketHandler.SnrValue = SX1276Read( REG_LR_PKTSNRVALUE );
  1341. if( SX1276.Settings.LoRaPacketHandler.SnrValue & 0x80 ) // The SNR sign bit is 1
  1342. {
  1343. // Invert and divide by 4
  1344. snr = ( ( ~SX1276.Settings.LoRaPacketHandler.SnrValue + 1 ) & 0xFF ) >> 2;
  1345. snr = -snr;
  1346. }
  1347. else
  1348. {
  1349. // Divide by 4
  1350. snr = ( SX1276.Settings.LoRaPacketHandler.SnrValue & 0xFF ) >> 2;
  1351. }
  1352. rssi = SX1276Read( REG_LR_PKTRSSIVALUE );
  1353. if( snr < 0 )
  1354. {
  1355. if( SX1276.Settings.Channel > RF_MID_BAND_THRESH )
  1356. {
  1357. SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 ) +
  1358. snr;
  1359. }
  1360. else
  1361. {
  1362. SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 ) +
  1363. snr;
  1364. }
  1365. }
  1366. else
  1367. {
  1368. if( SX1276.Settings.Channel > RF_MID_BAND_THRESH )
  1369. {
  1370. SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_HF + rssi + ( rssi >> 4 );
  1371. }
  1372. else
  1373. {
  1374. SX1276.Settings.LoRaPacketHandler.RssiValue = RSSI_OFFSET_LF + rssi + ( rssi >> 4 );
  1375. }
  1376. }
  1377. SX1276.Settings.LoRaPacketHandler.Size = SX1276Read( REG_LR_RXNBBYTES );
  1378. SX1276ReadFifo( RxTxBuffer, SX1276.Settings.LoRaPacketHandler.Size );
  1379. if( SX1276.Settings.LoRa.RxContinuous == false )
  1380. {
  1381. SX1276.Settings.State = RF_IDLE;
  1382. }
  1383. SX1276RxTimeoutTimerStop();
  1384. if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
  1385. {
  1386. RadioEvents->RxDone( RxTxBuffer, SX1276.Settings.LoRaPacketHandler.Size, SX1276.Settings.LoRaPacketHandler.RssiValue, SX1276.Settings.LoRaPacketHandler.SnrValue );
  1387. }
  1388. }
  1389. break;
  1390. default:
  1391. break;
  1392. }
  1393. break;
  1394. case RF_TX_RUNNING:
  1395. SX1276TxTimeoutTimerStop();
  1396. // TxDone interrupt
  1397. switch( SX1276.Settings.Modem )
  1398. {
  1399. case MODEM_LORA:
  1400. // Clear Irq
  1401. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
  1402. // Intentional fall through
  1403. case MODEM_FSK:
  1404. default:
  1405. SX1276.Settings.State = RF_IDLE;
  1406. if( ( RadioEvents != NULL ) && ( RadioEvents->TxDone != NULL ) )
  1407. {
  1408. RadioEvents->TxDone( );
  1409. }
  1410. break;
  1411. }
  1412. break;
  1413. default:
  1414. break;
  1415. }
  1416. }
  1417. void SX1276OnDio1Irq( void )
  1418. {
  1419. switch( SX1276.Settings.State )
  1420. {
  1421. case RF_RX_RUNNING:
  1422. switch( SX1276.Settings.Modem )
  1423. {
  1424. case MODEM_FSK:
  1425. // FifoLevel interrupt
  1426. // Read received packet size
  1427. if( ( SX1276.Settings.FskPacketHandler.Size == 0 ) && ( SX1276.Settings.FskPacketHandler.NbBytes == 0 ) )
  1428. {
  1429. if( SX1276.Settings.Fsk.FixLen == false )
  1430. {
  1431. SX1276ReadFifo( ( uint8_t* )&SX1276.Settings.FskPacketHandler.Size, 1 );
  1432. }
  1433. else
  1434. {
  1435. SX1276.Settings.FskPacketHandler.Size = SX1276Read( REG_PAYLOADLENGTH );
  1436. }
  1437. }
  1438. if( ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes ) > SX1276.Settings.FskPacketHandler.FifoThresh )
  1439. {
  1440. SX1276ReadFifo( ( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes ), SX1276.Settings.FskPacketHandler.FifoThresh );
  1441. SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.FifoThresh;
  1442. }
  1443. else
  1444. {
  1445. SX1276ReadFifo( ( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes ), SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1446. SX1276.Settings.FskPacketHandler.NbBytes += ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1447. }
  1448. break;
  1449. case MODEM_LORA:
  1450. // Sync time out
  1451. SX1276RxTimeoutTimerStop();
  1452. // Clear Irq
  1453. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT );
  1454. SX1276.Settings.State = RF_IDLE;
  1455. if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
  1456. {
  1457. RadioEvents->RxTimeout( );
  1458. }
  1459. break;
  1460. default:
  1461. break;
  1462. }
  1463. break;
  1464. case RF_TX_RUNNING:
  1465. switch( SX1276.Settings.Modem )
  1466. {
  1467. case MODEM_FSK:
  1468. // FifoEmpty interrupt
  1469. if( ( SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes ) > SX1276.Settings.FskPacketHandler.ChunkSize )
  1470. {
  1471. SX1276WriteFifo( ( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes ), SX1276.Settings.FskPacketHandler.ChunkSize );
  1472. SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.ChunkSize;
  1473. }
  1474. else
  1475. {
  1476. // Write the last chunk of data
  1477. SX1276WriteFifo( RxTxBuffer + SX1276.Settings.FskPacketHandler.NbBytes, SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes );
  1478. SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.Size - SX1276.Settings.FskPacketHandler.NbBytes;
  1479. }
  1480. break;
  1481. case MODEM_LORA:
  1482. // Sync time out
  1483. SX1276TxTimeoutTimerStop();
  1484. // Clear Irq
  1485. //SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXTIMEOUT );
  1486. SX1276.Settings.State = RF_IDLE;
  1487. if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )
  1488. {
  1489. RadioEvents->TxTimeout( );
  1490. }
  1491. break;
  1492. default:
  1493. break;
  1494. }
  1495. break;
  1496. default:
  1497. break;
  1498. }
  1499. }
  1500. void SX1276OnDio2Irq( void )
  1501. {
  1502. switch( SX1276.Settings.State )
  1503. {
  1504. case RF_RX_RUNNING:
  1505. switch( SX1276.Settings.Modem )
  1506. {
  1507. case MODEM_FSK:
  1508. if( ( SX1276.Settings.FskPacketHandler.PreambleDetected == true ) && ( SX1276.Settings.FskPacketHandler.SyncWordDetected == false ) )
  1509. {
  1510. SX1276SyncWordTimeoutTimerStop();
  1511. SX1276.Settings.FskPacketHandler.SyncWordDetected = true;
  1512. SX1276.Settings.FskPacketHandler.RssiValue = -( SX1276Read( REG_RSSIVALUE ) >> 1 );
  1513. SX1276.Settings.FskPacketHandler.AfcValue = ( int32_t )( double )( ( ( uint16_t )SX1276Read( REG_AFCMSB ) << 8 ) |
  1514. ( uint16_t )SX1276Read( REG_AFCLSB ) ) *
  1515. ( double )FREQ_STEP;
  1516. SX1276.Settings.FskPacketHandler.RxGain = ( SX1276Read( REG_LNA ) >> 5 ) & 0x07;
  1517. }
  1518. break;
  1519. case MODEM_LORA:
  1520. if( SX1276.Settings.LoRa.FreqHopOn == true )
  1521. {
  1522. // Clear Irq
  1523. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
  1524. if( ( RadioEvents != NULL ) && ( RadioEvents->FhssChangeChannel != NULL ) )
  1525. {
  1526. RadioEvents->FhssChangeChannel( ( SX1276Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
  1527. }
  1528. }
  1529. break;
  1530. default:
  1531. break;
  1532. }
  1533. break;
  1534. case RF_TX_RUNNING:
  1535. switch( SX1276.Settings.Modem )
  1536. {
  1537. case MODEM_FSK:
  1538. break;
  1539. case MODEM_LORA:
  1540. if( SX1276.Settings.LoRa.FreqHopOn == true )
  1541. {
  1542. // Clear Irq
  1543. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
  1544. if( ( RadioEvents != NULL ) && ( RadioEvents->FhssChangeChannel != NULL ) )
  1545. {
  1546. RadioEvents->FhssChangeChannel( ( SX1276Read( REG_LR_HOPCHANNEL ) & RFLR_HOPCHANNEL_CHANNEL_MASK ) );
  1547. }
  1548. }
  1549. break;
  1550. default:
  1551. break;
  1552. }
  1553. break;
  1554. default:
  1555. break;
  1556. }
  1557. }
  1558. void SX1276OnDio3Irq( void )
  1559. {
  1560. switch( SX1276.Settings.Modem )
  1561. {
  1562. case MODEM_FSK:
  1563. break;
  1564. case MODEM_LORA:
  1565. if( ( SX1276Read( REG_LR_IRQFLAGS ) & RFLR_IRQFLAGS_CADDETECTED ) == RFLR_IRQFLAGS_CADDETECTED )
  1566. {
  1567. // Clear Irq
  1568. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED | RFLR_IRQFLAGS_CADDONE );
  1569. if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
  1570. {
  1571. RadioEvents->CadDone( true );
  1572. }
  1573. }
  1574. else
  1575. {
  1576. // Clear Irq
  1577. SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
  1578. if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
  1579. {
  1580. RadioEvents->CadDone( false );
  1581. }
  1582. }
  1583. break;
  1584. default:
  1585. break;
  1586. }
  1587. }
  1588. void SX1276OnDio4Irq( void )
  1589. {
  1590. switch( SX1276.Settings.Modem )
  1591. {
  1592. case MODEM_FSK:
  1593. {
  1594. if( SX1276.Settings.FskPacketHandler.PreambleDetected == false )
  1595. {
  1596. SX1276.Settings.FskPacketHandler.PreambleDetected = true;
  1597. }
  1598. }
  1599. break;
  1600. case MODEM_LORA:
  1601. break;
  1602. default:
  1603. break;
  1604. }
  1605. }
  1606. void SX1276OnDio5Irq( void )
  1607. {
  1608. switch( SX1276.Settings.Modem )
  1609. {
  1610. case MODEM_FSK:
  1611. break;
  1612. case MODEM_LORA:
  1613. break;
  1614. default:
  1615. break;
  1616. }
  1617. }
  1618. //一些和硬件相关写死的内容
  1619. //切换射频输出口
  1620. uint8_t SX1276GetPaSelect( uint32_t channel )
  1621. {
  1622. //硬件上都连接到 PABOOST 上了,没有使用RFO,所以统一返回 RF_PACONFIG_PASELECT_PABOOST
  1623. return RF_PACONFIG_PASELECT_PABOOST;
  1624. /*if( channel < RF_MID_BAND_THRESH )
  1625. {
  1626. return RF_PACONFIG_PASELECT_PABOOST;
  1627. }
  1628. else
  1629. {
  1630. return RF_PACONFIG_PASELECT_RFO;
  1631. }*/
  1632. }
  1633. void SX1276AntSwInit( void )
  1634. {
  1635. /* 我们的RA-01/02模组的天线切换开关由硬件自动控制,不需要软件控制
  1636. GpioInit( &AntSwitchLf, RADIO_ANT_SWITCH_LF, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 1 );
  1637. GpioInit( &AntSwitchHf, RADIO_ANT_SWITCH_HF, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );*/
  1638. }
  1639. void SX1276AntSwDeInit( void )
  1640. {
  1641. /* 我们的RA-01/02模组的天线切换开关由硬件自动控制,不需要软件控制
  1642. GpioInit( &AntSwitchLf, RADIO_ANT_SWITCH_LF, PIN_OUTPUT, PIN_OPEN_DRAIN, PIN_NO_PULL, 0 );
  1643. GpioInit( &AntSwitchHf, RADIO_ANT_SWITCH_HF, PIN_OUTPUT, PIN_OPEN_DRAIN, PIN_NO_PULL, 0 );*/
  1644. }
  1645. void SX1276SetAntSw( uint8_t rxTx )
  1646. {
  1647. /* 我们的RA-01/02模组的天线切换开关由硬件自动控制,不需要软件控制
  1648. if( rxTx != 0 ) // 1: TX, 0: RX
  1649. {
  1650. GpioWrite( &AntSwitchLf, 0 );
  1651. GpioWrite( &AntSwitchHf, 1 );
  1652. }
  1653. else
  1654. {
  1655. GpioWrite( &AntSwitchLf, 1 );
  1656. GpioWrite( &AntSwitchHf, 0 );
  1657. }*/
  1658. }