RF.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. //===================================================================================//
  2. // * @file RF.c
  3. // * @author Shi Zheng
  4. // * @version V1.1
  5. // * @date Aug/12/2013
  6. // * @brief Main program body
  7. // * @modify user: liuhaibing
  8. // * @modify date: 2019/12/19
  9. //===================================================================================//
  10. #include "RF.H"
  11. #include "spi.h"
  12. uint8_t TX_ADDRESS_DEF[5] = {0xCC, 0xCC, 0xCC, 0xCC, 0xCC};
  13. uint8_t TxPayloadLength = PAYLOAD_WIDTH;
  14. const uint8_t AckPayloadLength = 0x00;
  15. uint32_t Payload_Count = 0;
  16. uint16_t tx_only_count = 0;
  17. uint16_t time_out_count = 0;
  18. static void delay_us(uint32_t delay_us)
  19. {
  20. uint32_t i = 0;
  21. uint32_t j = 0;
  22. for (i = 0; i < delay_us; i++)
  23. {
  24. for (j = 0; j < 10; j++)
  25. {
  26. ;
  27. }
  28. }
  29. }
  30. /******************************************************************************/
  31. // RF_WriteReg
  32. // Write Data(1 Byte Address ,1 byte data)
  33. /******************************************************************************/
  34. static void RF_WriteReg(uint8_t reg, uint8_t wdata)
  35. {
  36. RF_SPI_NSS_L();
  37. SpiWrite(reg);
  38. SpiWrite(wdata);
  39. RF_SPI_NSS_H();
  40. }
  41. /******************************************************************************/
  42. // RF_ReadReg
  43. // Read Data(1 Byte Address ,1 byte data return)
  44. /******************************************************************************/
  45. static uint8_t RF_ReadReg(uint8_t reg)
  46. {
  47. uint8_t tmp;
  48. RF_SPI_NSS_L();
  49. SpiWrite(reg);
  50. tmp = SpiRead();
  51. RF_SPI_NSS_H();
  52. return tmp;
  53. }
  54. /******************************************************************************/
  55. // RF_WriteBuf
  56. // Write Buffer
  57. /******************************************************************************/
  58. static void RF_WriteBuf(uint8_t reg, uint8_t *pBuf, uint8_t length)
  59. {
  60. uint8_t j;
  61. RF_SPI_NSS_L();
  62. j = 0;
  63. SpiWrite(reg);
  64. for (j = 0; j < length; j++)
  65. {
  66. SpiWrite(pBuf[j]);
  67. }
  68. j = 0;
  69. RF_SPI_NSS_H();
  70. }
  71. /******************************************************************************/
  72. // RF_ReadBuf
  73. // Read Data(1 Byte Address ,length byte data read)
  74. /******************************************************************************/
  75. void RF_ReadBuf(uint8_t reg, unsigned char *pBuf, uint8_t length)
  76. {
  77. uint8_t byte_ctr;
  78. RF_SPI_NSS_L();
  79. SpiWrite(reg);
  80. for (byte_ctr = 0; byte_ctr < length; byte_ctr++)
  81. pBuf[byte_ctr] = SpiRead();
  82. RF_SPI_NSS_H();
  83. }
  84. static void CE_HIGH()
  85. {
  86. RF_WriteReg(CE_FSPI_ON, 0);
  87. }
  88. static void CE_LOW()
  89. {
  90. RF_WriteReg(CE_FSPI_OFF, 0);
  91. }
  92. /******************************************************************************/
  93. // RF_TxMode
  94. // Set RF into TX mode
  95. /******************************************************************************/
  96. void RF_TxMode(void)
  97. {
  98. CE_LOW();
  99. // delay_us(10 * 1000);
  100. RF_WriteReg(W_REGISTER + CONFIG, 0X8E); // 将RF设置成TX模式
  101. // delay_us(10 * 1000);
  102. CE_HIGH();
  103. delay_us(10 * 1000);
  104. }
  105. /******************************************************************************/
  106. // RF_RxMode
  107. // 将RF设置成RX模式,准备接收数据
  108. /******************************************************************************/
  109. void RF_RxMode(void)
  110. {
  111. CE_LOW();
  112. // delay_us(10 * 1000);
  113. RF_WriteReg(W_REGISTER + CONFIG, 0X8F); // 将RF设置成RX模式
  114. // delay_us(10 * 1000);
  115. CE_HIGH();
  116. // delay_us(10 * 1000);
  117. }
  118. /******************************************************************************/
  119. // RF_GetStatus
  120. // read RF IRQ status,3bits return
  121. /******************************************************************************/
  122. uint8_t RF_GetStatus(void)
  123. {
  124. return RF_ReadReg(STATUS) & 0x70; // 读取RF的状态
  125. }
  126. /******************************************************************************/
  127. // RF_ClearStatus
  128. // clear RF IRQ
  129. /******************************************************************************/
  130. void RF_ClearStatus(void)
  131. {
  132. RF_WriteReg(W_REGISTER + STATUS, 0x70); // 清除RF的IRQ标志
  133. }
  134. /******************************************************************************/
  135. // RF_ClearFIFO
  136. // clear RF TX/RX FIFO
  137. /******************************************************************************/
  138. void RF_ClearFIFO(void)
  139. {
  140. RF_WriteReg(FLUSH_TX, 0); // 清除RF 的 TX FIFO
  141. RF_WriteReg(FLUSH_RX, 0); // 清除RF 的 RX FIFO
  142. }
  143. /******************************************************************************/
  144. // RF_SetChannel
  145. // Set RF TX/RX channel:Channel
  146. /******************************************************************************/
  147. void RF_SetChannel(uint8_t Channel)
  148. {
  149. RF_WriteReg(W_REGISTER + RF_CH, Channel);
  150. }
  151. /******************************************************************************/
  152. // 发送数据:
  153. // 参数:
  154. // 1. ucPayload:需要发送的数据首地址
  155. // 2. length: 需要发送的数据长度
  156. // Return:
  157. // 1. MAX_RT: TX Failure (Enhance mode)
  158. // 2. TX_DS: TX Successful (Enhance mode)
  159. // note: Only use in Tx Mode
  160. // length 通常等于 PAYLOAD_WIDTH
  161. /******************************************************************************/
  162. void RF_TxData(uint8_t *ucPayload, uint8_t length)
  163. {
  164. CE_HIGH(); // write data to txfifo ;1Mbps 可以延时1ms;250Kbps,延时2ms
  165. RF_WriteBuf(W_TX_PAYLOAD, ucPayload, length);
  166. // delay_us(30);
  167. CE_LOW(); // rf entery tx mode start send data //rf entery stb3
  168. // delay_us(1 * 1000);
  169. }
  170. /******************************************************************************/
  171. // ucRF_DumpRxData
  172. // 读出接收到的数据:
  173. // 参数:
  174. // 1. ucPayload:存储读取到的数据的Buffer
  175. // 2. length: 读取的数据长度
  176. // Return:
  177. // 1. 0: 没有接收到数据
  178. // 2. 1: 读取接收到的数据成功
  179. // note: Only use in Rx Mode
  180. // length 通常等于 PAYLOAD_WIDTH
  181. /******************************************************************************/
  182. uint8_t RF_DumpRxData(uint8_t *ucPayload, uint8_t length)
  183. {
  184. uint8_t status = RF_GetStatus();
  185. if (!(status & RX_DR_FLAG))
  186. {
  187. return 0;
  188. }
  189. RF_ReadBuf(R_RX_PAYLOAD, ucPayload, length); // 将接收到的数据读出到ucPayload
  190. return 1;
  191. }
  192. /******************************************************************************/
  193. // 发送结果
  194. // 参数:只在增强模式下,使能ack带Payload有效
  195. // 1、ucAckPayload: AckPayload的首地址
  196. // 2、length:AckPayload的长度
  197. /******************************************************************************/
  198. void RF_TX_CheckResult(uint8_t *ucAckPayload, uint8_t length)
  199. {
  200. switch (RF_GetStatus())
  201. {
  202. case TX_DS_FLAG:
  203. tx_only_count++;
  204. RF_ClearFIFO();
  205. RF_ClearStatus();
  206. break;
  207. case RX_TX_FLAG:
  208. RF_ReadBuf(R_RX_PAYLOAD, ucAckPayload, length);
  209. ++Payload_Count;
  210. RF_ClearFIFO();
  211. RF_ClearStatus();
  212. break;
  213. case MAX_RT_FLAG:
  214. time_out_count++;
  215. RF_ClearFIFO();
  216. RF_ClearStatus();
  217. break;
  218. default:
  219. break;
  220. }
  221. }
  222. ////////////////////////////////////////////////////////////////////////////////
  223. // 以下部分与RF通信相关,不建议修改
  224. ////////////////////////////////////////////////////////////////////////////////
  225. /******************************************************************************/
  226. // XN297L_Initial
  227. // Initial RF
  228. /******************************************************************************/
  229. void RF_Init(void)
  230. {
  231. #if (DATA_RATE == DR_1M || DATA_RATE == DR_2M)
  232. uint8_t BB_cal_data[] = {0x0A, 0x6D, 0x67, 0x9C, 0x46};
  233. uint8_t RF_cal_data[] = {0xF6, 0x37, 0x5D};
  234. uint8_t RF_cal2_data[] = {0x45, 0x21, 0xef, 0x2C, 0x5A, 0x42};
  235. uint8_t Dem_cal_data[] = {0x01};
  236. uint8_t Dem_cal2_data[] = {0x0b, 0xDF, 0x02};
  237. #elif (DATA_RATE == DR_250K)
  238. uint8_t BB_cal_data[] = {0x12, 0xec, 0x6f, 0xa1, 0x46};
  239. uint8_t RF_cal_data[] = {0xf6, 0x37, 0x5d};
  240. uint8_t RF_cal2_data[] = {0x45, 0x21, 0xeb, 0x2c, 0x5a, 0x42};
  241. uint8_t Dem_cal_data[] = {0x1F};
  242. uint8_t Dem_cal2_data[] = {0x0b, 0xdf, 0x02};
  243. #endif
  244. #if (CE_MODE == CE_MODE_HARD)
  245. uint8_t feature = 0x00;
  246. #elif (CE_MODE == CE_MODE_SOFT)
  247. uint8_t feature = 0x20;
  248. #endif
  249. RF_WriteReg(RST_FSPI, 0x5A); // Software Reset
  250. RF_WriteReg(RST_FSPI, 0XA5);
  251. RF_WriteReg(FLUSH_TX, 0); // CLEAR TXFIFO
  252. RF_WriteReg(FLUSH_RX, 0); // CLEAR RXFIFO
  253. RF_WriteReg(W_REGISTER + STATUS, 0x70); // CLEAR STATUS
  254. RF_WriteReg(W_REGISTER + EN_RXADDR, 0x01); // Enable Pipe0
  255. RF_WriteReg(W_REGISTER + SETUP_AW, 0x03); // address witdth is 5 bytes
  256. RF_WriteReg(W_REGISTER + RF_CH, DEFAULT_CHANNEL); // 2478M HZ
  257. RF_WriteReg(W_REGISTER + RX_PW_P0, PAYLOAD_WIDTH); // 8 bytes
  258. RF_WriteBuf(W_REGISTER + TX_ADDR, TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF)); // Writes TX_Address to XN297L
  259. RF_WriteBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF)); // RX_Addr0 same as TX_Adr for Auto.Ack
  260. RF_WriteBuf(W_REGISTER + BB_CAL, BB_cal_data, sizeof(BB_cal_data));
  261. RF_WriteBuf(W_REGISTER + RF_CAL2, RF_cal2_data, sizeof(RF_cal2_data));
  262. RF_WriteBuf(W_REGISTER + DEM_CAL, Dem_cal_data, sizeof(Dem_cal_data));
  263. RF_WriteBuf(W_REGISTER + RF_CAL, RF_cal_data, sizeof(RF_cal_data));
  264. RF_WriteBuf(W_REGISTER + DEM_CAL2, Dem_cal2_data, sizeof(Dem_cal2_data));
  265. RF_WriteReg(W_REGISTER + DYNPD, 0x00);
  266. RF_WriteReg(W_REGISTER + RF_SETUP, RF_POWER); // 8dbm 1Mbps
  267. RF_WriteReg(ACTIVATE, 0x73);
  268. #if (TRANSMIT_TYPE == TRANS_ENHANCE_MODE)
  269. RF_WriteReg(W_REGISTER + SETUP_RETR, 0x01); // 1 retrans...
  270. RF_WriteReg(W_REGISTER + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
  271. #elif (TRANSMIT_TYPE == TRANS_BURST_MODE)
  272. RF_WriteReg(W_REGISTER + SETUP_RETR, 0x00); // Disable retrans...
  273. RF_WriteReg(W_REGISTER + EN_AA, 0x00); // Disable AutoAck
  274. #endif
  275. #if (EN_DYNPLOAD == 1)
  276. feature |= 0x04;
  277. RF_WriteReg(W_REGISTER + DYNPD, 0x01); // 动态使能pipe0动态长度
  278. #endif
  279. #if (EN_ACK_PAYLOAD == 1)
  280. feature |= 0x02;
  281. #endif
  282. if (PAYLOAD_WIDTH > 32)
  283. feature |= 0x18;
  284. RF_WriteReg(W_REGISTER + FEATURE, feature);
  285. }
  286. void RF_Reset(void)
  287. {
  288. RF_WriteReg(W_REGISTER + CONFIG, 0);
  289. }
  290. /******************************************************************************/
  291. // 进入载波模式
  292. /******************************************************************************/
  293. void RF_Carrier(uint8_t ucChannel_Set)
  294. {
  295. uint8_t BB_cal_data[] = {0x0A, 0x6D, 0x67, 0x9C, 0x46};
  296. uint8_t RF_cal_data[] = {0xF6, 0x37, 0x5D};
  297. uint8_t RF_cal2_data[] = {0x45, 0x21, 0xEF, 0xAC, 0x5a, 0x50};
  298. uint8_t Dem_cal_data[] = {0xE1};
  299. uint8_t Dem_cal2_data[] = {0x0B, 0xDF, 0x02};
  300. #if (CE_MODE == CE_MODE_HARD)
  301. uint8_t feature = 0x00;
  302. #elif (CE_MODE == CE_MODE_SOFT)
  303. uint8_t feature = 0x20;
  304. #endif
  305. RF_WriteReg(RST_FSPI, 0x5A); // Software Reset
  306. RF_WriteReg(RST_FSPI, 0XA5);
  307. RF_WriteReg(W_REGISTER + FEATURE, feature);
  308. CE_LOW();
  309. delay_us(500); // delay 500us
  310. RF_WriteReg(W_REGISTER + CONFIG, 0X8E); // tx mode
  311. RF_WriteReg(W_REGISTER + RF_CH, ucChannel_Set); // 单载波频点
  312. RF_WriteReg(W_REGISTER + RF_SETUP, RF_POWER); // 13dbm
  313. RF_WriteBuf(W_REGISTER + BB_CAL, BB_cal_data, sizeof(BB_cal_data));
  314. RF_WriteBuf(W_REGISTER + RF_CAL2, RF_cal2_data, sizeof(RF_cal2_data));
  315. RF_WriteBuf(W_REGISTER + DEM_CAL, Dem_cal_data, sizeof(Dem_cal_data));
  316. RF_WriteBuf(W_REGISTER + RF_CAL, RF_cal_data, sizeof(RF_cal_data));
  317. RF_WriteBuf(W_REGISTER + DEM_CAL2, Dem_cal2_data, sizeof(Dem_cal2_data));
  318. delay_us(500);
  319. }
  320. /***************************************end of file ************************************/