radio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. /*******************************************************************************
  2. * @note Copyright (C) 2020 Shanghai Panchip Microelectronics Co., Ltd. All rights reserved.
  3. *
  4. * @file radio.c
  5. * @brief
  6. *
  7. * @history - V3.0, 2021-11-05
  8. *******************************************************************************/
  9. #include "pan3028.h"
  10. #include "radio.h"
  11. #include "stdlib.h"
  12. /*
  13. * flag that indicate if a new packet is received.
  14. */
  15. static int packet_received = RADIO_FLAG_IDLE;
  16. /*
  17. * flag that indicate if transmision is finished.
  18. */
  19. static int packet_transmit = RADIO_FLAG_IDLE;
  20. struct RxDoneMsg RxDoneParams;
  21. /**
  22. * @brief get receive flag
  23. * @param[in] <none>
  24. * @return receive state
  25. */
  26. uint32_t rf_get_recv_flag(void)
  27. {
  28. return packet_received;
  29. }
  30. /**
  31. * @brief set receive flag
  32. * @param[in] <status> receive flag state to set
  33. * @return none
  34. */
  35. void rf_set_recv_flag(int status)
  36. {
  37. packet_received = status;
  38. }
  39. /**
  40. * @brief get transmit flag
  41. * @param[in] <none>
  42. * @return reansmit state
  43. */
  44. uint32_t rf_get_transmit_flag(void)
  45. {
  46. return packet_transmit;
  47. }
  48. /**
  49. * @brief set transmit flag
  50. * @param[in] <status> transmit flag state to set
  51. * @return none
  52. */
  53. void rf_set_transmit_flag(int status)
  54. {
  55. packet_transmit = status;
  56. }
  57. /**
  58. * @brief do basic configuration to initialize
  59. * @param[in] <none>
  60. * @return result
  61. */
  62. uint32_t rf_init(void)
  63. {
  64. if(PAN3028_deepsleep_wakeup() != OK)
  65. {
  66. return FAIL;
  67. }
  68. if(PAN3028_init() != OK)
  69. {
  70. return FAIL;
  71. }
  72. if(rf_set_agc(AGC_ON) != OK)
  73. {
  74. return FAIL;
  75. }
  76. rf_port.antenna_init();
  77. return OK;
  78. }
  79. /**
  80. * @brief change PAN3028 mode from deep sleep to wakeup(STB3)
  81. * @param[in] <none>
  82. * @return result
  83. */
  84. uint32_t rf_deepsleep_wakeup(void)
  85. {
  86. if(PAN3028_deepsleep_wakeup() != OK)
  87. {
  88. return FAIL;
  89. }
  90. if(PAN3028_init() != OK)
  91. {
  92. return FAIL;
  93. }
  94. if(rf_set_agc(AGC_ON) != OK)
  95. {
  96. return FAIL;
  97. }
  98. rf_port.antenna_init();
  99. return OK;
  100. }
  101. /**
  102. * @brief change PAN3028 mode from sleep to wakeup(STB3)
  103. * @param[in] <none>
  104. * @return result
  105. */
  106. uint32_t rf_sleep_wakeup(void)
  107. {
  108. if(PAN3028_sleep_wakeup() != OK)
  109. {
  110. return FAIL;
  111. }
  112. rf_port.antenna_init();
  113. return OK;
  114. }
  115. /**
  116. * @brief change PAN3028 mode from standby3(STB3) to deep sleep, PAN3028 should set DCDC_OFF before enter deepsleep
  117. * @param[in] <none>
  118. * @return result
  119. */
  120. uint32_t rf_deepsleep(void)
  121. {
  122. rf_port.antenna_close();
  123. return PAN3028_deepsleep();
  124. }
  125. /**
  126. * @brief change PAN3028 mode from standby3(STB3) to deep sleep, PAN3028 should set DCDC_OFF before enter sleep
  127. * @param[in] <none>
  128. * @return result
  129. */
  130. uint32_t rf_sleep(void)
  131. {
  132. rf_port.antenna_close();
  133. return PAN3028_sleep();
  134. }
  135. /**
  136. * @brief calculate tx time
  137. * @param[in] <none>
  138. * @return tx time(ms)
  139. */
  140. uint32_t rf_get_tx_time(void)
  141. {
  142. return PAN3028_calculate_tx_time();
  143. }
  144. /**
  145. * @brief set rf mode
  146. * @param[in] <mode>
  147. * PAN3028_MODE_DEEP_SLEEP / PAN3028_MODE_SLEEP
  148. * PAN3028_MODE_STB1 / PAN3028_MODE_STB2
  149. * PAN3028_MODE_STB3 / PAN3028_MODE_TX / PAN3028_MODE_RX
  150. * @return result
  151. */
  152. uint32_t rf_set_mode(uint8_t mode)
  153. {
  154. return PAN3028_set_mode(mode);
  155. }
  156. /**
  157. * @brief get rf mode
  158. * @param[in] <none>
  159. * @return mode
  160. * PAN3028_MODE_DEEP_SLEEP / PAN3028_MODE_SLEEP
  161. * PAN3028_MODE_STB1 / PAN3028_MODE_STB2
  162. * PAN3028_MODE_STB3 / PAN3028_MODE_TX / PAN3028_MODE_RX
  163. */
  164. uint8_t rf_get_mode(void)
  165. {
  166. return PAN3028_get_mode();
  167. }
  168. /**
  169. * @brief set rf Tx mode
  170. * @param[in] <mode>
  171. * PAN3028_TX_SINGLE/PAN3028_TX_CONTINOUS
  172. * @return result
  173. */
  174. uint32_t rf_set_tx_mode(uint8_t mode)
  175. {
  176. return PAN3028_set_tx_mode(mode);
  177. }
  178. /**
  179. * @brief set rf Rx mode
  180. * @param[in] <mode>
  181. * PAN3028_RX_SINGLE/PAN3028_RX_SINGLE_TIMEOUT/PAN3028_RX_CONTINOUS
  182. * @return result
  183. */
  184. uint32_t rf_set_rx_mode(uint8_t mode)
  185. {
  186. return PAN3028_set_rx_mode(mode);
  187. }
  188. /**
  189. * @brief set timeout for Rx. It is useful in PAN3028_RX_SINGLE_TIMEOUT mode
  190. * @param[in] <timeout> rx single timeout time(in ms)
  191. * @return result
  192. */
  193. uint32_t rf_set_rx_single_timeout(uint32_t timeout)
  194. {
  195. return PAN3028_set_timeout(timeout);
  196. }
  197. /**
  198. * @brief get snr value
  199. * @param[in] <none>
  200. * @return snr
  201. */
  202. float rf_get_snr(void)
  203. {
  204. return PAN3028_get_snr();
  205. }
  206. /**
  207. * @brief get rssi value
  208. * @param[in] <none>
  209. * @return rssi
  210. */
  211. float rf_get_rssi(void)
  212. {
  213. return PAN3028_get_rssi();
  214. }
  215. /**
  216. * @brief set preamble
  217. * @param[in] <reg> preamble
  218. * @return result
  219. */
  220. uint32_t rf_set_preamble(uint16_t pream)
  221. {
  222. return PAN3028_set_preamble(pream);
  223. }
  224. /**
  225. * @brief CAD function enable
  226. * @param[in] <none>
  227. * @return result
  228. */
  229. uint32_t rf_set_cad(void)
  230. {
  231. return PAN3028_cad_en();
  232. }
  233. /**
  234. * @brief set rf syncword
  235. * @param[in] <sync> syncword
  236. * @return result
  237. */
  238. uint32_t rf_set_syncword(uint8_t sync)
  239. {
  240. return PAN3028_set_syncword(sync);
  241. }
  242. /**
  243. * @brief read rf syncword
  244. * @param[in] <none>
  245. * @return syncword
  246. */
  247. uint8_t rf_get_syncword(void)
  248. {
  249. return PAN3028_get_syncword();
  250. }
  251. /**
  252. * @brief RF IRQ server routine, it should be call at ISR of IRQ pin
  253. * @param[in] <none>
  254. * @return result
  255. */
  256. void rf_irq_handler(void)
  257. {
  258. PAN3028_irq_handler();
  259. }
  260. /**
  261. * @brief set rf plhd mode on , rf will use early interruption
  262. * @param[in] <addr> PLHD start addr,Range:0..7f
  263. <len> PLHD len
  264. PLHD_LEN8 / PLHD_LEN16
  265. * @return result
  266. */
  267. void rf_set_plhd_rx_on(uint8_t addr,uint8_t len)
  268. {
  269. PAN3028_set_early_irq(PLHD_IRQ_ON);
  270. PAN3028_set_plhd(addr,len);
  271. PAN3028_set_plhd_mask(PLHD_ON);
  272. }
  273. /**
  274. * @brief set rf plhd mode off
  275. * @param[in] <none>
  276. * @return result
  277. */
  278. void rf_set_plhd_rx_off(void)
  279. {
  280. PAN3028_set_early_irq(PLHD_IRQ_OFF);
  281. PAN3028_set_plhd_mask(PLHD_OFF);
  282. }
  283. /**
  284. * @brief receive a packet in non-block method, it will return 0 when no data got
  285. * @param[in] <buff> buffer provide for data to receive
  286. * @return length, it will return 0 when no data got
  287. */
  288. uint32_t rf_receive(uint8_t *buf)
  289. {
  290. return PAN3028_recv_packet(buf);
  291. }
  292. /**
  293. * @brief receive a packet in non-block method, it will return 0 when no data got
  294. * @param[in] <buff> buffer provide for data to receive
  295. <len> PLHD_LEN8 / PLHD_LEN16
  296. * @return result
  297. */
  298. uint32_t rf_plhd_receive(uint8_t *buf,uint8_t len)
  299. {
  300. return PAN3028_plhd_receive(buf,len);
  301. }
  302. /**
  303. * @brief RF PAN3028_irq_handler OnRadioRxPlhdDone callbact,it will use in Plhd Mode
  304. * @param[in] <payload> recv packet
  305. * @param[in] <size> the length of recv packet
  306. * @return none
  307. */
  308. __weak void rf_rx_plhddone_event( uint8_t *payload, uint16_t size )
  309. {
  310. RxDoneParams.PlhdSize = size;
  311. RxDoneParams.PlhdPayload = payload;
  312. rf_set_recv_flag(RADIO_FLAG_PLHDRXDONE);
  313. PAN3028_rst();//stop it
  314. }
  315. /**
  316. * @brief RF PAN3028_irq_handler OnRadioRxDone callbact,it will use in PAN3028_RX_SINGLE/PAN3028_RX_SINGLE_TIMEOUT/PAN3028_RX_CONTINOUS Mode
  317. * @param[in] <payload> recv packet
  318. * @param[in] <size> the length of recv packet
  319. * @param[in] <rssi> the rssi of recv packet
  320. * @param[in] <snr> the snr of recv packet
  321. * @return none
  322. */
  323. __weak void rf_rx_done_event( uint8_t *payload, uint16_t size, double rssi, double snr )
  324. {
  325. RxDoneParams.Payload = payload;
  326. RxDoneParams.Size = size;
  327. RxDoneParams.Rssi = rssi;
  328. RxDoneParams.Snr = snr;
  329. rf_set_recv_flag(RADIO_FLAG_RXDONE);
  330. }
  331. /**
  332. * @brief RF PAN3028_irq_handler OnRadioRxErr callbact,it will use in PAN3028_RX_SINGLE/PAN3028_RX_SINGLE_TIMEOUT/PAN3028_RX_CONTINOUS Mode
  333. * @param[in] <none>
  334. * @return none
  335. */
  336. __weak void rf_rx_err_event(void)
  337. {
  338. rf_set_recv_flag(RADIO_FLAG_RXERR);
  339. }
  340. /**
  341. * @brief RF PAN3028_irq_handler OnRadioRxTimeout callbact,it will use in PAN3028_RX_SINGLE/PAN3028_RX_SINGLE_TIMEOUT/PAN3028_RX_CONTINOUS Mode
  342. * @param[in] <none>
  343. * @return none
  344. */
  345. __weak void rf_rx_timeout_event(void)
  346. {
  347. rf_set_recv_flag(RADIO_FLAG_RXTIMEOUT);
  348. }
  349. /**
  350. * @brief RF PAN3028_irq_handler OnRadioTxDone callbact,it will use in tx Mode
  351. * @param[in] <none>
  352. * @return none
  353. */
  354. __weak void rf_tx_done_event(void)
  355. {
  356. rf_set_transmit_flag(RADIO_FLAG_TXDONE);
  357. }
  358. /**
  359. * @brief rf enter rx continous mode to receive packet
  360. * @param[in] <none>
  361. * @return result
  362. */
  363. uint32_t rf_enter_continous_rx(void)
  364. {
  365. if(PAN3028_set_mode(PAN3028_MODE_STB3) != OK)
  366. {
  367. return FAIL;
  368. }
  369. rf_port.set_rx();
  370. if(PAN3028_set_rx_mode(PAN3028_RX_CONTINOUS) != OK)
  371. {
  372. return FAIL;
  373. }
  374. if(PAN3028_set_mode(PAN3028_MODE_RX) != OK)
  375. {
  376. return FAIL;
  377. }
  378. return OK;
  379. }
  380. /**
  381. * @brief rf enter rx single timeout mode to receive packet
  382. * @param[in] <timeout> rx single timeout time(in ms)
  383. * @return result
  384. */
  385. uint32_t rf_enter_single_timeout_rx(uint32_t timeout)
  386. {
  387. if(PAN3028_set_mode(PAN3028_MODE_STB3) != OK)
  388. {
  389. return FAIL;
  390. }
  391. rf_port.set_rx();
  392. if(PAN3028_set_rx_mode(PAN3028_RX_SINGLE_TIMEOUT) != OK)
  393. {
  394. return FAIL;
  395. }
  396. if(PAN3028_set_timeout(timeout) != OK)
  397. {
  398. return FAIL;
  399. }
  400. if(PAN3028_set_mode(PAN3028_MODE_RX) != OK)
  401. {
  402. return FAIL;
  403. }
  404. return OK;
  405. }
  406. /**
  407. * @brief rf enter rx single mode to receive packet
  408. * @param[in] <none>
  409. * @return result
  410. */
  411. uint32_t rf_enter_single_rx(void)
  412. {
  413. if(PAN3028_set_mode(PAN3028_MODE_STB3) != OK)
  414. {
  415. return FAIL;
  416. }
  417. rf_port.set_rx();
  418. if(PAN3028_set_rx_mode(PAN3028_RX_SINGLE) != OK)
  419. {
  420. return FAIL;
  421. }
  422. if(PAN3028_set_mode(PAN3028_MODE_RX) != OK)
  423. {
  424. return FAIL;
  425. }
  426. return OK;
  427. }
  428. /**
  429. * @brief rf enter single tx mode and send packet
  430. * @param[in] <buf> buffer contain data to send
  431. * @param[in] <size> the length of data to send
  432. * @param[in] <tx_time> the packet tx time
  433. * @return result
  434. */
  435. uint32_t rf_single_tx_data(uint8_t *buf, uint8_t size, uint32_t *tx_time)
  436. {
  437. if(PAN3028_set_mode(PAN3028_MODE_STB3) != OK)
  438. {
  439. return FAIL;
  440. }
  441. rf_port.set_tx();
  442. if(PAN3028_set_tx_mode(PAN3028_TX_SINGLE) != OK)
  443. {
  444. return FAIL;
  445. }
  446. if(PAN3028_send_packet(buf, size) != OK)
  447. {
  448. return FAIL;
  449. }
  450. *tx_time = rf_get_tx_time();
  451. return OK;
  452. }
  453. /**
  454. * @brief rf enter continous tx mode to ready send packet
  455. * @param[in] <none>
  456. * @return result
  457. */
  458. uint32_t rf_enter_continous_tx(void)
  459. {
  460. if(PAN3028_set_mode(PAN3028_MODE_STB3) != OK)
  461. {
  462. return FAIL;
  463. }
  464. rf_port.set_tx();
  465. if(PAN3028_set_tx_mode(PAN3028_TX_CONTINOUS) != OK)
  466. {
  467. return FAIL;
  468. }
  469. return OK;
  470. }
  471. /**
  472. * @brief rf continous mode send packet
  473. * @param[in] <buf> buffer contain data to send
  474. * @param[in] <size> the length of data to send
  475. * @return result
  476. */
  477. uint32_t rf_continous_tx_send_data(uint8_t *buf, uint8_t size)
  478. {
  479. if(PAN3028_send_packet(buf, size) != OK)
  480. {
  481. return FAIL;
  482. }
  483. return OK;
  484. }
  485. /**
  486. * @brief enable AGC function
  487. * @param[in] <state>
  488. * AGC_OFF/AGC_ON
  489. * @return result
  490. */
  491. uint32_t rf_set_agc(uint32_t state)
  492. {
  493. if(PAN3028_agc_enable( state ) != OK)
  494. {
  495. return FAIL;
  496. }
  497. if(PAN3028_agc_config() != OK)
  498. {
  499. return FAIL;
  500. }
  501. return OK;
  502. }
  503. /**
  504. * @brief set rf para
  505. * @param[in] <para_type> set type, rf_para_type_t para_type
  506. * @param[in] <para_val> set value
  507. * @return result
  508. */
  509. uint32_t rf_set_para(rf_para_type_t para_type, uint32_t para_val)
  510. {
  511. PAN3028_set_mode(PAN3028_MODE_STB3);
  512. switch(para_type)
  513. {
  514. case RF_PARA_TYPE_FREQ:
  515. PAN3028_set_freq(para_val);
  516. PAN3028_rst();
  517. break;
  518. case RF_PARA_TYPE_CR:
  519. PAN3028_set_code_rate(para_val);
  520. PAN3028_rst();
  521. break;
  522. case RF_PARA_TYPE_BW:
  523. PAN3028_set_bw(para_val);
  524. PAN3028_rst();
  525. break;
  526. case RF_PARA_TYPE_SF:
  527. PAN3028_set_sf(para_val);
  528. PAN3028_rst();
  529. break;
  530. case RF_PARA_TYPE_TXPOWER:
  531. PAN3028_set_tx_power(para_val);
  532. PAN3028_rst();
  533. break;
  534. case RF_PARA_TYPE_CRC:
  535. PAN3028_set_crc(para_val);
  536. PAN3028_rst();
  537. break;
  538. default:
  539. break;
  540. }
  541. return OK;
  542. }
  543. /**
  544. * @brief get rf para
  545. * @param[in] <para_type> get typ, rf_para_type_t para_type
  546. * @param[in] <para_val> get value
  547. * @return result
  548. */
  549. uint32_t rf_get_para(rf_para_type_t para_type, uint32_t *para_val)
  550. {
  551. PAN3028_set_mode(PAN3028_MODE_STB3);
  552. switch(para_type)
  553. {
  554. case RF_PARA_TYPE_FREQ:
  555. *para_val = PAN3028_read_freq();
  556. break;
  557. case RF_PARA_TYPE_CR:
  558. *para_val = PAN3028_get_code_rate();
  559. break;
  560. case RF_PARA_TYPE_BW:
  561. *para_val = PAN3028_get_bw();
  562. break;
  563. case RF_PARA_TYPE_SF:
  564. *para_val = PAN3028_get_sf();
  565. break;
  566. case RF_PARA_TYPE_TXPOWER:
  567. *para_val = PAN3028_get_tx_power();
  568. break;
  569. case RF_PARA_TYPE_CRC:
  570. *para_val = PAN3028_get_crc();
  571. break;
  572. default:
  573. break;
  574. }
  575. return OK;
  576. }
  577. /**
  578. * @brief set rf default para
  579. * @param[in] <none>
  580. * @return result
  581. */
  582. void rf_set_default_para(void)
  583. {
  584. PAN3028_set_mode(PAN3028_MODE_STB3);
  585. rf_set_para(RF_PARA_TYPE_FREQ, DEFAULT_FREQ);
  586. rf_set_para(RF_PARA_TYPE_CR, DEFAULT_CR);
  587. rf_set_para(RF_PARA_TYPE_BW, DEFAULT_BW);
  588. rf_set_para(RF_PARA_TYPE_SF, DEFAULT_SF);
  589. rf_set_para(RF_PARA_TYPE_TXPOWER, 0X7f);
  590. rf_set_para(RF_PARA_TYPE_CRC, CRC_ON);
  591. rf_set_ldr(LDR_OFF);
  592. }
  593. /**
  594. * @brief set dcdc mode, The default configuration is DCDC_OFF, PAN3028 should set DCDC_OFF before enter sleep/deepsleep
  595. * @param[in] <dcdc_val> dcdc switch
  596. * DCDC_ON / DCDC_OFF
  597. * @return result
  598. */
  599. uint32_t rf_set_dcdc_mode(uint32_t dcdc_val)
  600. {
  601. return PAN3028_set_dcdc_mode(dcdc_val);
  602. }
  603. /**
  604. * @brief set LDR mode
  605. * @param[in] <mode> LDR switch
  606. * LDR_ON / LDR_OFF
  607. * @return result
  608. */
  609. uint32_t rf_set_ldr(uint32_t mode)
  610. {
  611. return PAN3028_set_ldr(mode);
  612. }
  613. /**
  614. * @brief set preamble by Spreading Factor,It is useful in all_sf_search mode
  615. * @param[in] <sf> Spreading Factor
  616. * @return result
  617. */
  618. uint32_t rf_set_all_sf_preamble(uint32_t sf)
  619. {
  620. return PAN3028_set_all_sf_preamble(sf);
  621. }
  622. /**
  623. * @brief open all sf auto-search mode
  624. * @param[in] <none>
  625. * @return result
  626. */
  627. uint32_t rf_set_all_sf_search(void)
  628. {
  629. return PAN3028_set_all_sf_search( );
  630. }
  631. /**
  632. * @brief close all sf auto-search mode
  633. * @param[in] <none>
  634. * @return result
  635. */
  636. uint32_t rf_set_all_sf_search_off(void)
  637. {
  638. return PAN3028_set_all_sf_search_off( );
  639. }
  640. /**
  641. * @brief set enter wave test mode
  642. * @param[in] none
  643. * @return result
  644. */
  645. uint32_t rf_enter_carrier_wave_test_mode(void)
  646. {
  647. uint32_t ret = 0;
  648. ret = PAN3028_set_carrier_wave_test_mode();
  649. rf_port.set_tx();
  650. return ret;
  651. }