RF.c 13 KB

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