myRadio.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include "board.h"
  2. #include "myRadio.h"
  3. #include "myRadio_gpio.h"
  4. /**-------------------------radio include----------------------------------**/
  5. #include "CC1101.h"
  6. /**-------------------------radio include end----------------------------------**/
  7. static int8_t rfTxPower;
  8. static uint32_t rfFrequence;
  9. static uint32_t rfBaudrate;
  10. static rfRxCallBack rxCb;
  11. static uint8_t rfRxBuffer[255];
  12. static uint32_t rf_handle;
  13. static uint8_t rf_workProcess;
  14. static uint8_t chipType;
  15. volatile bool rf_irq;
  16. /**-------------------------radio params----------------------------------**/
  17. /**-------------------------radio params end----------------------------------**/
  18. void myRadio_delay(uint32_t time_ms)
  19. {
  20. uint32_t i, j;
  21. i = time_ms;
  22. while (i --)
  23. {
  24. for ( j = 0; j < 1000; j++)
  25. {
  26. ;
  27. }
  28. }
  29. }
  30. /**
  31. * @brief IO口中断回调
  32. * IO口产生中断后会执行该函数
  33. * 用于接收射频工作的中断响应
  34. *
  35. * @param index
  36. */
  37. void myRadio_gpioCallback(uint8_t index)
  38. {
  39. rf_irq = true;
  40. }
  41. /**
  42. * @brief 射频初始化
  43. *
  44. * @param agr0
  45. * @param agr1_ptr 无线工作状态响应回调
  46. * 产生回调给外部使用,@rfRxCallBack
  47. */
  48. void myRadio_init(int agr0, void *agr1_ptr)
  49. {
  50. myRadio_gpio_init(myRadio_gpioCallback);
  51. /**-------------------------radio init----------------------------------**/
  52. RfSetup(); // cc1101 配置初始化
  53. Strobe(CCxx0x_SRX);
  54. /**-------------------------radio init end----------------------------------**/
  55. if ((rfRxCallBack )agr1_ptr)
  56. {
  57. rxCb = (rfRxCallBack )agr1_ptr;
  58. }
  59. rf_handle = 0xe5;
  60. }
  61. /**
  62. * @brief 射频底层执行程序
  63. * 要放在主循环中执行
  64. *
  65. */
  66. void myRadio_process(void)
  67. {
  68. rfRxPacket_ts rfRxPacket;
  69. if (rf_handle == 0)
  70. {
  71. return;
  72. }
  73. if (rf_irq == false)
  74. {
  75. return;
  76. }
  77. rf_irq = false;
  78. switch (rf_workProcess)
  79. {
  80. case RF_WKST_RX:
  81. {
  82. if (ReceivePacket(rfRxPacket.payload, 32))
  83. {
  84. }
  85. Strobe(CCxx0x_SRX);
  86. rf_workProcess = RF_WKST_IDLE;
  87. rfRxPacket.len = 32;
  88. rxCb(RX_STA_SECCESS, rfRxPacket);
  89. }
  90. break;
  91. case RF_WKST_TX:
  92. {
  93. rf_workProcess = RF_WKST_IDLE;
  94. rxCb(TX_STA_SECCESS, rfRxPacket);
  95. }
  96. break;
  97. default:
  98. break;
  99. }
  100. }
  101. /**
  102. * @brief 退出射频进入休眠
  103. * 注意:@README.md的开发注意事项
  104. */
  105. void myRadio_abort(void)
  106. {
  107. if (rf_handle == 0)
  108. {
  109. return;
  110. }
  111. rf_workProcess = RF_WKST_IDLE;
  112. Strobe(CCxx0x_SIDLE);
  113. }
  114. /**
  115. * @brief 获取射频工作中心频率
  116. *
  117. * @return uint32_t
  118. */
  119. uint32_t myRadio_getFrequency(void)
  120. {
  121. if (rf_handle == 0)
  122. {
  123. return 0;
  124. }
  125. return rfFrequence;
  126. }
  127. /**
  128. * @brief 设置射频工作中心频率
  129. *
  130. * @param freq
  131. * 具体频点,单位:Hz
  132. */
  133. void myRadio_setFrequency(uint32_t freq)
  134. {
  135. if (rf_handle == 0)
  136. {
  137. return;
  138. }
  139. rfFrequence = freq;
  140. WriteReg(CCxx0x_CHANNR, rfFrequence); //
  141. }
  142. /**
  143. * @brief 获取发射功率
  144. *
  145. * @return int8_t
  146. */
  147. int8_t myRadio_getTxPower(void)
  148. {
  149. if (rf_handle == 0)
  150. {
  151. return 0;
  152. }
  153. return rfTxPower;
  154. }
  155. /**
  156. * @brief 设置发射功率
  157. *
  158. * @param power
  159. * 单位:dbm
  160. */
  161. void myRadio_setTxPower(int8_t power)
  162. {
  163. if (rf_handle == 0)
  164. {
  165. return;
  166. }
  167. rfTxPower = power;
  168. }
  169. /**
  170. * 获取射频波特率
  171. * @param : br->
  172. */
  173. uint32_t myRadio_getBaudrate(void)
  174. {
  175. if (rf_handle == 0)
  176. {
  177. return 0;
  178. }
  179. return rfBaudrate;
  180. }
  181. /**
  182. * 设置射频波特率
  183. * @param : br->
  184. */
  185. void myRadio_setBaudrate(uint32_t br)
  186. {
  187. if (rf_handle == 0)
  188. {
  189. return;
  190. }
  191. rfBaudrate = br;
  192. }
  193. /**
  194. * @brief 设置模组型号
  195. *
  196. * @param type
  197. */
  198. void myRadio_setChipType(uint8_t type)
  199. {
  200. chipType = type;
  201. }
  202. /**
  203. * @brief 获取模组型号
  204. *
  205. * @return uint8_t
  206. */
  207. uint8_t myRadio_getChipType(void)
  208. {
  209. return chipType;
  210. }
  211. int16_t myRadio_getRssi(void)
  212. {
  213. return 0;
  214. }
  215. /**
  216. * @brief 无线发送数据包
  217. *
  218. * @param packet
  219. */
  220. void myRadio_transmit(rfTxPacket_ts *packet)
  221. {
  222. if (rf_handle == 0)
  223. {
  224. return;
  225. }
  226. rf_workProcess = RF_WKST_TX;
  227. SendPacket(packet->payload, packet->len);
  228. }
  229. /**
  230. * @brief 进入无线接收
  231. *
  232. */
  233. void myRadio_receiver(void)
  234. {
  235. if (rf_handle == 0)
  236. {
  237. return;
  238. }
  239. rf_workProcess = RF_WKST_RX;
  240. Strobe(CCxx0x_SIDLE);
  241. Strobe(CCxx0x_SFRX);
  242. Strobe(CCxx0x_SRX);
  243. }
  244. void myRadio_setCtrl(controlMode_te mode, uint32_t value)
  245. {
  246. if (rf_handle == 0)
  247. {
  248. return;
  249. }
  250. myRadio_init(0, 0);
  251. myRadio_setFrequency(rfFrequence);
  252. switch (mode)
  253. {
  254. case RADIO_EXT_CONTROL_TX_UNMODULATED:
  255. {
  256. rf_workProcess = RF_WKST_TEST_TX;
  257. WriteReg(CCxx0x_MDMCFG2, 0x33); //0x30进入OOK模式
  258. Strobe(CCxx0x_SIDLE);
  259. Strobe(CCxx0x_SFTX);
  260. Strobe(CCxx0x_STX);
  261. }
  262. break;
  263. case RADIO_EXT_CONTROL_TX_MODULATED:
  264. {
  265. }
  266. break;
  267. case RADIO_EXT_CONTROL_RX_SENSITIVITY:
  268. {
  269. rf_workProcess = RF_WKST_TEST_RX;
  270. WriteReg(CCxx0x_PKTCTRL0, 0x35); //0x35,异步串行模式,GDO0 上的数据输入和任一 GDOx 引脚上的数据输出
  271. WriteReg(CCxx0x_IOCFG0, 0x0d); //0x0d,串行数据输出。用于异步串行模式。
  272. Strobe(CCxx0x_SRX);
  273. }
  274. break;
  275. default:
  276. break;
  277. }
  278. }
  279. /**-------------------------radio funtion----------------------------------**/
  280. /**-------------------------radio funtion end----------------------------------**/