myRadio.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. #include "board.h"
  2. #include "myRadio.h"
  3. #include "myRadio_gpio.h"
  4. #include "stm32f10x_it.h"
  5. /**-------------------------radio include----------------------------------**/
  6. #include "math.h"
  7. #include "A7169_hal.h"
  8. #include "A7169reg.h"
  9. #include "A7169config_433Mhz10kbps.h"
  10. #include "A7169config_433Mhz50kbps.h"
  11. #include "A7169config_433Mhz100kbps.h"
  12. /**-------------------------radio include end----------------------------------**/
  13. static int8_t rfTxPower;
  14. static uint32_t rfFrequence;
  15. static uint32_t rfBaudrate;
  16. static rfRxCallBack rxCb;
  17. static uint8_t rfRxBuffer[255];
  18. static uint32_t rf_handle;
  19. static uint8_t rf_workProcess;
  20. static uint8_t chipType;
  21. /**-------------------------radio params----------------------------------**/
  22. static bool rf_irq;
  23. static irqCallback_ts myIrqCallback_tim1;
  24. A7169Config_ts A7169ConfigList[MAX_RF_BAUDRATE_COUNT] =
  25. {
  26. {
  27. .config = A7169Config_433Mhz10kbps,
  28. .pageA = A7169Config_PageA_433Mhz10kbps,
  29. .pageB = A7169Config_PageB_433Mhz10kbps,
  30. },
  31. {
  32. .config = A7169Config_433Mhz50kbps,
  33. .pageA = A7169Config_PageA_433Mhz50kbps,
  34. .pageB = A7169Config_PageB_433Mhz50kbps,
  35. },
  36. {
  37. .config = A7169Config_433Mhz100kbps,
  38. .pageA = A7169Config_PageA_433Mhz100kbps,
  39. .pageB = A7169Config_PageB_433Mhz100kbps,
  40. }
  41. };
  42. rfTxPowerReg_ts rfTxPowerList_433[RF_TX_PWR_MAX_COUNT] =
  43. {
  44. {.power = -14, .tbg = 0, .tdc = 2, .pac = 1,},
  45. {.power = -13, .tbg = 2, .tdc = 0, .pac = 0,},
  46. {.power = -12, .tbg = 3, .tdc = 0, .pac = 0,},
  47. {.power = -11, .tbg = 6, .tdc = 0, .pac = 0,},
  48. {.power = -10, .tbg = 9, .tdc = 0, .pac = 0,},
  49. {.power = -9, .tbg = 11, .tdc = 0, .pac = 0,},
  50. {.power = -8, .tbg = 14, .tdc = 0, .pac = 0,},
  51. {.power = -7, .tbg = 16, .tdc = 0, .pac = 0,},
  52. {.power = -6, .tbg = 1, .tdc = 0, .pac = 1,},
  53. {.power = -5, .tbg = 21, .tdc = 0, .pac = 0,},
  54. {.power = -4, .tbg = 23, .tdc = 0, .pac = 0,},
  55. {.power = -3, .tbg = 1, .tdc = 1, .pac = 1,},
  56. {.power = -2, .tbg = 3, .tdc = 1, .pac = 1,},
  57. {.power = -1, .tbg = 3, .tdc = 2, .pac = 1,},
  58. {.power = 0, .tbg = 4, .tdc = 1, .pac = 1,},
  59. {.power = 1, .tbg = 10, .tdc = 2, .pac = 1,},
  60. {.power = 2, .tbg = 13, .tdc = 2, .pac = 1,},
  61. {.power = 3, .tbg = 17, .tdc = 2, .pac = 1,},
  62. {.power = 4, .tbg = 21, .tdc = 2, .pac = 1,},
  63. {.power = 5, .tbg = 25, .tdc = 2, .pac = 1,},
  64. {.power = 6, .tbg = 29, .tdc = 2, .pac = 1,},
  65. {.power = 7, .tbg = 32, .tdc = 2, .pac = 1,},
  66. {.power = 8, .tbg = 35, .tdc = 2, .pac = 1,},
  67. {.power = 9, .tbg = 38, .tdc = 2, .pac = 1,},
  68. {.power = 10, .tbg = 41, .tdc = 2, .pac = 1,},
  69. {.power = 11, .tbg = 44, .tdc = 2, .pac = 1,},
  70. {.power = 12, .tbg = 47, .tdc = 2, .pac = 1,},
  71. {.power = 13, .tbg = 51, .tdc = 2, .pac = 1,},
  72. {.power = 14, .tbg = 54, .tdc = 2, .pac = 1,},
  73. {.power = 15, .tbg = 57, .tdc = 2, .pac = 1,},
  74. {.power = 16, .tbg = 59, .tdc = 2, .pac = 1,},
  75. {.power = 17, .tbg = 61, .tdc = 2, .pac = 1,},
  76. {.power = 18, .tbg = 62, .tdc = 2, .pac = 1,},
  77. {.power = 19, .tbg = 63, .tdc = 2, .pac = 1,},
  78. {.power = 20, .tbg = 63, .tdc = 2, .pac = 1,},
  79. };
  80. static void tim1_callback(uint8_t status, uint32_t param);
  81. uint8_t getRfPowerTabIndex(int8_t power);
  82. /**-------------------------radio params end----------------------------------**/
  83. void myRadio_delay(uint32_t time_ms)
  84. {
  85. uint32_t i, j;
  86. i = time_ms;
  87. while (i --)
  88. {
  89. for ( j = 0; j < 1000; j++)
  90. {
  91. ;
  92. }
  93. }
  94. }
  95. /**
  96. * @brief IO口中断回调
  97. * IO口产生中断后会执行该函数
  98. * 用于接收射频工作的中断响应
  99. *
  100. * @param index
  101. */
  102. void myRadio_gpioCallback(uint8_t index)
  103. {
  104. if (rf_handle != 0xe5)
  105. {
  106. return;
  107. }
  108. if ((rf_workProcess != RWP_TX) && (rf_workProcess != RWP_RX))
  109. {
  110. return;
  111. }
  112. rf_irq = true;
  113. }
  114. /**
  115. * @brief 射频初始化
  116. *
  117. * @param agr0
  118. * @param agr1_ptr 无线工作状态响应回调
  119. * 产生回调给外部使用,@rfRxCallBack
  120. */
  121. void myRadio_init(int agr0, void *agr1_ptr)
  122. {
  123. myRadio_gpio_init(myRadio_gpioCallback);
  124. /**-------------------------radio init----------------------------------**/
  125. A7169_SetConfig(A7169ConfigList[rfBaudrate]);
  126. A7169_POR();
  127. if(InitRF()) //init RF
  128. {
  129. // entry_deep_sleep_mode();
  130. // myRadio_delay(2);
  131. // wake_up_from_deep_sleep_mode();
  132. rf_workProcess = RWP_IDLE;
  133. }
  134. /**-------------------------radio init end----------------------------------**/
  135. RF_EXT_PA_TO_IDLE();
  136. if ((rfRxCallBack )agr1_ptr)
  137. {
  138. rxCb = (rfRxCallBack )agr1_ptr;
  139. }
  140. rf_handle = 0xe5;
  141. }
  142. /**
  143. * @brief 射频底层执行程序
  144. * 要放在主循环中执行
  145. *
  146. */
  147. void myRadio_process(void)
  148. {
  149. rfRxPacket_ts packet;
  150. if (rf_handle == 0)
  151. {
  152. return;
  153. }
  154. if (rf_irq == false)
  155. {
  156. return;
  157. }
  158. rf_irq = false;
  159. switch (rf_workProcess)
  160. {
  161. case RWP_TX:
  162. {//Tx done
  163. rxCb(TX_STA_SECCESS, packet);
  164. rf_workProcess = RWP_IDLE;
  165. }
  166. break;
  167. case RWP_RX:
  168. {//Rx done
  169. packet.rssi = 127;
  170. RxPacket_ReadFifo(packet.payload, packet.len);
  171. rxCb(RX_STA_SECCESS, packet);
  172. rf_workProcess = RWP_IDLE;
  173. }
  174. break;
  175. default:
  176. break;
  177. }
  178. }
  179. /**
  180. * @brief 退出射频进入休眠
  181. *
  182. */
  183. void myRadio_abort(void)
  184. {
  185. if (rf_handle == 0)
  186. {
  187. return;
  188. }
  189. rf_workProcess = RWP_IDLE;
  190. RF_EXT_PA_TO_IDLE();
  191. wake_up_from_deep_sleep_mode();
  192. }
  193. /**
  194. * @brief 获取射频工作中心频率
  195. *
  196. * @return uint32_t
  197. */
  198. uint32_t myRadio_getFrequency(void)
  199. {
  200. if (rf_handle == 0)
  201. {
  202. return 0;
  203. }
  204. return rfFrequence;
  205. }
  206. /**
  207. * @brief 设置射频工作中心频率
  208. *
  209. * @param freq
  210. * 具体频点,单位:Hz
  211. * 参考数据手册【13. Tranceiver Frequency】章节
  212. * 433频段:具体使用范围:410~456MHz
  213. */
  214. void myRadio_setFrequency(uint32_t freq)
  215. {
  216. if (rf_handle == 0)
  217. {
  218. return;
  219. }
  220. rfFrequence = freq;
  221. pll1_tu pll1_reg;
  222. double freqFloat;
  223. double integerPartFloat; //整数部分
  224. uint32_t integerPart; //整数部分
  225. double integerOffsetPart; //整数部分剩余的小数
  226. uint32_t freactionalPart; //小数部分
  227. freqFloat = (double)rfFrequence / 1000000;
  228. integerOffsetPart = freqFloat / 12.8;
  229. integerOffsetPart = modf (integerOffsetPart , &integerPartFloat);
  230. integerPart = (uint16_t)integerPartFloat;
  231. freactionalPart = (uint32_t)(integerOffsetPart * 65535);
  232. pll1_reg.value = A7169ConfigBuffer.config[PLL1_REG];
  233. pll1_reg.bits_w.ip = integerPart;
  234. A7169ConfigBuffer.config[PLL1_REG] = pll1_reg.value;
  235. A7169ConfigBuffer.config[PLL2_REG] = freactionalPart;
  236. A7169_WriteReg(PLL1_REG, pll1_reg.value);
  237. A7169_WriteReg(PLL2_REG, freactionalPart);
  238. }
  239. /**
  240. * @brief 获取发射功率
  241. *
  242. * @return int8_t
  243. */
  244. int8_t myRadio_getTxPower(void)
  245. {
  246. if (rf_handle == 0)
  247. {
  248. return 0;
  249. }
  250. return rfTxPower;
  251. }
  252. /**
  253. * @brief 设置发射功率
  254. * TBG[5:0]-> TX Buffer Gain setting.
  255. * TBG[5:3]:MISC_CFG2 (Address: 09h) Page21 的bit8 ~ bit10
  256. * TBG[2:0]:TX II (Address: 09h) Page 0 的bit0 ~ bit2
  257. * TDC-> TX Driver current setting.
  258. * TDC[1:0] TX II (Address: 09h) Page 0 的bit3 ~ bit4
  259. * PAC-> PA current setting.
  260. * PAC[1:0] TX II (Address: 09h) Page 0 的bit5 ~ bit6
  261. * @param power
  262. * 单位:dbm
  263. */
  264. void myRadio_setTxPower(int8_t power)
  265. {
  266. if (rf_handle == 0)
  267. {
  268. return;
  269. }
  270. rfTxPower = power;
  271. pageB_tx2_tu pageB_tx2;
  272. pageB_misc_cfg2_tu pageB_misc_cfg2;
  273. uint8_t tbg;
  274. pageB_tx2.value = A7169ConfigList[rfBaudrate].pageB[TX2_PAGEB];
  275. pageB_misc_cfg2.value = A7169ConfigList[rfBaudrate].pageB[Misc_CFG2_PAGEB];
  276. tbg = rfTxPowerList_433[getRfPowerTabIndex(power)].tbg;
  277. pageB_tx2.bits_w .tdc = rfTxPowerList_433[getRfPowerTabIndex(power)].tdc;
  278. pageB_tx2.bits_w .pac = rfTxPowerList_433[getRfPowerTabIndex(power)].pac;
  279. pageB_tx2.bits_w.tbg0_2 = tbg & 0x07;
  280. pageB_misc_cfg2.bits_w.tbg3_5 = (tbg>>3) & 0x07;
  281. A7169_WritePageB(TX2_PAGEB, pageB_tx2.value);
  282. A7169_WritePageB(Misc_CFG2_PAGEB, pageB_misc_cfg2.value);
  283. }
  284. /**
  285. * 获取射频波特率
  286. * @param : br->
  287. */
  288. uint32_t myRadio_getBaudrate(void)
  289. {
  290. if (rf_handle == 0)
  291. {
  292. return 0;
  293. }
  294. return rfBaudrate;
  295. }
  296. /**
  297. * 设置射频波特率
  298. * @param : br->
  299. */
  300. void myRadio_setBaudrate(uint32_t br)
  301. {
  302. rfBaudrate = br;
  303. }
  304. /**
  305. * @brief 设置模组型号
  306. *
  307. * @param type
  308. */
  309. void myRadio_setChipType(uint8_t type)
  310. {
  311. chipType = type;
  312. }
  313. /**
  314. * @brief 获取模组型号
  315. *
  316. * @return uint8_t
  317. */
  318. uint8_t myRadio_getChipType(void)
  319. {
  320. return chipType;
  321. }
  322. int16_t myRadio_getRssi(void)
  323. {
  324. return 0;
  325. }
  326. /**
  327. * @brief 无线发送数据包
  328. *
  329. * @param packet
  330. */
  331. void myRadio_transmit(rfTxPacket_ts *packet)
  332. {
  333. if (rf_handle == 0)
  334. {
  335. return;
  336. }
  337. RF_EXT_PA_TO_TX();
  338. if ((rf_workProcess == RWP_RX) || (rf_workProcess == RWP_SLEEP))
  339. {
  340. rf_workProcess = RWP_IDLE;
  341. StrobeCMD(CMD_STBY);
  342. }
  343. A7169_FifoWrite(packet->payload, packet->len); //write data to TX FIFO
  344. StrobeCMD(CMD_TX);
  345. rf_workProcess = RWP_TX;
  346. }
  347. /**
  348. * @brief 进入无线接收
  349. *
  350. */
  351. void myRadio_receiver(void)
  352. {
  353. if (rf_handle == 0)
  354. {
  355. return;
  356. }
  357. RF_EXT_PA_TO_RX();
  358. if ((rf_workProcess == RWP_TX) || (rf_workProcess == RWP_SLEEP))
  359. {
  360. rf_workProcess = RWP_IDLE;
  361. StrobeCMD(CMD_STBY);
  362. }
  363. A7169_WritePageA(FIFO_PAGEA,0x003F);//设置RX FIFO长度阀值为64个字节
  364. StrobeCMD(CMD_RFR);//清接收FIFO指针
  365. StrobeCMD(CMD_RX);
  366. rf_workProcess = RWP_RX;
  367. }
  368. void myRadio_setCtrl(controlMode_te mode, uint32_t value)
  369. {
  370. if (rf_handle == 0)
  371. {
  372. return;
  373. }
  374. myRadio_init(0, 0);
  375. switch (mode)
  376. {
  377. case RADIO_EXT_CONTROL_TX_UNMODULATED:
  378. {
  379. RF_EXT_PA_TO_TX();
  380. myRadio_setTxPower(rfTxPower);
  381. myRadio_setFrequency(rfFrequence);
  382. pageA_tx1_tu pageA_tx1;
  383. pageA_tx1.value = 0;
  384. A7169_WritePageA(TX1_PAGEA, pageA_tx1.value);
  385. StrobeCMD(CMD_TX);
  386. }
  387. break;
  388. case RADIO_EXT_CONTROL_TX_MODULATED:
  389. {
  390. RF_EXT_PA_TO_TX();
  391. myRadio_setTxPower(rfTxPower);
  392. myRadio_setFrequency(rfFrequence);
  393. A7169_WritePageA(CKO_PAGEA, 0xD28B); //CKO=RCK
  394. base_modeControl_tu base_modeControl;
  395. base_modeControl.value = 0xffff;
  396. base_modeControl.bits_w.fms = 0;
  397. A7169_WriteReg(MODE_REG, base_modeControl.value); //set FMS=0, Direct mode
  398. StrobeCMD(CMD_TX);
  399. myRadio_delay(10);
  400. pageA_gio_tu pageA_gio;
  401. pageA_gio.value = 0;
  402. pageA_gio.bits_w.g1oe = 1;
  403. pageA_gio.bits_w.gio1s = GIOMD_TRXD;
  404. A7169_WritePageA(GIO_PAGEA, pageA_gio.value); //GIO1=TRXD
  405. SET_A7169_GPIO1_OUT();
  406. //通过定时器控制GIO1的状态
  407. myIrqCallback_tim1.thisCb = tim1_callback;
  408. TIM1_callbackRegiste(&myIrqCallback_tim1);
  409. }
  410. break;
  411. case RADIO_EXT_CONTROL_RX_SENSITIVITY:
  412. {
  413. RF_EXT_PA_TO_RX();
  414. pageA_gio_tu pageA_gio;
  415. pageA_gio.value = 0;
  416. pageA_gio.bits_w.g1oe = 1;
  417. pageA_gio.bits_w.gio1s = GIOMD_EOAC_FSYNC;
  418. A7169_WritePageA(GIO_PAGEA, pageA_gio.value); //GIO1=TRXD
  419. A7169_WritePageA(CKO_PAGEA, 0xD28B); //CKO=RCK
  420. base_modeControl_tu base_modeControl;
  421. base_modeControl.value = 0;
  422. base_modeControl.bits_w.fms = 0;
  423. base_modeControl.bits_w.trsr = 0;
  424. base_modeControl.bits_w.cer = 1;
  425. base_modeControl.bits_w.cce = 1;
  426. A7169_WriteReg(MODE_REG, base_modeControl.value); //set FMS=0, Direct mode
  427. StrobeCMD(CMD_RX); //
  428. myRadio_delay(10);
  429. pageA_gio.value = 0;
  430. pageA_gio.bits_w.g1oe = 1;
  431. pageA_gio.bits_w.gio1s = GIOMD_RXD;
  432. A7169_WritePageA(GIO_PAGEA, pageA_gio.value); //GIO1=TRXD
  433. }
  434. break;
  435. default:
  436. break;
  437. }
  438. }
  439. /**-------------------------radio funtion----------------------------------**/
  440. static void tim1_callback(uint8_t status, uint32_t param)
  441. {
  442. if (rand()&0x01)
  443. {
  444. RF_A7169_GPIO1_H();
  445. }
  446. else
  447. {
  448. RF_A7169_GPIO1_L();
  449. }
  450. }
  451. uint8_t getRfPowerTabIndex(int8_t power)
  452. {
  453. for (int i = 0; i < sizeof(rfTxPowerList_433)/sizeof(rfTxPowerReg_ts); i++)
  454. {
  455. if (rfTxPowerList_433[i].power >= power)
  456. {
  457. return i;
  458. }
  459. }
  460. return sizeof(rfTxPowerList_433)/sizeof(rfTxPowerReg_ts) - 1;
  461. }
  462. /**-------------------------radio funtion end----------------------------------**/