radio.c 13 KB

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