myRadio.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. #include "board.h"
  2. #include "myRadio.h"
  3. #include "myRadio_gpio.h"
  4. #include "stm32f10x_it.h"
  5. /**-------------------------radio include----------------------------------**/
  6. #include "A5133_hal.h"
  7. #include "A5133reg.h"
  8. /**-------------------------radio include end----------------------------------**/
  9. static int8_t rfTxPower;
  10. static uint32_t rfFrequence;
  11. static uint32_t rfBaudrate;
  12. static rfRxCallBack rxCb;
  13. static uint8_t rfRxBuffer[255];
  14. static uint32_t rf_handle;
  15. static uint8_t rf_workProcess;
  16. static uint8_t chipType;
  17. /**-------------------------radio params----------------------------------**/
  18. static bool rf_irq;
  19. static irqCallback_ts myIrqCallback_tim1;
  20. // A7169Config_ts A7169ConfigList[MAX_RF_BAUDRATE_COUNT] =
  21. // {
  22. // {
  23. // .config = A7169Config_433Mhz10kbps,
  24. // .pageA = A7169Config_PageA_433Mhz10kbps,
  25. // .pageB = A7169Config_PageB_433Mhz10kbps,
  26. // },
  27. // {
  28. // .config = A7169Config_433Mhz50kbps,
  29. // .pageA = A7169Config_PageA_433Mhz50kbps,
  30. // .pageB = A7169Config_PageB_433Mhz50kbps,
  31. // },
  32. // {
  33. // .config = A7169Config_433Mhz100kbps,
  34. // .pageA = A7169Config_PageA_433Mhz100kbps,
  35. // .pageB = A7169Config_PageB_433Mhz100kbps,
  36. // }
  37. // };
  38. rfTxPowerReg_ts txPowerList[RF_TX_PWR_MAX_COUNT] =
  39. {
  40. {.power = -30, .txlpn = 0, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 0},
  41. {.power = -20, .txlpn = 0, .pgv_pa = PGV_1_6V, .tbf = 6, .tpa = 1},
  42. {.power = -15, .txlpn = 0, .pgv_pa = PGV_1_6V, .tbf = 1, .tpa = 6},
  43. {.power = -10, .txlpn = 0, .pgv_pa = PGV_2_4V, .tbf = 2, .tpa = 2},
  44. {.power = -5, .txlpn = 0, .pgv_pa = PGV_2_4V, .tbf = 5, .tpa = 3},
  45. {.power = -1, .txlpn = 0, .pgv_pa = PGV_2_4V, .tbf = 7, .tpa = 5},
  46. {.power = 0, .txlpn = 0, .pgv_pa = PGV_2_4V, .tbf = 7, .tpa = 6},
  47. {.power = 1, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 1},
  48. {.power = 2, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 2},
  49. {.power = 3, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 4},
  50. {.power = 4, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 5},
  51. {.power = 5, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 6},
  52. {.power = 6, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 0, .tpa = 7},
  53. {.power = 7, .txlpn = 1, .pgv_pa = PGV_1_6V, .tbf = 2, .tpa = 0},
  54. {.power = 8, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 0, .tpa = 3},
  55. {.power = 9, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 0, .tpa = 4},
  56. {.power = 10, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 1, .tpa = 2},
  57. {.power = 11, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 2, .tpa = 1},
  58. {.power = 12, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 2, .tpa = 3},
  59. {.power = 13, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 1, .tpa = 7},
  60. {.power = 14, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 6, .tpa = 0},
  61. {.power = 15, .txlpn = 1, .pgv_pa = PGV_2_4V, .tbf = 7, .tpa = 7},
  62. };
  63. static void tim1_callback(uint8_t status, uint32_t param);
  64. uint8_t getRfPowerTabIndex(int8_t power);
  65. /**-------------------------radio params end----------------------------------**/
  66. void myRadio_delay(uint32_t time_ms)
  67. {
  68. delay_ms(time_ms);
  69. }
  70. /**
  71. * @brief IO口中断回调
  72. * IO口产生中断后会执行该函数
  73. * 用于接收射频工作的中断响应
  74. *
  75. * @param index
  76. */
  77. void myRadio_gpioCallback(uint8_t index)
  78. {
  79. if (rf_handle != 0xe5)
  80. {
  81. return;
  82. }
  83. if ((rf_workProcess != RWP_TX) && (rf_workProcess != RWP_RX))
  84. {
  85. return;
  86. }
  87. rf_irq = true;
  88. }
  89. /**
  90. * @brief 射频初始化
  91. *
  92. * @param agr0
  93. * @param agr1_ptr 无线工作状态响应回调
  94. * 产生回调给外部使用,@rfRxCallBack
  95. */
  96. void myRadio_init(int agr0, void *agr1_ptr)
  97. {
  98. myRadio_gpio_init(myRadio_gpioCallback);
  99. /**-------------------------radio init----------------------------------**/
  100. if (RF_Init()) // init RF
  101. {
  102. Err_State();
  103. }
  104. RF_FIFOLength(64); // 64 bytes
  105. RF_StrobeCmd(CMD_PLL);
  106. // RF_SetCH(80);//freq=5805.001MHz 80
  107. /*
  108. How to set RF channel
  109. RF base Freq : 5725.001MHz
  110. Channel step : 1MHz
  111. SetCH : 80
  112. RF Frequency = RF base Freq + (Channel step * SetCH) = 5725.001MHz + ( 1MHz * 80 ) = 5805.001MHz
  113. */
  114. /**-------------------------radio init end----------------------------------**/
  115. RF_EXT_PA_TO_IDLE();
  116. if ((rfRxCallBack)agr1_ptr)
  117. {
  118. rxCb = (rfRxCallBack)agr1_ptr;
  119. }
  120. rf_handle = 0xe5;
  121. }
  122. /**
  123. * @brief 射频底层执行程序
  124. * 要放在主循环中执行
  125. *
  126. */
  127. void myRadio_process(void)
  128. {
  129. rfRxPacket_ts packet;
  130. if (rf_handle == 0)
  131. {
  132. return;
  133. }
  134. if (rf_irq == false)
  135. {
  136. return;
  137. }
  138. rf_irq = false;
  139. RF_EXT_PA_TO_IDLE();
  140. switch (rf_workProcess)
  141. {
  142. case RWP_TX:
  143. { // Tx done
  144. rf_workProcess = RWP_IDLE;
  145. rxCb(TX_STA_SECCESS, packet);
  146. }
  147. break;
  148. case RWP_RX:
  149. { // Rx done
  150. rf_workProcess = RWP_IDLE;
  151. packet.rssi = RF_RSSI_Read();
  152. packet.len = 64; // RF_GetFIFOLength();
  153. RF_FIFORead(packet.payload, packet.len);
  154. rxCb(RX_STA_SECCESS, packet);
  155. }
  156. break;
  157. default:
  158. break;
  159. }
  160. }
  161. /**
  162. * @brief 退出射频进入休眠
  163. *
  164. */
  165. void myRadio_abort(void)
  166. {
  167. if (rf_handle == 0)
  168. {
  169. return;
  170. }
  171. rf_workProcess = RWP_IDLE;
  172. RF_EXT_PA_TO_IDLE();
  173. RF_PM_SleepMode();
  174. }
  175. /**
  176. * @brief 获取射频工作中心频率
  177. *
  178. * @return uint32_t
  179. */
  180. uint32_t myRadio_getFrequency(void)
  181. {
  182. if (rf_handle == 0)
  183. {
  184. return 0;
  185. }
  186. return rfFrequence;
  187. }
  188. /**
  189. * @brief 设置射频工作中心频率
  190. *
  191. * @param freq
  192. * 具体频点,单位:Hz
  193. */
  194. void myRadio_setFrequency(uint32_t freq)
  195. {
  196. if (rf_handle == 0)
  197. {
  198. return;
  199. }
  200. rfFrequence = freq;
  201. RF_SetCH(rfFrequence);
  202. }
  203. /**
  204. * @brief 获取发射功率
  205. *
  206. * @return int8_t
  207. */
  208. int8_t myRadio_getTxPower(void)
  209. {
  210. if (rf_handle == 0)
  211. {
  212. return 0;
  213. }
  214. return rfTxPower;
  215. }
  216. /**
  217. * @brief 设置发射功率
  218. * @param power
  219. * 单位:dbm
  220. */
  221. void myRadio_setTxPower(int8_t power)
  222. {
  223. txTestReg_tu txTestReg;
  224. code2Page8Reg_tu code2Page8Reg;
  225. code2Page9Reg_tu code2Page9Reg;
  226. code3Page1Reg_tu code3Page1Reg;
  227. uint8_t powerIndex;
  228. if (rf_handle == 0)
  229. {
  230. return;
  231. }
  232. rfTxPower = power;
  233. powerIndex = getRfPowerTabIndex(rfTxPower);
  234. txTestReg.value = RF_ReadReg(TXTEST_REG);
  235. txTestReg.bits_w.tbf = txPowerList[powerIndex].tbf;
  236. RF_WriteReg(TXTEST_REG, txTestReg.value);
  237. code2Page8Reg.value = RF_ReadPage(CODE2_REG, 8);
  238. code2Page8Reg.bits_w.tpa = txPowerList[powerIndex].tpa;
  239. RF_WritePage(CODE2_REG, code2Page8Reg.value, 8);
  240. code2Page9Reg.value = RF_ReadPage(CODE2_REG, 9);
  241. code2Page9Reg.bits_w.pgv_pa = txPowerList[powerIndex].pgv_pa;
  242. RF_WritePage(CODE2_REG, code2Page9Reg.value, 9);
  243. code3Page1Reg.value = RF_ReadPage(CODE3_REG, 1);
  244. code3Page1Reg.bits_w.txlpn = txPowerList[powerIndex].txlpn;
  245. RF_WritePage(CODE3_REG, code3Page1Reg.value, 1);
  246. }
  247. /**
  248. * 获取射频波特率
  249. * @param : br->
  250. */
  251. uint32_t myRadio_getBaudrate(void)
  252. {
  253. if (rf_handle == 0)
  254. {
  255. return 0;
  256. }
  257. return rfBaudrate;
  258. }
  259. /**
  260. * 设置射频波特率
  261. * @param : br->
  262. */
  263. void myRadio_setBaudrate(uint32_t br)
  264. {
  265. rfBaudrate = br;
  266. }
  267. /**
  268. * @brief 设置模组型号
  269. *
  270. * @param type
  271. */
  272. void myRadio_setChipType(uint8_t type)
  273. {
  274. chipType = type;
  275. }
  276. /**
  277. * @brief 获取模组型号
  278. *
  279. * @return uint8_t
  280. */
  281. uint8_t myRadio_getChipType(void)
  282. {
  283. return chipType;
  284. }
  285. int16_t myRadio_getRssi(void)
  286. {
  287. return 0;
  288. }
  289. /**
  290. * @brief 无线发送数据包
  291. *
  292. * @param packet
  293. */
  294. void myRadio_transmit(rfTxPacket_ts *packet)
  295. {
  296. if (rf_handle == 0)
  297. {
  298. return;
  299. }
  300. RF_EXT_PA_TO_TX();
  301. if ((rf_workProcess == RWP_RX) || (rf_workProcess == RWP_SLEEP))
  302. {
  303. rf_workProcess = RWP_IDLE;
  304. RF_StrobeCmd(CMD_STBY);
  305. }
  306. // RF_FIFOLength(packet->len);
  307. RF_FIFOWrite(packet->payload, 64); // write data to TX FIFO
  308. RF_StrobeCmd(CMD_TX);
  309. rf_workProcess = RWP_TX;
  310. }
  311. /**
  312. * @brief 进入无线接收
  313. *
  314. */
  315. void myRadio_receiver(void)
  316. {
  317. if (rf_handle == 0)
  318. {
  319. return;
  320. }
  321. RF_EXT_PA_TO_RX();
  322. if ((rf_workProcess == RWP_TX) || (rf_workProcess == RWP_SLEEP))
  323. {
  324. rf_workProcess = RWP_IDLE;
  325. RF_StrobeCmd(CMD_STBY);
  326. }
  327. RF_StrobeCmd(CMD_RX);
  328. rf_workProcess = RWP_RX;
  329. }
  330. void myRadio_setCtrl(controlMode_te mode, uint32_t value)
  331. {
  332. tx1Reg_tu tx1Reg;
  333. if (rf_handle == 0)
  334. {
  335. return;
  336. }
  337. myRadio_init(0, 0);
  338. RF_SetCH(rfFrequence);
  339. switch (mode)
  340. {
  341. case RADIO_EXT_CONTROL_TX_UNMODULATED:
  342. {
  343. RF_EXT_PA_TO_TX();
  344. myRadio_setTxPower(rfTxPower);
  345. RF_StrobeCmd(CMD_TFR); // TX fifo pointer reset
  346. tx1Reg.value = RF_ReadReg(TX1_REG);
  347. tx1Reg.bits_w.tmde = 0;
  348. tx1Reg.bits_w.tme = 0;
  349. RF_WriteReg(TX1_REG, tx1Reg.value);
  350. RF_StrobeCmd(CMD_TX);
  351. }
  352. break;
  353. case RADIO_EXT_CONTROL_TX_MODULATED:
  354. {
  355. RF_EXT_PA_TO_TX();
  356. RF_StrobeCmd(CMD_TFR); // TX fifo pointer reset
  357. myRadio_setTxPower(rfTxPower);
  358. tx1Reg.value = RF_ReadReg(TX1_REG);
  359. tx1Reg.bits_w.tmde = 1;
  360. tx1Reg.bits_w.tme = 1;
  361. RF_WriteReg(TX1_REG, tx1Reg.value);
  362. RF_StrobeCmd(CMD_TX);
  363. }
  364. break;
  365. case RADIO_EXT_CONTROL_RX_SENSITIVITY:
  366. {
  367. RF_EXT_PA_TO_RX();
  368. myRadio_receiver();
  369. // pageA_gio_tu pageA_gio;
  370. // pageA_gio.value = 0;
  371. // pageA_gio.bits_w.g1oe = 1;
  372. // pageA_gio.bits_w.gio1s = GIOMD_EOAC_FSYNC;
  373. // A7169_WritePageA(GIO_PAGEA, pageA_gio.value); //GIO1=TRXD
  374. // A7169_WritePageA(CKO_PAGEA, 0xD28B); //CKO=RCK
  375. // base_modeControl_tu base_modeControl;
  376. // base_modeControl.value = 0;
  377. // base_modeControl.bits_w.fms = 0;
  378. // base_modeControl.bits_w.trsr = 0;
  379. // base_modeControl.bits_w.cer = 1;
  380. // base_modeControl.bits_w.cce = 1;
  381. // A7169_WriteReg(MODE_REG, base_modeControl.value); //set FMS=0, Direct mode
  382. // RF_StrobeCmd(CMD_RX); //
  383. // myRadio_delay(10);
  384. // pageA_gio.value = 0;
  385. // pageA_gio.bits_w.g1oe = 1;
  386. // pageA_gio.bits_w.gio1s = GIOMD_RXD;
  387. // A7169_WritePageA(GIO_PAGEA, pageA_gio.value); //GIO1=TRXD
  388. }
  389. break;
  390. default:
  391. break;
  392. }
  393. }
  394. /**-------------------------radio funtion----------------------------------**/
  395. static void tim1_callback(uint8_t status, uint32_t param)
  396. {
  397. if (rand() & 0x01)
  398. {
  399. RF_A5133_GPIO1_H();
  400. }
  401. else
  402. {
  403. RF_A5133_GPIO1_L();
  404. }
  405. }
  406. uint8_t getRfPowerTabIndex(int8_t power)
  407. {
  408. for (int i = 0; i < sizeof(txPowerList) / sizeof(rfTxPowerReg_ts); i++)
  409. {
  410. if (txPowerList[i].power >= power)
  411. {
  412. return i;
  413. }
  414. }
  415. return sizeof(txPowerList) / sizeof(rfTxPowerReg_ts) - 1;
  416. }
  417. /**-------------------------radio funtion end----------------------------------**/