RF24.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. /*
  2. * nrf24l01.h
  3. *
  4. * Created on: 1 авг. 2019 г.
  5. * Author: dima
  6. */
  7. #ifndef NRF24L01_H_
  8. #define NRF24L01_H_
  9. //#include "main.h"
  10. #include "string.h"
  11. #include "stdio.h"
  12. #include "stdbool.h"
  13. #include "../spi/ad0x0_spi.h"
  14. #include "../mpu6050/mpu6050.h"
  15. #include "../gps/gps.h"
  16. #define rf24_max(a,b) (a>b?a:b)
  17. #define rf24_min(a,b) (a<b?a:b)
  18. /* Memory Map */
  19. #define NRF_CONFIG 0x00
  20. #define EN_AA 0x01
  21. #define EN_RXADDR 0x02
  22. #define SETUP_AW 0x03
  23. #define SETUP_RETR 0x04
  24. #define RF_CH 0x05
  25. #define RF_SETUP 0x06
  26. #define NRF_STATUS 0x07
  27. #define OBSERVE_TX 0x08
  28. #define CD 0x09
  29. //ad0x0
  30. #define NRF_RPD 0x09
  31. #define RX_ADDR_P0 0x0A
  32. #define RX_ADDR_P1 0x0B
  33. #define RX_ADDR_P2 0x0C
  34. #define RX_ADDR_P3 0x0D
  35. #define RX_ADDR_P4 0x0E
  36. #define RX_ADDR_P5 0x0F
  37. #define TX_ADDR 0x10
  38. #define RX_PW_P0 0x11
  39. #define RX_PW_P1 0x12
  40. #define RX_PW_P2 0x13
  41. #define RX_PW_P3 0x14
  42. #define RX_PW_P4 0x15
  43. #define RX_PW_P5 0x16
  44. #define FIFO_STATUS 0x17
  45. #define DYNPD 0x1C
  46. #define FEATURE 0x1D
  47. /* Bit Mnemonics */
  48. #define MASK_RX_DR 6
  49. #define MASK_TX_DS 5
  50. #define MASK_MAX_RT 4
  51. #define EN_CRC 3
  52. #define CRCO 2
  53. #define PWR_UP 1
  54. #define PRIM_RX 0
  55. #define ENAA_P5 5
  56. #define ENAA_P4 4
  57. #define ENAA_P3 3
  58. #define ENAA_P2 2
  59. #define ENAA_P1 1
  60. #define ENAA_P0 0
  61. #define ERX_P5 5
  62. #define ERX_P4 4
  63. #define ERX_P3 3
  64. #define ERX_P2 2
  65. #define ERX_P1 1
  66. #define ERX_P0 0
  67. #define AW 0
  68. #define ARD 4
  69. #define ARC 0
  70. #define PLL_LOCK 4
  71. #define RF_DR 3
  72. #define RF_PWR 6
  73. #define RX_DR 6
  74. #define TX_DS 5
  75. #define MAX_RT 4
  76. #define RX_P_NO 1
  77. #define TX_FULL 0
  78. #define PLOS_CNT 4
  79. #define ARC_CNT 0
  80. #define TX_REUSE 6
  81. #define FIFO_FULL 5
  82. #define TX_EMPTY 4
  83. #define RX_FULL 1
  84. #define RX_EMPTY 0
  85. #define DPL_P5 5
  86. #define DPL_P4 4
  87. #define DPL_P3 3
  88. #define DPL_P2 2
  89. #define DPL_P1 1
  90. #define DPL_P0 0
  91. #define EN_DPL 2
  92. #define EN_ACK_PAY 1
  93. #define EN_DYN_ACK 0
  94. /* Instruction Mnemonics */
  95. #define R_REGISTER 0x00
  96. #define W_REGISTER 0x20
  97. #define REGISTER_MASK 0x1F
  98. #define ACTIVATE 0x50
  99. #define R_RX_PL_WID 0x60
  100. #define R_RX_PAYLOAD 0x61
  101. #define W_TX_PAYLOAD 0xA0
  102. #define W_ACK_PAYLOAD 0xA8
  103. #define FLUSH_TX 0xE1
  104. #define FLUSH_RX 0xE2
  105. #define REUSE_TX_PL 0xE3
  106. #define NOP 0xFF
  107. /* Non-P omissions */
  108. #define LNA_HCURR 0
  109. /* P model memory Map */
  110. #define RPD 0x09
  111. #define W_TX_PAYLOAD_NO_ACK 0xB0
  112. /* P model bit Mnemonics */
  113. #define RF_DR_LOW 5
  114. #define RF_DR_HIGH 3
  115. #define RF_PWR_LOW 1
  116. #define RF_PWR_HIGH 2
  117. ///////////////////////////////////////////////////////////////////////////////
  118. typedef enum
  119. {
  120. RF24_PA_MIN = 0,
  121. RF24_PA_LOW,
  122. RF24_PA_HIGH,
  123. RF24_PA_MAX,
  124. RF24_PA_ERROR
  125. } rf24_pa_dbm_e;
  126. typedef enum
  127. {
  128. RF24_1MBPS = 0,
  129. RF24_2MBPS,
  130. RF24_250KBPS
  131. } rf24_datarate_e;
  132. typedef enum
  133. {
  134. RF24_CRC_DISABLED = 0,
  135. RF24_CRC_8,
  136. RF24_CRC_16
  137. } rf24_crclength_e;
  138. /*устройств rf24 планируется >1 и тут западло:
  139. я блин херею как меня бесит этот сраный си
  140. я долго думал как не делать тупые названия ф-й типа write_register_SPI2
  141. и придумал засунуть указатели ф-й SPI в регистры О_о*/
  142. /*typedef struct{
  143. void (*ad0x0_spi_push)(ADQS_t _ctype,uint8_t _cbyte);
  144. uint8_t (*ad0x0_spi_get_ext_async2)(uint8_t *_p_out_handle,void **_p_out_spi_ext_t);
  145. void (*ad0x0_spi_push_ext_setfunc)(uint8_t _sf_id,void (*_p_cb_func)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t));
  146. void (*ad0x0_spi_push_txrx_dma_ext)(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count);
  147. void (*ad0x0_spi_push_tx_pbuf_ext)(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count);
  148. void (*ad0x0_spi_push_tx_pbuf_dma_ext)(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count);
  149. }rf24_spi_desc_t, *p_rf24_spi_desc_t;*/
  150. struct rf24_spi_regs_t;
  151. //typedef
  152. __packed struct rf24_spi_REG_s{
  153. __packed struct rf24_spi_regs_s *pspi;//ссылка на весь сраный массив с регистрами
  154. uint8_t
  155. radr,//адрес регистра RF24 SPI
  156. so,//sizeof
  157. //wr,//0x0 для чтения 0x20 для записи
  158. value;
  159. };
  160. typedef __packed struct rf24_spi_REG_s rf24_spi_REG_t,*p_rf24_spi_REG_t;
  161. typedef __packed struct{
  162. __packed struct rf24_spi_regs_s *pspi;//уже слышу про память, сравнения с x86 и пр.херню
  163. uint8_t
  164. radr,//адрес регистра RF24 SPI
  165. so,//sizeof
  166. value[5];//0x00
  167. }rf24_spi_REG5_t,*p_rf24_spi_REG5_t;
  168. //я знаю, что то что ниже - момент спорный. Не надо тока орать сразу про растрату памяти и тупость.
  169. __packed struct rf24_spi_regs_s{
  170. rf24_spi_REG_t
  171. _CONFIG,
  172. _EN_AA,
  173. _EN_RXADDR,
  174. _SETUP_AW,
  175. _SETUP_RETR,
  176. _RF_CH,
  177. _RF_SETUP,
  178. _STATUS,//0x7
  179. _OBSERVE_TX,
  180. _RPD;//0x09
  181. rf24_spi_REG5_t
  182. _RX_ADDR_P0,//0xA
  183. _RX_ADDR_P1;
  184. rf24_spi_REG_t
  185. _RX_ADDR_P2,
  186. _RX_ADDR_P3,//0xD
  187. _RX_ADDR_P4,
  188. _RX_ADDR_P5;
  189. rf24_spi_REG5_t
  190. _TX_ADDR;//0x10
  191. rf24_spi_REG_t
  192. _RX_PW_P0,
  193. _RX_PW_P1,
  194. _RX_PW_P2,//0x13
  195. _RX_PW_P3,
  196. _RX_PW_P4,
  197. _RX_PW_P5,
  198. _FIFO_STATUS,//0x17
  199. _DYNPD, //0x1C
  200. _FEATURE,//0x1D
  201. _R_RX_PL_WID,//cmd
  202. _NOP;
  203. GPIO_TypeDef *CE_GPIO_Port;
  204. uint16_t CE_Pin;
  205. void (*ad0x0_spi_push)(ADQS_t _ctype,uint8_t _cbyte);
  206. uint8_t (*ad0x0_spi_get_ext_async2)(uint8_t *_p_out_handle,void **_p_out_spi_ext_t);
  207. void (*ad0x0_spi_push_ext_setfunc)(uint8_t _sf_id,void (*_p_cb_func)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t));
  208. void (*ad0x0_spi_push_txrx_dma_ext)(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count);
  209. void (*ad0x0_spi_push_tx_pbuf_ext)(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count);
  210. void (*ad0x0_spi_push_tx_pbuf_dma_ext)(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count);
  211. void (*powerUp)(void);
  212. void (*powerDown)(void);
  213. void (*spi_cmd)(uint8_t _cmd);
  214. void (*set_ce)(uint8_t _isHigh);
  215. void (*enableRXPipe)(uint8_t _pipe_index,uint8_t _payload_size,bool _enable_AutoAck,bool _enable_DYN_PL);
  216. void (*setRateAndPA)(rf24_datarate_e speed,rf24_pa_dbm_e _power);
  217. void (*setRetransmission)(uint8_t delay, uint8_t count);
  218. void (*PRX_readPayload_transmitAck)(uint8_t _pipe_index,uint8_t _payload_size, uint8_t _ack_payload_size);
  219. void (*PTX_transmit_pipe)(uint8_t _pipe_index);
  220. void (*PTX_read_Ack)(uint8_t _pipe_index,uint8_t _ack_payload_size);
  221. __packed struct packet_data_s* (*get_pipe_packet_buf)(uint8_t _pipe_index);
  222. __packed struct packet_ack_data_s* (*get_pipe_ack_buf)(uint8_t _pipe_index);
  223. __packed struct pipe_data_s* (*get_pipe_buf)(uint8_t _pipe_index);
  224. void (*PTX_start)(uint8_t _pipe_index);
  225. void (*PRX_start)(uint8_t _pipe_index,uint8_t _ack_payload_size);
  226. void (*PTX_init)(void);
  227. void (*PRX_init)(void);
  228. void (*init_pipes)(void);
  229. uint8_t (*get_rssi)(void);
  230. };//rf24_spi_regs_t;//init_nrf24_spi_regs() 1st
  231. typedef __packed struct rf24_spi_regs_s rf24_spi_regs_t;
  232. //void init_nrf24_spi_regs(nrf24_spi_regs_t *p);
  233. typedef __packed struct{
  234. uint8_t
  235. _CONFIG,//0x00
  236. _EN_AA,
  237. _EN_RXADDR,
  238. _SETUP_AW,
  239. _SETUP_RETR,//0x4
  240. _RF_CH,
  241. _RF_SETUP,
  242. _STATUS,//0x7
  243. _OBSERVE_TX,
  244. _RPD,//0x09
  245. _RX_ADDR_P0[5],//0xA
  246. _RX_ADDR_P1[5],
  247. _RX_ADDR_P2,
  248. _RX_ADDR_P3,//0xD
  249. _RX_ADDR_P4,
  250. _RX_ADDR_P5,
  251. _TX_ADDR[5],//0x10
  252. _RX_PW_P0,
  253. _RX_PW_P1,
  254. _RX_PW_P2,//0x13
  255. _RX_PW_P3,
  256. _RX_PW_P4,
  257. _RX_PW_P5,
  258. _FIFO_STATUS,//0x17
  259. _DYNPD, //0x1C
  260. _FEATURE,//0x1D
  261. _R_RX_PL_WID,//cmd
  262. _NOP;
  263. }rf24_regs_t;
  264. /*__packed struct packet_data_s{
  265. uint32_t id;
  266. uint8_t bytes[28];
  267. };*/
  268. __packed struct packet_data_s{
  269. uint32_t id;//4
  270. ad0x0_gyrodata_s gyro;//14
  271. gps_data_t gps;//14
  272. uint8_t bytes[1];
  273. };
  274. typedef __packed struct packet_data_s packet_data_t;
  275. __packed struct packet_ack_data_s{
  276. uint32_t id;
  277. uint8_t bytes[8];
  278. };
  279. typedef __packed struct packet_ack_data_s packet_data_ack_t;
  280. __packed struct pipe_data_s{
  281. uint8_t bytes_count_packet;//PRX - размер Payload от PTX. Для PTX - то что отправляем в PRX
  282. uint8_t spi_cmd;//R_RX_PAYLOAD 0110 0001,W_TX_PAYLOAD 1010 0000
  283. packet_data_t packet;
  284. uint8_t bytes_count_ack;//PRX - размер AckPayload, для PTX - то что пришло от PRX
  285. uint8_t spi_cmd_ack;//
  286. packet_data_ack_t packet_ack;
  287. };
  288. typedef __packed struct pipe_data_s pipe_data_t;
  289. uint8_t NRF_Init(void);
  290. void rf24_init_spi1_regs(rf24_spi_regs_t *p,GPIO_TypeDef *CE_GPIO_Port, uint16_t CE_Pin);
  291. void rf24_init_spi2_regs(rf24_spi_regs_t *p,GPIO_TypeDef *CE_GPIO_Port, uint16_t CE_Pin);
  292. void rf24_spi1_scan_channels(uint8_t _sf_id,void (*_p_cb_func)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t));
  293. void rf24_spi2_scan_channels(uint8_t _sf_id,void (*_p_cb_func)(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t));
  294. void read_all_regs(rf24_spi_regs_t *p_spi_regs,rf24_regs_t *pregs);
  295. void read_all_regs_postprocess(rf24_spi_regs_t *p_spi_regs,rf24_regs_t *pregs);
  296. void ad0x0_rf24_spi1_irq(void);
  297. void ad0x0_rf24_spi2_irq(void);
  298. void rf24_tx_pipe(uint8_t _pipe_index);
  299. void read_register(rf24_spi_REG_t *preg_radr);
  300. void read_register5(rf24_spi_REG5_t *preg_radr);
  301. void write_register(rf24_spi_REG_t *preg_radr, uint8_t _val);
  302. void write_register5(rf24_spi_REG5_t *preg_radr5, uint8_t *_buf5);
  303. void write_register_bits(rf24_spi_REG_t *preg_radr, uint8_t _or_bits, uint8_t _and_mask);
  304. packet_data_t *get_pipe_packet_buf(uint8_t _pipe_index);
  305. packet_data_ack_t *get_pipe_ack_buf(uint8_t _pipe_index);
  306. #endif /* NRF24L01_H_ */