myRadio.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. #include "board.h"
  2. #include "myRadio.h"
  3. #include "myRadio_gpio.h"
  4. /**-------------------------radio include----------------------------------**/
  5. #include "radio.h"
  6. #include "crc.h"
  7. #include "sx126x-board.h"
  8. #include "sx126x.h"
  9. /**-------------------------radio include end----------------------------------**/
  10. static int8_t rfTxPower;
  11. static uint32_t rfFrequence;
  12. static uint32_t rfBaudrate;
  13. static rfRxCallBack rxCb;
  14. static uint8_t rfRxBuffer[255];
  15. static uint32_t rf_handle;
  16. static uint8_t rf_workProcess;
  17. static uint8_t chipType;
  18. /**-------------------------radio params----------------------------------**/
  19. static uint32_t rf_rxTimeout = 0; //=0. no time out
  20. //=0xffffffff, into continuous
  21. //=other, time out active, unit: ms
  22. const loraBaudrateFrame_ts loraBaudrateFrame[MAX_RF_BAUDRATE_COUNT] =
  23. {
  24. {//91.55bps,SF=12,BW=62.5kHz(0),CR=4
  25. .SpreadingFactor = 12,
  26. .SignalBw = 0,
  27. .ErrorCoding = 4,
  28. },
  29. {//610.35bps,SF=10,BW=125kHz(1),CR=4
  30. .SpreadingFactor = 10,
  31. .SignalBw = 1,
  32. .ErrorCoding = 4,
  33. },
  34. {//1220.7bps,SF=10,BW=250kHz(2),CR=4
  35. .SpreadingFactor = 10,
  36. .SignalBw = 2,
  37. .ErrorCoding = 4,
  38. },
  39. {//2441.41bps,SF=10,BW=500kHz(3),CR=4
  40. .SpreadingFactor = 10,
  41. .SignalBw = 3,
  42. .ErrorCoding = 4,
  43. },
  44. {//5022.32bps,SF=9,BW=500kHz(3),CR=3
  45. .SpreadingFactor = 9,
  46. .SignalBw = 3,
  47. .ErrorCoding = 3,
  48. },
  49. {//12500bps,SF=8,BW=500kHz(3),CR=1
  50. .SpreadingFactor = 8,
  51. .SignalBw = 3,
  52. .ErrorCoding = 1,
  53. },
  54. {//37500bps,SF=6,BW=500kHz(3),CR=1
  55. .SpreadingFactor = 6,
  56. .SignalBw = 3,
  57. .ErrorCoding = 1,
  58. },
  59. {//62500bps,SF=5,BW=500kHz(3),CR=1
  60. .SpreadingFactor = 5,
  61. .SignalBw = 3,
  62. .ErrorCoding = 1,
  63. },
  64. };
  65. // #define USE_MODEM_LORA
  66. #define REGION_CN779
  67. #if defined( REGION_AS923 )
  68. #define RF_FREQUENCY 923000000 // Hz
  69. #elif defined( REGION_AU915 )
  70. #define RF_FREQUENCY 915000000 // Hz
  71. #elif defined( REGION_CN779 )
  72. #define RF_FREQUENCY 433000000 // Hz
  73. #elif defined( REGION_EU868 )
  74. #define RF_FREQUENCY 868000000 // Hz
  75. #elif defined( REGION_KR920 )
  76. #define RF_FREQUENCY 920000000 // Hz
  77. #elif defined( REGION_IN865 )
  78. #define RF_FREQUENCY 865000000 // Hz
  79. #elif defined( REGION_US915 )
  80. #define RF_FREQUENCY 915000000 // Hz
  81. #elif defined( REGION_US915_HYBRID )
  82. #define RF_FREQUENCY 915000000 // Hz
  83. #else
  84. #error "Please define a frequency band in the compiler options."
  85. #endif
  86. #define TX_OUTPUT_POWER 22 // 22 dBm
  87. uint16_t crc_value;
  88. bool LoRaOn = true;
  89. /*!
  90. * Radio events function pointer
  91. */
  92. #define LORA_BANDWIDTH 1 // [0: 62.5 kHz,
  93. // 1: 125 kHz,
  94. // 2: 250 kHz,
  95. // 3: 500 kHz]
  96. #define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
  97. #define LORA_CODINGRATE 1 // [1: 4/5,
  98. // 2: 4/6,
  99. // 3: 4/7,
  100. // 4: 4/8]
  101. #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
  102. #define LORA_SYMBOL_TIMEOUT 0 // Symbols
  103. #define LORA_FIX_LENGTH_PAYLOAD_ON false
  104. #define LORA_IQ_INVERSION_ON false
  105. // #elif defined( USE_MODEM_FSK )
  106. // #define FSK_FDEV 25e3 // Hz
  107. // #define FSK_DATARATE 9600 // bps
  108. // #define FSK_BANDWIDTH 100e3 // Hz >> DSB in sx126x
  109. // #define FSK_AFC_BANDWIDTH 100e3 // Hz
  110. // #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
  111. // #define FSK_FIX_LENGTH_PAYLOAD_ON false
  112. #define FSK_FDEV 5000 // Hz
  113. #define FSK_DATARATE 4800 // bps
  114. #define FSK_BANDWIDTH 20000 // Hz >> DSB in sx126x
  115. #define FSK_AFC_BANDWIDTH 50000 // Hz
  116. #define FSK_PREAMBLE_LENGTH 3 // Same for Tx and Rx
  117. #define FSK_FIX_LENGTH_PAYLOAD_ON false
  118. // #define FSK_FDEV 47000 // Hz
  119. // #define FSK_DATARATE 100000 // bps
  120. // #define FSK_BANDWIDTH 194000 // Hz >> DSB in sx126x
  121. // #define FSK_AFC_BANDWIDTH 50000 // Hz
  122. // #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
  123. // #define FSK_FIX_LENGTH_PAYLOAD_ON false
  124. // #else
  125. // #error "Please define a modem in the compiler options."
  126. // #endif
  127. typedef enum
  128. {
  129. LOWPOWER,
  130. RX,
  131. RX_TIMEOUT,
  132. RX_ERROR,
  133. TX,
  134. TX_TIMEOUT,
  135. }States_t;
  136. #define RX_TIMEOUT_VALUE 0xffff
  137. #define BUFFER_SIZE 64 // Define the payload size here
  138. States_t State = LOWPOWER;
  139. static RadioEvents_t RadioEvents;
  140. static uint32_t txTimeoutCount;
  141. extern void RadioOnDioIrq( void );
  142. void OnTxDone( void );
  143. void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
  144. void OnTxTimeout( void );
  145. void OnRxTimeout( void );
  146. void OnRxError( void );
  147. void setLoRaSta( bool sta );
  148. bool getLoRaSta(void);
  149. /**-------------------------radio params end----------------------------------**/
  150. void myRadio_delay(uint32_t time_ms)
  151. {
  152. uint32_t i, j;
  153. i = time_ms;
  154. while (i --)
  155. {
  156. for ( j = 0; j < 1000; j++)
  157. {
  158. ;
  159. }
  160. }
  161. }
  162. /**
  163. * @brief IO口中断回调
  164. * IO口产生中断后会执行该函数
  165. * 用于接收射频工作的中断响应
  166. *
  167. * @param index
  168. */
  169. void myRadio_gpioCallback(uint8_t index)
  170. {
  171. RadioOnDioIrq();
  172. }
  173. /**
  174. * @brief 射频初始化
  175. *
  176. * @param agr0
  177. * @param agr1_ptr 无线工作状态响应回调
  178. * 产生回调给外部使用,@rfRxCallBack
  179. */
  180. void myRadio_init(int agr0, void *agr1_ptr)
  181. {
  182. myRadio_gpio_init(myRadio_gpioCallback);
  183. /**-------------------------radio init----------------------------------**/
  184. // Radio initialization
  185. RadioEvents.TxDone = OnTxDone;
  186. RadioEvents.RxDone = OnRxDone;
  187. RadioEvents.TxTimeout = OnTxTimeout;
  188. RadioEvents.RxTimeout = OnRxTimeout;
  189. RadioEvents.RxError = OnRxError;
  190. if ((chipType >= DVTP_VG2379S433N0SA) && (chipType <= DVTP_VGdd79S915N0SA))
  191. {
  192. SX126xEnableTxco(true);
  193. }
  194. Radio.Init( &RadioEvents );
  195. // Radio.SetChannel( RF_FREQUENCY ); //此处屏蔽,由外部设置,myRadio_init之后再单独设置频率
  196. // #if defined( USE_MODEM_LORA )
  197. if (getLoRaSta())
  198. {
  199. Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
  200. LORA_SPREADING_FACTOR, LORA_CODINGRATE,
  201. LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  202. true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );
  203. Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
  204. LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
  205. LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
  206. 0, true, 0, 0, LORA_IQ_INVERSION_ON, false );
  207. }
  208. // #elif defined( USE_MODEM_FSK )
  209. else
  210. {
  211. Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
  212. FSK_DATARATE, 0,
  213. FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
  214. true, 0, 0, 0, 3000 );
  215. Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
  216. 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
  217. 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, false,
  218. 0, 0,false, false);
  219. // #else
  220. }
  221. // #error "Please define a frequency band in the compiler options."
  222. // #endif
  223. RF_SX126x_EXT_PA_TO_IDLE();
  224. /**-------------------------radio init end----------------------------------**/
  225. if ((rfRxCallBack )agr1_ptr)
  226. {
  227. rxCb = (rfRxCallBack )agr1_ptr;
  228. }
  229. rf_handle = 0xe5;
  230. }
  231. /**
  232. * @brief 射频底层执行程序
  233. * 要放在主循环中执行
  234. *
  235. */
  236. void myRadio_process(void)
  237. {
  238. if (rf_handle == 0)
  239. {
  240. return;
  241. }
  242. if (State != TX && State != RX)
  243. {
  244. return;
  245. }
  246. Radio.IrqProcess();
  247. }
  248. /**
  249. * @brief 退出射频进入休眠
  250. * 注意:@README.md的开发注意事项
  251. */
  252. void myRadio_abort(void)
  253. {
  254. if (rf_handle == 0)
  255. {
  256. return;
  257. }
  258. RF_SX126x_EXT_PA_TO_IDLE();
  259. State = LOWPOWER;
  260. Radio.Sleep();
  261. }
  262. /**
  263. * @brief 获取射频工作中心频率
  264. *
  265. * @return uint32_t
  266. */
  267. uint32_t myRadio_getFrequency(void)
  268. {
  269. if (rf_handle == 0)
  270. {
  271. return 0;
  272. }
  273. return rfFrequence;
  274. }
  275. /**
  276. * @brief 设置射频工作中心频率
  277. *
  278. * @param freq
  279. * 具体频点,单位:Hz
  280. */
  281. void myRadio_setFrequency(uint32_t freq)
  282. {
  283. if (rf_handle == 0)
  284. {
  285. return;
  286. }
  287. rfFrequence = freq;
  288. Radio.SetChannel(freq);
  289. }
  290. /**
  291. * @brief 获取发射功率
  292. *
  293. * @return int8_t
  294. */
  295. int8_t myRadio_getTxPower(void)
  296. {
  297. if (rf_handle == 0)
  298. {
  299. return 0;
  300. }
  301. return rfTxPower;
  302. }
  303. /**
  304. * @brief 设置发射功率
  305. *
  306. * @param power
  307. * 单位:dbm
  308. */
  309. void myRadio_setTxPower(int8_t power)
  310. {
  311. if (rf_handle == 0)
  312. {
  313. return;
  314. }
  315. rfTxPower = power;
  316. SX126xSetRfTxPower(rfTxPower);
  317. }
  318. /**
  319. * 获取射频波特率
  320. * @param : br->
  321. */
  322. uint32_t myRadio_getBaudrate(void)
  323. {
  324. if (rf_handle == 0)
  325. {
  326. return 0;
  327. }
  328. return rfBaudrate;
  329. }
  330. /**
  331. * 设置射频波特率
  332. * @param : br->
  333. */
  334. void myRadio_setBaudrate(uint32_t br)
  335. {
  336. if (rf_handle == 0)
  337. {
  338. return;
  339. }
  340. rfBaudrate = br;
  341. if (getLoRaSta())
  342. {
  343. Radio.SetTxConfig( MODEM_LORA, rfTxPower, 0, loraBaudrateFrame[br].SignalBw,
  344. loraBaudrateFrame[br].SpreadingFactor, loraBaudrateFrame[br].ErrorCoding,
  345. LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  346. true, 0, 0, LORA_IQ_INVERSION_ON, 0 );
  347. Radio.SetRxConfig( MODEM_LORA, loraBaudrateFrame[br].SignalBw, loraBaudrateFrame[br].SpreadingFactor,
  348. loraBaudrateFrame[br].ErrorCoding, 0, LORA_PREAMBLE_LENGTH,
  349. LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
  350. 0, true, 0, 0, LORA_IQ_INVERSION_ON, false );
  351. }
  352. }
  353. void myRadio_setRfParams(uint8_t sf, uint8_t bw, uint8_t cr)
  354. {
  355. if (rf_handle == 0)
  356. {
  357. return;
  358. }
  359. if (getLoRaSta())
  360. {
  361. Radio.SetTxConfig( MODEM_LORA, rfTxPower, 0, bw,
  362. sf, cr,
  363. LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  364. true, 0, 0, LORA_IQ_INVERSION_ON, 0 );
  365. Radio.SetRxConfig( MODEM_LORA, bw, sf,
  366. cr, 0, LORA_PREAMBLE_LENGTH,
  367. LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
  368. 0, true, 0, 0, LORA_IQ_INVERSION_ON, false );
  369. printf( "bw=%d, sf=%d, cr=%d\n", bw, sf, cr);
  370. }
  371. }
  372. /**
  373. * @brief 设置模组型号
  374. *
  375. * @param type
  376. */
  377. void myRadio_setChipType(uint8_t type)
  378. {
  379. chipType = type;
  380. }
  381. /**
  382. * @brief 获取模组型号
  383. *
  384. * @return uint8_t
  385. */
  386. uint8_t myRadio_getChipType(void)
  387. {
  388. return chipType;
  389. }
  390. int16_t myRadio_getRssi(void)
  391. {
  392. return Radio.Rssi(MODEM_LORA);
  393. }
  394. /**
  395. * @brief 无线发送数据包
  396. *
  397. * @param packet
  398. */
  399. void myRadio_transmit(rfTxPacket_ts *packet)
  400. {
  401. if (rf_handle == 0)
  402. {
  403. return;
  404. }
  405. RF_SX126x_EXT_PA_TO_TX();
  406. State = TX;
  407. Radio.Send( packet->payload, packet->len );
  408. packet->absTime = Radio.TimeOnAir( MODEM_LORA, packet->len );
  409. }
  410. /**
  411. * @brief 进入无线接收
  412. *
  413. */
  414. void myRadio_receiver(void)
  415. {
  416. if (rf_handle == 0)
  417. {
  418. return;
  419. }
  420. State = RX;
  421. RF_SX126x_EXT_PA_TO_RX();
  422. Radio.Rx( rf_rxTimeout );
  423. }
  424. void myRadio_setCtrl(controlMode_te mode, uint32_t value)
  425. {
  426. if (rf_handle == 0)
  427. {
  428. return;
  429. }
  430. switch (mode)
  431. {
  432. case RADIO_EXT_CONTROL_TX_UNMODULATED:
  433. {
  434. setLoRaSta(false);
  435. myRadio_init(0, 0);
  436. RF_SX126x_EXT_PA_TO_TX();
  437. Radio.SetTxContinuousWave( rfFrequence, rfTxPower, 0 );
  438. }
  439. break;
  440. case RADIO_EXT_CONTROL_TX_MODULATED:
  441. {
  442. setLoRaSta(false);
  443. myRadio_init(0, 0);
  444. RF_SX126x_EXT_PA_TO_TX();
  445. Radio.SetTxContinuousWave( rfFrequence, rfTxPower, 0 );
  446. }
  447. break;
  448. case RADIO_EXT_CONTROL_RX_SENSITIVITY:
  449. {
  450. setLoRaSta(false);
  451. myRadio_init(0, 0);
  452. RF_SX126x_EXT_PA_TO_RX();
  453. Radio.SetChannel(rfFrequence);
  454. Radio.Rx( RX_TIMEOUT_VALUE );
  455. }
  456. break;
  457. default:
  458. break;
  459. }
  460. }
  461. /**-------------------------radio funtion----------------------------------**/
  462. void setLoRaSta( bool sta )
  463. {
  464. LoRaOn = sta;
  465. }
  466. bool getLoRaSta(void)
  467. {
  468. return LoRaOn;
  469. }
  470. void OnTxDone( void )
  471. {
  472. rfRxPacket_ts rfRxPacket;
  473. RF_SX126x_EXT_PA_TO_IDLE();
  474. State = LOWPOWER;
  475. if (rxCb)
  476. {
  477. rxCb(TX_STA_SECCESS, rfRxPacket);
  478. }
  479. }
  480. void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
  481. {
  482. rfRxPacket_ts rfRxPacket;
  483. if (size > MAX_RF_PACKET_LEN)
  484. {
  485. size = MAX_RF_PACKET_LEN;
  486. }
  487. State = LOWPOWER;
  488. memset(rfRxPacket.payload, 0, sizeof(rfRxPacket.payload));
  489. memcpy(rfRxPacket.payload, payload, size);
  490. rfRxPacket.len = size;
  491. rfRxPacket.rssi = rssi;
  492. rfRxPacket.snr = snr;
  493. if (rxCb)
  494. {
  495. rxCb(RX_STA_SECCESS, rfRxPacket);
  496. }
  497. }
  498. void OnTxTimeout( void )
  499. {
  500. rfRxPacket_ts rfRxPacket;
  501. State = TX_TIMEOUT;
  502. if (rxCb)
  503. {
  504. rxCb(TX_STA_ERROR, rfRxPacket);
  505. }
  506. }
  507. void OnRxTimeout( void )
  508. {
  509. rfRxPacket_ts rfRxPacket;
  510. State = RX_TIMEOUT;
  511. if (rxCb)
  512. {
  513. rxCb(RX_STA_TIMEOUT, rfRxPacket);
  514. }
  515. }
  516. void OnRxError( void )
  517. {
  518. rfRxPacket_ts rfRxPacket;
  519. State = RX_ERROR;
  520. if (rxCb)
  521. {
  522. rxCb(RX_STA_PAYLOAD_ERROR, rfRxPacket);
  523. }
  524. }
  525. /**-------------------------radio funtion end----------------------------------**/