sx1276.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. /*
  2. * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND
  3. * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER.
  4. * CONSEQUENTLY, SEMTECH SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR
  5. * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  6. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
  7. * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  8. *
  9. * Copyright (C) SEMTECH S.A.
  10. */
  11. /*!
  12. * \file sx1276.c
  13. * \brief SX1276 RF chip driver
  14. *
  15. * \version 2.0.0
  16. * \date May 6 2013
  17. * \author Gregory Cristian
  18. *
  19. * Last modified by Miguel Luis on Jun 19 2013
  20. */
  21. #include "platform.h"
  22. #include "radio.h"
  23. #include "string.h"
  24. #if defined( USE_SX1276_RADIO )
  25. #include "sx1276.h"
  26. #include "sx1276-Hal.h"
  27. #include "sx1276-Fsk.h"
  28. #include "sx1276-LoRa.h"
  29. #include "sx1276-FskMisc.h"
  30. #include "sx1276-LoRamisc.h"
  31. /*!
  32. * SX1276 registers variable
  33. */
  34. uint8_t SX1276Regs[0x70];
  35. static bool LoRaOn = true;
  36. static bool LoRaOnState = false;
  37. extern tFskSettings FskSettings;
  38. void SX1276Init( void )
  39. {
  40. // Initialize FSK and LoRa registers structure
  41. SX1276 = ( tSX1276* )SX1276Regs;
  42. SX1276LR = ( tSX1276LR* )SX1276Regs;
  43. memset(SX1276,(int)0,sizeof(SX1276));
  44. memset(SX1276LR,(int)0,sizeof(SX1276LR));
  45. SX1276Reset( );
  46. SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
  47. // REMARK: After radio reset the default modem is FSK
  48. // #if ( LORA == 0 )
  49. if (LoRaOn == false)
  50. {
  51. LoRaOn = false;
  52. SX1276SetLoRaOn( LoRaOn );
  53. // Initialize FSK modem
  54. SX1276FskInit( );
  55. //
  56. // #else
  57. }
  58. else
  59. {
  60. LoRaOn = true;
  61. SX1276SetLoRaOn( LoRaOn );
  62. // Initialize LoRa modem
  63. SX1276LoRaInit( );
  64. //SX1276LoRaSetPreambleLength(1600);
  65. // #endif
  66. }
  67. }
  68. void EnterRxTestMode()
  69. {
  70. uint8_t PackgeConfigration=0;
  71. SX1276FskSetOpMode( RF_OPMODE_STANDBY );
  72. SX1276Read(REG_PACKETCONFIG2,&PackgeConfigration);
  73. PackgeConfigration=PackgeConfigration&0xBF;
  74. SX1276Write( REG_PACKETCONFIG2, PackgeConfigration );
  75. SX1276Read(REG_PACKETCONFIG2,&PackgeConfigration);
  76. // SyncAddress Dclk Data Timeout
  77. SX1276->RegDioMapping1 = RF_DIOMAPPING1_DIO0_00 | RF_DIOMAPPING1_DIO1_00 | RF_DIOMAPPING1_DIO2_11 | RF_DIOMAPPING1_DIO3_00;
  78. SX1276->RegDioMapping2 = RF_DIOMAPPING2_DIO4_00 | RF_DIOMAPPING2_DIO5_10 | RF_DIOMAPPING2_MAP_PREAMBLEDETECT;
  79. SX1276WriteBuffer( REG_DIOMAPPING1, &SX1276->RegDioMapping1, 2 );
  80. SX1276FskSetOpMode( RF_OPMODE_RECEIVER );
  81. }
  82. void EnterTestMode()
  83. {
  84. SX1276FskSetRFFrequency( FskSettings.RFFrequency );
  85. SX1276FskSetOpMode( RF_OPMODE_TRANSMITTER );
  86. }
  87. static void delay(uint32_t delay_ms)
  88. {
  89. delay1ms(delay_ms);
  90. }
  91. void SX1276Reset( void )
  92. {
  93. // uint32_t startTick;
  94. SX1276SetReset( RADIO_RESET_ON );
  95. // Wait 1ms
  96. // startTick = GET_TICK_COUNT( );
  97. // while( ( GET_TICK_COUNT( ) - startTick ) < TICK_RATE_MS( 1) );
  98. delay(2);
  99. SX1276SetReset( RADIO_RESET_OFF );
  100. delay(10);
  101. // Wait 6ms
  102. // startTick = GET_TICK_COUNT( );
  103. // while( ( GET_TICK_COUNT( ) - startTick ) < TICK_RATE_MS( 6) );
  104. }
  105. void SX1276SetLoRaOn( bool enable )
  106. {
  107. // uint8_t ModeTest=0;
  108. // static uint8_t test=0;
  109. if( LoRaOnState == enable )
  110. {
  111. return;
  112. }
  113. LoRaOnState = enable;
  114. LoRaOn = enable;
  115. if( LoRaOn == true )
  116. {
  117. SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);
  118. SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON;
  119. SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode );
  120. SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
  121. // SX1276Write( REG_LR_FRFMSB, 0x86 );
  122. // SX1276ReadBuffer( REG_LR_FRFMSB, &test, 1);
  123. // RxDone RxTimeout FhssChangeChannel CadDone
  124. SX1276LR->RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00;
  125. // CadDetected ModeReady
  126. SX1276LR->RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
  127. SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR->RegDioMapping1, 2 );
  128. SX1276ReadBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 );
  129. }
  130. else
  131. {
  132. SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
  133. SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF;
  134. SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode );
  135. SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
  136. SX1276ReadBuffer( REG_OPMODE, SX1276Regs + 1, 0x70 - 1 );
  137. }
  138. }
  139. bool SX1276GetLoRaOn( void )
  140. {
  141. return LoRaOn;
  142. }
  143. void SX1276setLoRaSta( bool sta )
  144. {
  145. LoRaOn = sta;
  146. }
  147. void SX1276SetOpMode( uint8_t opMode )
  148. {
  149. if( LoRaOn == false )
  150. {
  151. SX1276FskSetOpMode( opMode );
  152. }
  153. else
  154. {
  155. SX1276LoRaSetOpMode( opMode );
  156. }
  157. }
  158. uint8_t SX1276GetOpMode( void )
  159. {
  160. if( LoRaOn == false )
  161. {
  162. return SX1276FskGetOpMode( );
  163. }
  164. else
  165. {
  166. return SX1276LoRaGetOpMode( );
  167. }
  168. }
  169. double SX1276ReadRssi( void )
  170. {
  171. if( LoRaOn == false )
  172. {
  173. return SX1276FskReadRssi( );
  174. }
  175. else
  176. {
  177. return SX1276LoRaReadRssi( );
  178. }
  179. }
  180. uint8_t SX1276ReadRxGain( void )
  181. {
  182. if( LoRaOn == false )
  183. {
  184. return SX1276FskReadRxGain( );
  185. }
  186. else
  187. {
  188. return SX1276LoRaReadRxGain( );
  189. }
  190. }
  191. uint8_t SX1276GetPacketRxGain( void )
  192. {
  193. if( LoRaOn == false )
  194. {
  195. return SX1276FskGetPacketRxGain( );
  196. }
  197. else
  198. {
  199. return SX1276LoRaGetPacketRxGain( );
  200. }
  201. }
  202. int8_t SX1276GetPacketSnr( void )
  203. {
  204. if( LoRaOn == false )
  205. {
  206. while( 1 )
  207. {
  208. // Useless in FSK mode
  209. // Block program here
  210. }
  211. }
  212. else
  213. {
  214. return SX1276LoRaGetPacketSnr( );
  215. }
  216. }
  217. double SX1276GetPacketRssi( void )
  218. {
  219. if( LoRaOn == false )
  220. {
  221. return SX1276FskGetPacketRssi( );
  222. }
  223. else
  224. {
  225. return SX1276LoRaGetPacketRssi( );
  226. }
  227. }
  228. uint32_t SX1276GetPacketAfc( void )
  229. {
  230. if( LoRaOn == false )
  231. {
  232. return SX1276FskGetPacketAfc( );
  233. }
  234. else
  235. {
  236. while( 1 )
  237. {
  238. // Useless in LoRa mode
  239. // Block program here
  240. }
  241. }
  242. }
  243. void SX1276StartRx( void )
  244. {
  245. if( LoRaOn == false )
  246. {
  247. SX1276FskSetRFState( RF_STATE_RX_INIT );
  248. }
  249. else
  250. {
  251. SX1276LoRaSetRFState( RFLR_STATE_RX_INIT );
  252. }
  253. }
  254. void SX1276StartTx( void )//Add by Andrew
  255. {
  256. if( LoRaOn == false )
  257. {
  258. SX1276FskSetRFState( RF_STATE_TX_INIT );
  259. }
  260. else
  261. {
  262. SX1276LoRaSetRFState( RFLR_STATE_TX_INIT );
  263. }
  264. }
  265. void SX1276GetRxPacket( void *buffer, uint16_t *size )
  266. {
  267. if( LoRaOn == false )
  268. {
  269. SX1276FskGetRxPacket( buffer, size );
  270. }
  271. else
  272. {
  273. SX1276LoRaGetRxPacket( buffer, size );
  274. }
  275. }
  276. void SX1276SetTxPacket( const void *buffer, uint16_t size )
  277. {
  278. if( LoRaOn == false )
  279. {
  280. SX1276FskSetTxPacket( buffer, size );
  281. }
  282. else
  283. {
  284. SX1276LoRaSetTxPacket( buffer, size );
  285. }
  286. }
  287. uint8_t SX1276GetRFState( void )
  288. {
  289. if( LoRaOn == false )
  290. {
  291. return SX1276FskGetRFState( );
  292. }
  293. else
  294. {
  295. return SX1276LoRaGetRFState( );
  296. }
  297. }
  298. void SX1276SetRFState( uint8_t state )
  299. {
  300. if( LoRaOn == false )
  301. {
  302. SX1276FskSetRFState( state );
  303. }
  304. else
  305. {
  306. SX1276LoRaSetRFState( state );
  307. }
  308. }
  309. uint32_t SX1276Process( void )
  310. {
  311. if( LoRaOn == false )
  312. {
  313. return SX1276FskProcess( );
  314. }
  315. else
  316. {
  317. return SX1276LoRaProcess( );
  318. }
  319. }
  320. void testSPI(void)
  321. {
  322. uint8_t readData = 0;
  323. SX1276Read(REG_FRFMSB, &readData);
  324. }
  325. #endif // USE_SX1276_RADIO