myRadio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. #include "board.h"
  2. #include "myRadio.h"
  3. #include "myRadio_gpio.h"
  4. /**-------------------------radio include----------------------------------**/
  5. #include "PAN312x_Driver.h"
  6. /**-------------------------radio include end----------------------------------**/
  7. static int8_t rfTxPower;
  8. static uint32_t rfFrequence;
  9. static uint32_t rfBaudrate;
  10. static uint8_t rfSyncword;
  11. static rfRxCallBack rxCb;
  12. static uint8_t rfRxBuffer[255];
  13. static uint32_t rf_handle;
  14. static uint8_t rf_workProcess = RF_PRC_IDLE;
  15. static uint8_t chipType;
  16. /**-------------------------radio params----------------------------------**/
  17. #define CRC_ENABLE
  18. PAN312xRadioInit RadioInit = {
  19. .FrequencyBase = 433920000,
  20. .FrequencyStep = 0,
  21. .FrequencyChannelNumber = 0,
  22. .ModulationSelect = MOD_2FSK,
  23. .DataRate = 10000, /* match Simple_PingPong */
  24. .TxDeviation = 5000, /* match Simple_PingPong */
  25. .RxDeviation = 5000, /* match Simple_PingPong */
  26. .PowerSelect = POWER_LDO_0603, //POWER_LDO_0603,
  27. .Power = POWER_20dBm, //LDO模式,功率最大20dBm
  28. };
  29. PAN312xCrcInit CrcInit = {
  30. .CrcMode = CRC_MODE_16_BIT,
  31. .CrcPolynomial = 0x8005,
  32. .CrcSeed = 0xffff,
  33. .CrcBitOrder = CRC_BIT_ORDER_MSB_FIRST,
  34. .CrcByteSwap = CRC_BYTE_MSB_FIRST,
  35. .CrcRange = CRC_RANGE_WHOLE_PAYLOAD,
  36. .CrcBitInv = S_DISABLE,
  37. .CrcState = S_ENABLE,
  38. };
  39. PAN312xPacketInit PacketInit = {
  40. .PacketType = VARIABLE_PACKET_TYPE,
  41. .PreambleLength = 8,
  42. .PreambleSeclect = PREAMBLE_0101,
  43. .NonStandardPreamblePattern = 0,
  44. .SyncwordLength = 4,
  45. .SyncwordPattern = 0x2dd42dd4,
  46. .PreambleManchesterMode = MANCHESTER_ZeroToTwo,
  47. .PreambleManchester = S_DISABLE,
  48. .SyncwordManchesterMode = MANCHESTER_ZeroToTwo,
  49. .SyncwordManchester = S_DISABLE,
  50. .PayloadManchesterMode = MANCHESTER_ZeroToTwo,
  51. .PayloadManchester = S_DISABLE,
  52. .FecEncoding = FEC_HAMING_DISABLE,
  53. .WhiteningPattern = WHITENING_DISABLE,
  54. .DataMode = DATA_MODE_PACKET,
  55. .PayloadBitOrder = PAYLOAD_BIT_ORDER_MSB_FIRST,
  56. };
  57. typedef struct
  58. {
  59. uint32_t DataRate;
  60. uint32_t TxDeviation;
  61. uint32_t RxDeviation;
  62. }rdModuleParams_ts;
  63. rdModuleParams_ts rdDeviationParams[] = {
  64. {2400, 1200, 1200}, // 2.4kbps
  65. {10000, 5000, 5000}, // 10kbps
  66. {50000, 25000, 25000}, // 50kbps
  67. {100000, 50000, 50000}, // 100kbps
  68. {200000, 100000, 100000}, // 200kbps
  69. {500000, 250000, 250000}, // 500kbps
  70. };
  71. uint8_t powerValueList[] = {
  72. POWER_20dBm,POWER_19dBm,POWER_18dBm,POWER_17dBm,POWER_16dBm,POWER_15dBm,POWER_14dBm,POWER_13dBm,POWER_12dBm,POWER_11dBm,POWER_10dBm,POWER_9dBm,POWER_8dBm,POWER_7dBm,POWER_6dBm,POWER_5dBm,POWER_4dBm,POWER_3dBm,POWER_2dBm,POWER_1dBm,POWER_0dBm,POWER_N1dBm,POWER_N2dBm,POWER_N3dBm,POWER_N4dBm,POWER_N5dBm,POWER_N6dBm,POWER_N7dBm,POWER_N8dBm,POWER_N9dBm,POWER_N10dBm,POWER_N11dBm,POWER_N12dBm,POWER_N13dBm,POWER_N14dBm,POWER_N15dBm,POWER_N16dBm,POWER_N17dBm,POWER_N18dBm,POWER_N19dBm,POWER_N20dBm
  73. };
  74. bool rf_ifq;
  75. uint8_t getRfPowerTabIndex(int8_t power);
  76. /**-------------------------radio params end----------------------------------**/
  77. void myRadio_delay(uint32_t time_ms)
  78. {
  79. delay1ms(time_ms);
  80. }
  81. /**
  82. * @brief IO口中断回调
  83. * IO口产生中断后会执行该函数
  84. * 用于接收射频工作的中断响应
  85. *
  86. * @param index
  87. */
  88. void myRadio_gpioCallback(uint8_t index)
  89. {
  90. rf_ifq = true;
  91. }
  92. /**
  93. * @brief 射频初始化
  94. *
  95. * @param agr0
  96. * @param agr1_ptr 无线工作状态响应回调
  97. * 产生回调给外部使用,@rfRxCallBack
  98. */
  99. void myRadio_init(int agr0, void *agr1_ptr)
  100. {
  101. myRadio_gpio_init(myRadio_gpioCallback);
  102. /**-------------------------radio init----------------------------------**/
  103. PAN312x_DIO8_INTDISABLE();
  104. PAN312x_Fsk_Init();
  105. uint16_t fwid_buf=0;
  106. PAN312x_Get_FwId(&fwid_buf);
  107. if (fwid_buf == 0x00)
  108. {
  109. return;
  110. }
  111. PAN312x_RadioInit(&RadioInit);
  112. PAN312x_PktInit(&PacketInit);
  113. PAN312x_CrcInit(&CrcInit);
  114. if (PacketInit.PacketType == FIXED_PACKET_TYPE)
  115. {
  116. if(CrcInit.CrcState == S_ENABLE){
  117. PAN312x_Set_TxPacket_Config(TxFixedPackedCrcEnable);
  118. PAN312x_Set_RxPacket_Config(RxFixedPackedCrcEnable);
  119. }else if(CrcInit.CrcState == S_DISABLE){
  120. PAN312x_Set_TxPacket_Config(TxFixedPackedCrcDisable);
  121. PAN312x_Set_RxPacket_Config(RxFixedPackedCrcDisable);
  122. }
  123. }
  124. else
  125. {
  126. if(RadioInit.PowerSelect == POWER_DCDC_0402 || RadioInit.PowerSelect == POWER_DCDC_0603){
  127. PAN312x_DCDC_Enable();
  128. }
  129. if(CrcInit.CrcState == S_ENABLE){
  130. if(CrcInit.CrcBitInv == S_DISABLE){
  131. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcEnable);
  132. PAN312x_Set_TxPacket_Config(TxVariablePackedCrcEnable);
  133. }else if(CrcInit.CrcBitInv == S_ENABLE){
  134. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcBitInvCrcEnable);
  135. }
  136. }else if(CrcInit.CrcState == S_DISABLE){
  137. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcDisable);
  138. PAN312x_Set_TxPacket_Config(TxVariablePackedCrcDisable);
  139. }
  140. }
  141. PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_TX_DONE | IRQ_MASK_RX_DONE | IRQ_MASK_RX_CRC_ERROR | IRQ_MASK_RX_TIMEOUT), S_ENABLE);
  142. PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS);
  143. PAN312x_Irq_Clear_AllStatus();
  144. PAN312x_Set_RxTimeout_ExitState(STATE_READY);
  145. PAN312x_Set_RxInvalid_ExitState(STATE_READY);
  146. PAN312x_Set_RxValid_ExitState(STATE_READY);
  147. DIO8_EnableInterrupt();
  148. #if 0//cw test
  149. PAN312x_Enter_Carrier(433920000,POWER_21dBm);
  150. while(1);
  151. #endif
  152. #if 0 //sleep test
  153. PAN312x_Enter_Sleep(DEEP_SLEEP_MODE, WAKE_UP_STATE_READY);
  154. GPIO_SLEEP_state();//把所有与模块相接的IO口设置为模拟端口
  155. delay1ms(3000);//RF休眠3S后重新进入工作状态
  156. board_GpioInit();
  157. board_spi_int();
  158. PAN312x_DIO8_INTDISABLE();
  159. PAN312x_Fsk_Init();
  160. PAN312x_RadioInit(&RadioInit);
  161. PAN312x_PktInit(&PacketInit);
  162. PAN312x_CrcInit(&CrcInit);
  163. DIO8_EnableInterrupt();
  164. #endif
  165. /**-------------------------radio init end----------------------------------**/
  166. myRadio_delay(10);
  167. if ((rfRxCallBack )agr1_ptr)
  168. {
  169. rxCb = (rfRxCallBack )agr1_ptr;
  170. }
  171. rf_handle = 0xe5;
  172. }
  173. /**
  174. * @brief 射频底层执行程序
  175. * 要放在主循环中执行
  176. *
  177. */
  178. void myRadio_process(void)
  179. {
  180. rfRxPacket_ts rfRxPacket;
  181. PAN312xIrqs xIrqStatus;
  182. if (rf_handle == 0)
  183. {
  184. return;
  185. }
  186. if (rf_ifq == false)
  187. {
  188. return;
  189. }
  190. rf_ifq = false;
  191. if (!((rf_workProcess == RF_PRC_TX) || (rf_workProcess == RF_PRC_RX)))
  192. {
  193. return;
  194. }
  195. PAN312x_Irq_Get_Status(&xIrqStatus);
  196. printf("xIrqStatus.IRQ_STATUS0_F=%02X\n", xIrqStatus.IRQ_STATUS0_F);
  197. if(xIrqStatus.IRQ_STATUS0_F.IRQ_TX_DONE)
  198. {
  199. PAN312x_Enter_Ready();
  200. PAN312x_Flush_TxFifo();
  201. PAN312x_Irq_Clear_AllStatus();
  202. PAN312x_Reset_Modem();
  203. if (rxCb)
  204. {
  205. rxCb(TX_STA_SECCESS, rfRxPacket);
  206. }
  207. }
  208. if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_DONE)
  209. {
  210. if (rxCb)
  211. {
  212. // PAN312x_GetRSSI返回的是绝对值
  213. rfRxPacket.rssi = -(PAN312x_GetRSSI());
  214. rfRxPacket.len = PAN312x_Get_RxLengthInFifo();
  215. PAN312x_Read_Fifo(rfRxPacket.payload, rfRxPacket.len);
  216. printf("rssi=%d len=%d payload=<%s> ", rfRxPacket.rssi, rfRxPacket.len, rfRxPacket.payload);
  217. PAN312x_Irq_Clear_RxDone_Status();
  218. PAN312x_Enter_Ready();
  219. rxCb(RX_STA_SECCESS, rfRxPacket);
  220. }
  221. }
  222. if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_CRC_ERROR ||
  223. xIrqStatus.IRQ_STATUS0_F.IRQ_RX_COMPLETE ||
  224. xIrqStatus.IRQ_STATUS0_F.IRQ_RX_NODEID_ERROR ||
  225. xIrqStatus.IRQ_STATUS0_F.IRQ_RX_LENGTH_DONE ||
  226. xIrqStatus.IRQ_STATUS0_F.IRQ_RX_NODEID_DONE)
  227. {
  228. printf("xIrqStatus.IRQ_STATUS0_F=%02X\n", xIrqStatus.IRQ_STATUS0_F);
  229. PAN312x_Irq_Clear_RxCrcError_Status();
  230. PAN312x_Enter_Ready();
  231. if (rxCb)
  232. {
  233. rxCb(RX_STA_PAYLOAD_ERROR, rfRxPacket);
  234. }
  235. }
  236. }
  237. /**
  238. * @brief 退出射频进入休眠
  239. *
  240. */
  241. void myRadio_abort(void)
  242. {
  243. if (rf_handle == 0)
  244. {
  245. return;
  246. }
  247. PAN312x_Enter_Sleep(SLEEP_MODE, WAKE_UP_STATE_READY);
  248. rf_workProcess = RF_PRC_SLEEP;
  249. }
  250. /**
  251. * @brief 获取射频工作中心频率
  252. *
  253. * @return uint32_t
  254. */
  255. uint32_t myRadio_getFrequency(void)
  256. {
  257. if (rf_handle == 0)
  258. {
  259. return 0;
  260. }
  261. return RadioInit.FrequencyBase + RadioInit.FrequencyChannelNumber * RadioInit.FrequencyStep;
  262. }
  263. /**
  264. * @brief 设置射频工作中心频率对应的信道
  265. *
  266. * @param freq
  267. * 单位:
  268. */
  269. void myRadio_setFrequency(uint32_t freq)
  270. {
  271. if (rf_handle == 0)
  272. {
  273. return;
  274. }
  275. RadioInit.FrequencyBase = freq;
  276. PAN312x_RadioInit(&RadioInit);
  277. }
  278. /**
  279. * @brief 获取发射功率
  280. *
  281. * @return int8_t
  282. */
  283. int8_t myRadio_getTxPower(void)
  284. {
  285. if (rf_handle == 0)
  286. {
  287. return 0;
  288. }
  289. return rfTxPower;
  290. }
  291. /**
  292. * @brief 设置发射功率等级
  293. *
  294. * @param power
  295. * 单位:
  296. */
  297. void myRadio_setTxPower(int8_t power)
  298. {
  299. if (rf_handle == 0)
  300. {
  301. return;
  302. }
  303. rfTxPower = power;
  304. RadioInit.Power = powerValueList[rfTxPower];
  305. PAN312x_RadioInit(&RadioInit);
  306. }
  307. /**
  308. * 获取射频波特率
  309. * @param : br->
  310. */
  311. uint32_t myRadio_getBaudrate(void)
  312. {
  313. if (rf_handle == 0)
  314. {
  315. return 0;
  316. }
  317. return rdDeviationParams[rfBaudrate].DataRate;
  318. }
  319. /**
  320. * 设置射频波特率序号
  321. * @param : br->
  322. */
  323. void myRadio_setBaudrate(uint32_t br)
  324. {
  325. if (rf_handle == 0)
  326. {
  327. return;
  328. }
  329. rfBaudrate = br;
  330. RadioInit.DataRate = rdDeviationParams[rfBaudrate].DataRate;
  331. RadioInit.TxDeviation = rdDeviationParams[rfBaudrate].TxDeviation;
  332. RadioInit.RxDeviation = rdDeviationParams[rfBaudrate].RxDeviation;
  333. PAN312x_RadioInit(&RadioInit);
  334. }
  335. void myRadio_setSyncWord(uint8_t syncword)
  336. {
  337. if (rf_handle == 0)
  338. {
  339. return;
  340. }
  341. rfSyncword = syncword;
  342. }
  343. void myRadio_setRfParams(uint8_t sf, uint8_t bw, uint8_t cr)
  344. {
  345. if (rf_handle == 0)
  346. {
  347. return;
  348. }
  349. }
  350. /**
  351. * @brief 设置模组型号
  352. *
  353. * @param type
  354. */
  355. void myRadio_setChipType(uint8_t type)
  356. {
  357. chipType = type;
  358. }
  359. /**
  360. * @brief 获取模组型号
  361. *
  362. * @return uint8_t
  363. */
  364. uint8_t myRadio_getChipType(void)
  365. {
  366. return chipType;
  367. }
  368. int16_t myRadio_getRssi(void)
  369. {
  370. return (int16_t)0;
  371. }
  372. /**
  373. * @brief 无线发送数据包
  374. *
  375. * @param packet
  376. */
  377. void myRadio_transmit(rfTxPacket_ts *packet)
  378. {
  379. if (rf_handle == 0)
  380. {
  381. return;
  382. }
  383. if (rf_workProcess == RF_PRC_SLEEP)
  384. {
  385. PAN312x_ClkRcl_Enable();
  386. PAN312x_WakeUp_BySpi();
  387. myRadio_delay(10);
  388. }
  389. PAN312x_Enter_Ready();
  390. PAN312x_Irq_Clear_AllStatus();
  391. PAN312x_Write_Fifo(packet->payload, packet->len);
  392. if(PAN312x_OK != PAN312x_Enter_Tx(0, 0, packet->len)){
  393. // g_nNextRFState = RF_STATE_ERROR;
  394. }else{
  395. // g_nNextRFState = RF_STATE_TX_WAIT;
  396. }
  397. rf_workProcess = RF_PRC_TX;
  398. }
  399. /**
  400. * @brief 进入无线接收
  401. *
  402. */
  403. void myRadio_receiver(void)
  404. {
  405. if (rf_handle == 0)
  406. {
  407. return;
  408. }
  409. if (rf_workProcess == RF_PRC_SLEEP)
  410. {
  411. PAN312x_ClkRcl_Enable();
  412. PAN312x_WakeUp_BySpi();
  413. myRadio_delay(10);
  414. }
  415. PAN312x_Enter_Ready();
  416. PAN312x_Irq_Clear_AllStatus();
  417. PAN312x_Flush_RxFifo();
  418. if(PAN312x_OK != PAN312x_Enter_Rx(0, 0, 0)){
  419. // g_nNextRFState = RF_STATE_ERROR;
  420. }else{
  421. // g_nNextRFState = RF_STATE_RX_WAIT;
  422. }
  423. rf_workProcess = RF_PRC_RX;
  424. }
  425. void myRadio_setCtrl(controlMode_te mode, uint32_t value)
  426. {
  427. if (rf_handle == 0)
  428. {
  429. return;
  430. }
  431. rf_workProcess = RF_PRC_TEST_TX;
  432. switch (mode)
  433. {
  434. case RADIO_EXT_CONTROL_TX_UNMODULATED:
  435. {
  436. myRadio_init(0, 0);
  437. rf_workProcess = RF_PRC_TEST_TX;
  438. PAN312x_Enter_Carrier(RadioInit.FrequencyBase, RadioInit.FrequencyStep, RadioInit.FrequencyChannelNumber, POWER_LDO_0402, RadioInit.Power);
  439. }
  440. break;
  441. case RADIO_EXT_CONTROL_TX_MODULATED:
  442. {
  443. rf_workProcess = RF_PRC_TEST_TX;
  444. }
  445. break;
  446. case RADIO_EXT_CONTROL_RX_SENSITIVITY:
  447. {
  448. myRadio_init(0, 0);
  449. /*
  450. * GPIO1 ----> DirectRx
  451. * GPIO2 ----> DirectClk
  452. */
  453. PAN312x_Iomux_Gpio(IOMUX_GPIO0_AS_DIRECT_RX);
  454. PAN312x_Set_Gpio_Mode(PAN312x_GPIO_PIN_0, GPIO_OUTPUT_MODE);
  455. PAN312x_Iomux_Gpio(IOMUX_GPIO2_AS_DIRECT_CLK);
  456. PAN312x_Set_Gpio_Mode(PAN312x_GPIO_PIN_2, GPIO_OUTPUT_MODE);
  457. //使能GPIO Direct Rx
  458. PAN312x_GPIO_Direct_Rx_Enable();
  459. //GPIO Direct Rx寄存器初始化
  460. PAN312x_Gpio_Direct_Rx_Regmap_Init();
  461. //配置为同步模式
  462. PAN312x_Gpio_Direct_Synchronous_Mode();
  463. PAN312x_Gpio_Direct_RxByPass_Enable();
  464. PAN312x_Enter_Rx(0, 0, 0);
  465. rf_workProcess = RF_PRC_RX;
  466. }
  467. break;
  468. default:
  469. break;
  470. }
  471. }
  472. /**-------------------------radio funtion end----------------------------------**/