myRadio.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #include "board.h"
  2. #include "myRadio.h"
  3. #include "myRadio_gpio.h"
  4. /**-------------------------radio include----------------------------------**/
  5. #include "RF.h"
  6. #include "rf_setting.h"
  7. /**-------------------------radio include end----------------------------------**/
  8. static int8_t rfTxPower;
  9. static uint32_t rfFrequence;
  10. static uint32_t rfBaudrate;
  11. static rfRxCallBack rxCb;
  12. static uint8_t rfRxBuffer[255];
  13. static uint32_t rf_handle;
  14. static uint8_t rf_workProcess;
  15. static uint8_t chipType;
  16. /**-------------------------radio params----------------------------------**/
  17. static bool rf_irq;
  18. /**-------------------------radio params end----------------------------------**/
  19. void myRadio_delay(uint32_t time_ms)
  20. {
  21. uint32_t i, j;
  22. i = time_ms;
  23. while (i --)
  24. {
  25. for ( j = 0; j < 14000; j++)
  26. {
  27. ;
  28. }
  29. }
  30. }
  31. /**
  32. * @brief IO口中断回调
  33. * IO口产生中断后会执行该函数
  34. * 用于接收射频工作的中断响应
  35. *
  36. * @param index
  37. */
  38. void myRadio_gpioCallback(uint8_t index)
  39. {
  40. rf_irq = true;
  41. }
  42. /**
  43. * @brief 射频初始化
  44. *
  45. * @param agr0
  46. * @param agr1_ptr 无线工作状态响应回调
  47. * 产生回调给外部使用,@rfRxCallBack
  48. */
  49. void myRadio_init(int agr0, void *agr1_ptr)
  50. {
  51. myRadio_gpio_init(myRadio_gpioCallback);
  52. /**-------------------------radio init----------------------------------**/
  53. RF_Init(rfBaudrate, chipType);
  54. //读取版本号,可用于测试spi是否正常
  55. uint16_t reversion = 0;
  56. RF_ReadBuf(REV, (uint8_t *)&reversion, 2);
  57. if (reversion != 0X503C)
  58. {
  59. while(1);
  60. }
  61. /**-------------------------radio init end----------------------------------**/
  62. RF_EXT_PA_TO_IDLE();
  63. if ((rfRxCallBack )agr1_ptr)
  64. {
  65. rxCb = (rfRxCallBack )agr1_ptr;
  66. }
  67. rf_handle = 0xe5;
  68. }
  69. /**
  70. * @brief 射频底层执行程序
  71. * 要放在主循环中执行
  72. *
  73. */
  74. void myRadio_process(void)
  75. {
  76. uint8_t bMain_IT_Status;
  77. rfRxPacket_ts rfRxPacket;
  78. status_tu status;
  79. if (rf_handle == 0)
  80. {
  81. return;
  82. }
  83. if (rf_irq == false)
  84. {
  85. return;
  86. }
  87. rf_irq = false;
  88. if ((rf_workProcess != 1) && (rf_workProcess != 2))
  89. {
  90. return;
  91. }
  92. rf_workProcess = 0;
  93. status.value = RF_GetStatus();
  94. if (status.bits.RX_DR)
  95. {
  96. status.bits.RX_DR = 0;
  97. rfRxPacket.len = 12;
  98. RF_ReadBuf(R_RX_PAYLOAD, rfRxPacket.payload, rfRxPacket.len);
  99. rfRxPacket.rssi = 127;
  100. RF_ClearFIFO();
  101. RF_ClearStatus ();
  102. rxCb(RX_STA_SECCESS, rfRxPacket);
  103. }
  104. //发送成功中断
  105. //或者发送后收到ACK中断
  106. if (status.bits.TX_DS)
  107. {
  108. status.bits.TX_DS = 0;
  109. RF_ClearFIFO();
  110. RF_ClearStatus ();
  111. rxCb(TX_STA_SECCESS, rfRxPacket);
  112. }
  113. //发送fifo溢出中断
  114. if (status.bits.TX_FULL)
  115. {
  116. }
  117. //发送重传次数完成中断
  118. if (status.bits.MAX_RT)
  119. {
  120. }
  121. //可以读取pipe 号中断
  122. if (status.bits.RX_P_NO <= 0x05)
  123. {
  124. }
  125. //RX fifo为空中断
  126. if (status.bits.RX_P_NO == 0x07)
  127. {
  128. }
  129. if (status.value)
  130. {
  131. RF_ClearFIFO();
  132. RF_ClearStatus ();
  133. }
  134. }
  135. /**
  136. * @brief 退出射频进入休眠
  137. *
  138. */
  139. void myRadio_abort(void)
  140. {
  141. if (rf_handle == 0)
  142. {
  143. return;
  144. }
  145. RF_EXT_PA_TO_IDLE();
  146. rf_workProcess = 0;
  147. if (rf_workProcess == 0xa5)
  148. {
  149. RF_Init(rfBaudrate, chipType);
  150. }
  151. RF_powerDown();
  152. }
  153. /**
  154. * @brief 获取射频工作中心频率
  155. *
  156. * @return uint32_t
  157. */
  158. uint32_t myRadio_getFrequency(void)
  159. {
  160. if (rf_handle == 0)
  161. {
  162. return 0;
  163. }
  164. return rfFrequence;
  165. }
  166. /**
  167. * @brief 设置射频工作中心频率
  168. *
  169. * @param freq
  170. * 具体频点,单位:Hz
  171. */
  172. void myRadio_setFrequency(uint32_t freq)
  173. {
  174. rfFrequence = freq;
  175. RF_setFreq(rfFrequence / 1000000);
  176. RF_CalVco(Dem_cal1_data);
  177. }
  178. /**
  179. * @brief 获取发射功率
  180. *
  181. * @return int8_t
  182. */
  183. int8_t myRadio_getTxPower(void)
  184. {
  185. return rfTxPower;
  186. }
  187. /**
  188. * @brief 设置发射功率
  189. *
  190. * @param power
  191. * 单位:dbm
  192. */
  193. void myRadio_setTxPower(int8_t power)
  194. {
  195. rfTxPower = power;
  196. RF_SetPower(RF_cal1_data, rfTxPower);
  197. }
  198. /**
  199. * 获取射频波特率
  200. * @param : br->
  201. */
  202. uint32_t myRadio_getBaudrate(void)
  203. {
  204. if (rf_handle == 0)
  205. {
  206. return 0;
  207. }
  208. return rfBaudrate;
  209. }
  210. /**
  211. * 设置射频波特率
  212. * @param : br->
  213. */
  214. void myRadio_setBaudrate(uint32_t br)
  215. {
  216. rfBaudrate = br;
  217. }
  218. /**
  219. * @brief 设置模组型号
  220. *
  221. * @param type
  222. */
  223. void myRadio_setChipType(uint8_t type)
  224. {
  225. chipType = type;
  226. }
  227. /**
  228. * @brief 获取模组型号
  229. *
  230. * @return uint8_t
  231. */
  232. uint8_t myRadio_getChipType(void)
  233. {
  234. return chipType;
  235. }
  236. int16_t myRadio_getRssi(void)
  237. {
  238. return 0;
  239. }
  240. /**
  241. * @brief 无线发送数据包
  242. *
  243. * @param packet
  244. */
  245. void myRadio_transmit(rfTxPacket_ts *packet)
  246. {
  247. if (rf_handle == 0)
  248. {
  249. return;
  250. }
  251. RF_EXT_PA_TO_TX();
  252. if (rf_workProcess != 1)
  253. {
  254. rf_workProcess = 1;
  255. RF_TxMode();
  256. }
  257. rf_workProcess = 1;
  258. RF_Tx_TransmintData(packet->payload, PAYLOAD_WIDTH);
  259. }
  260. /**
  261. * @brief 进入无线接收
  262. *
  263. */
  264. void myRadio_receiver(void)
  265. {
  266. if (rf_handle == 0)
  267. {
  268. return;
  269. }
  270. RF_EXT_PA_TO_RX();
  271. rf_workProcess = 2;
  272. RF_RxMode();
  273. }
  274. void myRadio_setCtrl(controlMode_te mode, uint32_t value)
  275. {
  276. if (rf_handle == 0)
  277. {
  278. return;
  279. }
  280. myRadio_init(0, 0);
  281. switch (mode)
  282. {
  283. case RADIO_EXT_CONTROL_TX_UNMODULATED:
  284. case RADIO_EXT_CONTROL_TX_MODULATED:
  285. {
  286. rf_workProcess = 0xa5;
  287. RF_EXT_PA_TO_TX();
  288. myRadio_setTxPower(rfTxPower);
  289. RF_Carrier();
  290. // RF_setFreq(rfFrequence / 1000000);
  291. myRadio_delay(100);
  292. myRadio_setFrequency(rfFrequence);
  293. }
  294. break;
  295. case RADIO_EXT_CONTROL_RX_SENSITIVITY:
  296. {
  297. RF_EXT_PA_TO_RX();
  298. RF_setFreq(rfFrequence / 1000000);
  299. myRadio_receiver();
  300. }
  301. break;
  302. default:
  303. break;
  304. }
  305. }
  306. /**-------------------------radio funtion----------------------------------**/
  307. /**-------------------------radio funtion end----------------------------------**/