RF.c 12 KB

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