SX1276.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /**
  2. * Author Wojciech Domski <Wojciech.Domski@gmail.com>
  3. * www: www.Domski.pl
  4. *
  5. * work based on DORJI.COM sample code and
  6. * https://github.com/realspinner/SX1276_LoRa
  7. */
  8. #ifndef __SX1276_H__
  9. #define __SX1276_H__
  10. #include <stdint.h>
  11. #include <stdbool.h>
  12. #include "main.h"
  13. #define SX1276_MAX_PACKET 256
  14. #define SX1276_DEFAULT_TIMEOUT 3000
  15. //Error Coding rate (CR)setting
  16. #define SX1276_CR_4_5
  17. //#define SX1276_CR_4_6
  18. //#define SX1276_CR_4_7
  19. //#define SX1276_CR_4_8
  20. #ifdef SX1276_CR_4_5
  21. #define SX1276_CR 0x01
  22. #else
  23. #ifdef SX1276_CR_4_6
  24. #define SX1276_CR 0x02
  25. #else
  26. #ifdef SX1276_CR_4_7
  27. #define SX1276_CR 0x03
  28. #else
  29. #ifdef SX1276_CR_4_8
  30. #define SX1276_CR 0x04
  31. #endif
  32. #endif
  33. #endif
  34. #endif
  35. //CRC Enable
  36. #define SX1276_CRC_EN
  37. #ifdef SX1276_CRC_EN
  38. #define SX1276_CRC 0x01
  39. #else
  40. #define SX1276_CRC 0x00
  41. #endif
  42. //RFM98 Internal registers Address
  43. /********************LoRa mode***************************/
  44. #define LR_RegFifo 0x00
  45. // Common settings
  46. #define LR_RegOpMode 0x01
  47. #define LR_RegFrMsb 0x06
  48. #define LR_RegFrMid 0x07
  49. #define LR_RegFrLsb 0x08
  50. // Tx settings
  51. #define LR_RegPaConfig 0x09
  52. #define LR_RegPaRamp 0x0A
  53. #define LR_RegOcp 0x0B
  54. // Rx settings
  55. #define LR_RegLna 0x0C
  56. // LoRa registers
  57. #define LR_RegFifoAddrPtr 0x0D
  58. #define LR_RegFifoTxBaseAddr 0x0E
  59. #define LR_RegFifoRxBaseAddr 0x0F
  60. #define LR_RegFifoRxCurrentaddr 0x10
  61. #define LR_RegIrqFlagsMask 0x11
  62. #define LR_RegIrqFlags 0x12
  63. #define LR_RegRxNbBytes 0x13
  64. #define LR_RegRxHeaderCntValueMsb 0x14
  65. #define LR_RegRxHeaderCntValueLsb 0x15
  66. #define LR_RegRxPacketCntValueMsb 0x16
  67. #define LR_RegRxPacketCntValueLsb 0x17
  68. #define LR_RegModemStat 0x18
  69. #define LR_RegPktSnrValue 0x19
  70. #define LR_RegPktRssiValue 0x1A
  71. #define LR_RegRssiValue 0x1B
  72. #define LR_RegHopChannel 0x1C
  73. #define LR_RegModemConfig1 0x1D
  74. #define LR_RegModemConfig2 0x1E
  75. #define LR_RegSymbTimeoutLsb 0x1F
  76. #define LR_RegPreambleMsb 0x20
  77. #define LR_RegPreambleLsb 0x21
  78. #define LR_RegPayloadLength 0x22
  79. #define LR_RegMaxPayloadLength 0x23
  80. #define LR_RegHopPeriod 0x24
  81. #define LR_RegFifoRxByteAddr 0x25
  82. // I/O settings
  83. #define REG_LR_DIOMAPPING1 0x40
  84. #define REG_LR_DIOMAPPING2 0x41
  85. // Version
  86. #define REG_LR_VERSION 0x42
  87. // Additional settings
  88. #define REG_LR_PLLHOP 0x44
  89. #define REG_LR_TCXO 0x4B
  90. #define REG_LR_PADAC 0x4D
  91. #define REG_LR_FORMERTEMP 0x5B
  92. #define REG_LR_AGCREF 0x61
  93. #define REG_LR_AGCTHRESH1 0x62
  94. #define REG_LR_AGCTHRESH2 0x63
  95. #define REG_LR_AGCTHRESH3 0x64
  96. /********************FSK/ook mode***************************/
  97. #define RegFIFO 0x00
  98. #define RegOpMode 0x01
  99. #define RegBitRateMsb 0x02
  100. #define RegBitRateLsb 0x03
  101. #define RegFdevMsb 0x04
  102. #define RegFdevLsb 0x05
  103. #define RegFreqMsb 0x06
  104. #define RegFreqMid 0x07
  105. #define RegFreqLsb 0x08
  106. #define RegPaConfig 0x09
  107. #define RegPaRamp 0x0a
  108. #define RegOcp 0x0b
  109. #define RegLna 0x0c
  110. #define RegRxConfig 0x0d
  111. #define RegRssiConfig 0x0e
  112. #define RegRssiCollision 0x0f
  113. #define RegRssiThresh 0x10
  114. #define RegRssiValue 0x11
  115. #define RegRxBw 0x12
  116. #define RegAfcBw 0x13
  117. #define RegOokPeak 0x14
  118. #define RegOokFix 0x15
  119. #define RegOokAvg 0x16
  120. #define RegAfcFei 0x1a
  121. #define RegAfcMsb 0x1b
  122. #define RegAfcLsb 0x1c
  123. #define RegFeiMsb 0x1d
  124. #define RegFeiLsb 0x1e
  125. #define RegPreambleDetect 0x1f
  126. #define RegRxTimeout1 0x20
  127. #define RegRxTimeout2 0x21
  128. #define RegRxTimeout3 0x22
  129. #define RegRxDelay 0x23
  130. #define RegOsc 0x24
  131. #define RegPreambleMsb 0x25
  132. #define RegPreambleLsb 0x26
  133. #define RegSyncConfig 0x27
  134. #define RegSyncValue1 0x28
  135. #define RegSyncValue2 0x29
  136. #define RegSyncValue3 0x2a
  137. #define RegSyncValue4 0x2b
  138. #define RegSyncValue5 0x2c
  139. #define RegSyncValue6 0x2d
  140. #define RegSyncValue7 0x2e
  141. #define RegSyncValue8 0x2f
  142. #define RegPacketConfig1 0x30
  143. #define RegPacketConfig2 0x31
  144. #define RegPayloadLength 0x32
  145. #define RegNodeAdrs 0x33
  146. #define RegBroadcastAdrs 0x34
  147. #define RegFifoThresh 0x35
  148. #define RegSeqConfig1 0x36
  149. #define RegSeqConfig2 0x37
  150. #define RegTimerResol 0x38
  151. #define RegTimer1Coef 0x39
  152. #define RegTimer2Coef 0x3a
  153. #define RegImageCal 0x3b
  154. #define RegTemp 0x3c
  155. #define RegLowBat 0x3d
  156. #define RegIrqFlags1 0x3e
  157. #define RegIrqFlags2 0x3f
  158. #define RegDioMapping1 0x40
  159. #define RegDioMapping2 0x41
  160. #define RegVersion 0x42
  161. #define RegPllHop 0x44
  162. #define RegPaDac 0x4d
  163. #define RegBitRateFrac 0x5d
  164. /**********************************************************
  165. **Parameter table define
  166. **********************************************************/
  167. #define SX1276_917MHZ 0
  168. static const uint8_t SX1276_Frequency[1][3] = { { 0xE5, 0x40, 0x26 }, //916.9MHz
  169. };/*°ø½Ä : 61.035 * 0xE5 40 26 = 916.9Mhz
  170. (À̰ªÀÌ º¯¼ö) */
  171. #define SX1276_POWER_20DBM 0
  172. #define SX1276_POWER_17DBM 1
  173. #define SX1276_POWER_14DBM 2
  174. #define SX1276_POWER_11DBM 3
  175. static const uint8_t SX1276_Power[4] = { 0xFF, //20dbm
  176. 0xFC, //17dbm
  177. 0xF9, //14dbm
  178. 0xF6, //11dbm
  179. };
  180. #define SX1276_LORA_SF_6 0
  181. #define SX1276_LORA_SF_7 1
  182. #define SX1276_LORA_SF_8 2
  183. #define SX1276_LORA_SF_9 3
  184. #define SX1276_LORA_SF_10 4
  185. #define SX1276_LORA_SF_11 5
  186. #define SX1276_LORA_SF_12 6
  187. static const uint8_t SX1276_SpreadFactor[7] = { 6, 7, 8, 9, 10, 11, 12 };
  188. #define SX1276_LORA_BW_7_8KHZ 0
  189. #define SX1276_LORA_BW_10_4KHZ 1
  190. #define SX1276_LORA_BW_15_6KHZ 2
  191. #define SX1276_LORA_BW_20_8KHZ 3
  192. #define SX1276_LORA_BW_31_2KHZ 4
  193. #define SX1276_LORA_BW_41_7KHZ 5
  194. #define SX1276_LORA_BW_62_5KHZ 6
  195. #define SX1276_LORA_BW_125KHZ 7
  196. #define SX1276_LORA_BW_250KHZ 8
  197. #define SX1276_LORA_BW_500KHZ 9
  198. static const uint8_t SX1276_LoRaBandwidth[10] = { 0, // 7.8KHz,
  199. 1, // 10.4KHz,
  200. 2, // 15.6KHz,
  201. 3, // 20.8KHz,
  202. 4, // 31.2KHz,
  203. 5, // 41.7KHz,
  204. 6, // 62.5KHz,
  205. 7, // 125.0KHz,
  206. 8, // 250.0KHz,
  207. 9 // 500.0KHz
  208. };
  209. typedef enum _SX1276_STATUS {
  210. SLEEP, STANDBY, TX, RX
  211. } SX1276_Status_t;
  212. typedef struct {
  213. int pin;
  214. void * port;
  215. } SX1276_hw_dio_t;
  216. typedef struct {
  217. SX1276_hw_dio_t reset;
  218. SX1276_hw_dio_t dio0;
  219. SX1276_hw_dio_t nss;
  220. void * spi;
  221. } SX1276_hw_t;
  222. typedef struct {
  223. SX1276_hw_t * hw;
  224. uint8_t frequency;
  225. uint8_t power;
  226. uint8_t LoRa_Rate;
  227. uint8_t LoRa_BW;
  228. uint8_t packetLength;
  229. SX1276_Status_t status;
  230. uint8_t rxBuffer[SX1276_MAX_PACKET];
  231. uint8_t readBytes;
  232. } SX1276_t;
  233. //hardware
  234. __weak void SX1276_hw_init(SX1276_hw_t * hw);
  235. __weak void SX1276_hw_SetNSS(SX1276_hw_t * hw, int value);
  236. __weak void SX1276_hw_Reset(SX1276_hw_t * hw);
  237. __weak void SX1276_hw_SPICommand(SX1276_hw_t * hw, uint8_t cmd);
  238. __weak uint8_t SX1276_hw_SPIReadByte(SX1276_hw_t * hw);
  239. __weak void SX1276_hw_DelayMs(uint32_t msec);
  240. __weak int SX1276_hw_GetDIO0(SX1276_hw_t * hw);
  241. //logic
  242. uint8_t SX1276_SPIRead(SX1276_t * module, uint8_t addr);
  243. void SX1276_SPIWrite(SX1276_t * module, uint8_t addr, uint8_t cmd);
  244. void SX1276_SPIBurstRead(SX1276_t * module, uint8_t addr, uint8_t *rxBuf,
  245. uint8_t length);
  246. void SX1276_SPIBurstWrite(SX1276_t * module, uint8_t addr, uint8_t *txBuf,
  247. uint8_t length);
  248. void SX1276_DIO0_InterruptHandler(SX1276_t * module);
  249. void SX1276_config(SX1276_t * module, uint8_t frequency, uint8_t power,
  250. uint8_t LoRa_Rate, uint8_t LoRa_BW);
  251. void SX1276_defaultConfig(SX1276_t * module);
  252. void SX1276_entryLoRa(SX1276_t * module);
  253. void SX1276_clearLoRaIrq(SX1276_t * module);
  254. int SX1276_LoRaEntryRx(SX1276_t * module, uint8_t length, uint32_t timeout);
  255. uint8_t SX1276_LoRaRxPacket(SX1276_t * module);
  256. int SX1276_LoRaEntryTx(SX1276_t * module, uint8_t length, uint32_t timeout);
  257. int SX1276_LoRaTxModeSet(SX1276_t * module, uint8_t length, uint32_t timeout);
  258. int SX1276_LoRaRxModeSet(SX1276_t * module, uint8_t length, uint32_t timeout);
  259. int SX1276_LoRaTxPacket(SX1276_t * module, uint8_t *txBuf, uint8_t length,
  260. uint32_t timeout);
  261. void SX1276_begin(SX1276_t * module, uint8_t frequency, uint8_t power,
  262. uint8_t LoRa_Rate, uint8_t LoRa_BW, uint8_t packetLength);
  263. int SX1276_transmit(SX1276_t * module, uint8_t *txBuf, uint8_t length,
  264. uint32_t timeout);
  265. int SX1276_(SX1276_t * module, uint8_t length, uint32_t timeoutT);
  266. uint8_t SX1276_available(SX1276_t * module);
  267. uint8_t SX1276_read(SX1276_t * module, uint8_t *rxBuf, uint8_t length);
  268. uint8_t SX1276_RSSI_LoRa(SX1276_t * module);
  269. uint8_t SX1276_RSSI(SX1276_t * module);
  270. void SX1276_standby(SX1276_t * module);
  271. void SX1276_sleep(SX1276_t * module);
  272. uint8_t SX1276_SPIIDRead(SX1276_t * module, uint8_t addr);
  273. #endif