nrf24l01.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. #include "nrf24l01.h"
  2. #define SPI_CHECK_ENABLED_RESP(SPIx, val) if (!((SPIx)->CR1 & SPI_CR1_SPE)) {return (val);}
  3. #define SPI_WAIT_TX(SPIx) while ((SPIx->SR & SPI_FLAG_TXE) == 0 || (SPIx->SR & SPI_FLAG_BSY))
  4. #define SPI_WAIT_RX(SPIx) while ((SPIx->SR & SPI_FLAG_RXNE) == 0 || (SPIx->SR & SPI_FLAG_BSY))
  5. #define SPI_CHECK_ENABLED(SPIx) if (!((SPIx)->CR1 & SPI_CR1_SPE)) {return;}
  6. #define SPI_CHECK_ENABLED_RESP(SPIx, val) if (!((SPIx)->CR1 & SPI_CR1_SPE)) {return (val);}
  7. static __INLINE uint8_t SPI_Send(SPI_TypeDef* SPIx, uint8_t data) {
  8. /* Check if SPI is enabled */
  9. SPI_CHECK_ENABLED_RESP(SPIx, 0);
  10. /* Wait for previous transmissions to complete if DMA TX enabled for SPI */
  11. SPI_WAIT_TX(SPIx);
  12. /* Fill output buffer with data */
  13. *(__IO uint8_t *)&SPIx->DR = data;
  14. /* Wait for transmission to complete */
  15. SPI_WAIT_RX(SPIx);
  16. /* Return data from buffer */
  17. return SPIx->DR;
  18. }
  19. void SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t* dataIn, uint8_t dummy, uint32_t count) {
  20. /* Check if SPI is enabled */
  21. SPI_CHECK_ENABLED(SPIx);
  22. while (count--) {
  23. /* Wait busy */
  24. SPI_WAIT_TX(SPIx);
  25. /* Fill output buffer with data */
  26. *(__IO uint8_t *)&SPIx->DR = dummy;
  27. /* Wait for SPI to end everything */
  28. SPI_WAIT_RX(SPIx);
  29. /* Save data to buffer */
  30. *dataIn++ = *(__IO uint8_t *)&SPIx->DR;
  31. }
  32. }
  33. void SPI_WriteMulti(SPI_TypeDef* SPIx, uint8_t* dataOut, uint32_t count) {
  34. /* Check if SPI is enabled */
  35. SPI_CHECK_ENABLED(SPIx);
  36. while (count--) {
  37. /* Wait busy */
  38. SPI_WAIT_TX(SPIx);
  39. /* Fill output buffer with data */
  40. *(__IO uint8_t *)&SPIx->DR = *dataOut++;
  41. /* Wait for SPI to end everything */
  42. SPI_WAIT_RX(SPIx);
  43. /* Read data register */
  44. (void)*(__IO uint16_t *)&SPIx->DR;
  45. }
  46. }
  47. void SPI_SendMulti(SPI_TypeDef* SPIx, uint8_t* dataOut, uint8_t* dataIn, uint32_t count) {
  48. /* Check if SPI is enabled */
  49. SPI_CHECK_ENABLED(SPIx);
  50. while (count--) {
  51. /* Wait busy */
  52. SPI_WAIT_TX(SPIx);
  53. /* Fill output buffer with data */
  54. *(__IO uint8_t *)&SPIx->DR = *dataOut++;
  55. /* Wait for SPI to end everything */
  56. SPI_WAIT_RX(SPIx);
  57. /* Read data register */
  58. *dataIn++ = *(__IO uint8_t *)&SPIx->DR;
  59. }
  60. }
  61. //--------------------------------------------------------------------------------
  62. Nrf24L01::Nrf24L01(uint8_t channel, SPI_HandleTypeDef *spi, GPIO_TypeDef *port_cs, uint16_t pin_cs, GPIO_TypeDef *port_ce, uint16_t pin_ce){
  63. _spi = spi;
  64. _cs_port = port_cs;
  65. _cs_pin = pin_cs;
  66. _ce_port = port_ce;
  67. _ce_pin = pin_ce;
  68. _channel = channel;
  69. _payload_size = 32;
  70. init();
  71. }
  72. void Nrf24L01::TM_NRF24L01_WriteBit(uint8_t reg, uint8_t bit, uint8_t value) {
  73. uint8_t tmp;
  74. /* Read register */
  75. tmp = TM_NRF24L01_ReadRegister(reg);
  76. /* Make operation */
  77. if (value) {
  78. tmp |= 1 << bit;
  79. } else {
  80. tmp &= ~(1 << bit);
  81. }
  82. /* Write back */
  83. TM_NRF24L01_WriteRegister(reg, tmp);
  84. }
  85. uint8_t Nrf24L01::TM_NRF24L01_ReadBit(uint8_t reg, uint8_t bit) {
  86. uint8_t tmp;
  87. tmp = TM_NRF24L01_ReadRegister(reg);
  88. if (!NRF24L01_CHECK_BIT(tmp, bit)) {
  89. return 0;
  90. }
  91. return 1;
  92. }
  93. uint8_t Nrf24L01::TM_NRF24L01_ReadRegister(uint8_t reg) {
  94. uint8_t value;
  95. // NRF24L01_CSN_LOW;
  96. PIN_LOW(_cs_port, _cs_pin);
  97. SPI_Send(_spi->Instance, NRF24L01_READ_REGISTER_MASK(reg));
  98. value = SPI_Send(_spi->Instance, NRF24L01_NOP_MASK);
  99. //NRF24L01_CSN_HIGH;
  100. PIN_HIGH(_cs_port, _cs_pin);
  101. return value;
  102. }
  103. void Nrf24L01::TM_NRF24L01_ReadRegisterMulti(uint8_t reg, uint8_t* data, uint8_t count) {
  104. // NRF24L01_CSN_LOW;
  105. PIN_LOW(_cs_port, _cs_pin);
  106. SPI_Send(_spi->Instance, NRF24L01_READ_REGISTER_MASK(reg));
  107. SPI_ReadMulti(_spi->Instance, data, NRF24L01_NOP_MASK, count);
  108. // NRF24L01_CSN_HIGH;
  109. PIN_HIGH(_cs_port, _cs_pin);
  110. }
  111. void Nrf24L01::TM_NRF24L01_WriteRegister(uint8_t reg, uint8_t value) {
  112. // NRF24L01_CSN_LOW;
  113. PIN_LOW(_cs_port, _cs_pin);
  114. SPI_Send(_spi->Instance, NRF24L01_WRITE_REGISTER_MASK(reg));
  115. SPI_Send(_spi->Instance, value);
  116. // NRF24L01_CSN_HIGH;
  117. PIN_HIGH(_cs_port, _cs_pin);
  118. }
  119. void Nrf24L01::TM_NRF24L01_WriteRegisterMulti(uint8_t reg, uint8_t *data, uint8_t count) {
  120. // NRF24L01_CSN_LOW;
  121. PIN_LOW(_cs_port, _cs_pin);
  122. SPI_Send(_spi->Instance, NRF24L01_WRITE_REGISTER_MASK(reg));
  123. SPI_WriteMulti(_spi->Instance, data, count);
  124. // NRF24L01_CSN_HIGH;
  125. PIN_HIGH(_cs_port, _cs_pin);
  126. }
  127. void Nrf24L01::softwareReset(void) {
  128. uint8_t data[5];
  129. TM_NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_REG_DEFAULT_VAL_CONFIG);
  130. TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, NRF24L01_REG_DEFAULT_VAL_EN_AA);
  131. TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, NRF24L01_REG_DEFAULT_VAL_EN_RXADDR);
  132. TM_NRF24L01_WriteRegister(NRF24L01_REG_SETUP_AW, NRF24L01_REG_DEFAULT_VAL_SETUP_AW);
  133. TM_NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, NRF24L01_REG_DEFAULT_VAL_SETUP_RETR);
  134. TM_NRF24L01_WriteRegister(NRF24L01_REG_RF_CH, NRF24L01_REG_DEFAULT_VAL_RF_CH);
  135. TM_NRF24L01_WriteRegister(NRF24L01_REG_RF_SETUP, NRF24L01_REG_DEFAULT_VAL_RF_SETUP);
  136. TM_NRF24L01_WriteRegister(NRF24L01_REG_STATUS, NRF24L01_REG_DEFAULT_VAL_STATUS);
  137. TM_NRF24L01_WriteRegister(NRF24L01_REG_OBSERVE_TX, NRF24L01_REG_DEFAULT_VAL_OBSERVE_TX);
  138. TM_NRF24L01_WriteRegister(NRF24L01_REG_RPD, NRF24L01_REG_DEFAULT_VAL_RPD);
  139. //P0
  140. data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_0;
  141. data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_1;
  142. data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_2;
  143. data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_3;
  144. data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_4;
  145. TM_NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P0, data, 5);
  146. //P1
  147. data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_0;
  148. data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_1;
  149. data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_2;
  150. data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_3;
  151. data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_4;
  152. TM_NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P1, data, 5);
  153. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P2, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P2);
  154. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P3, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P3);
  155. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P4, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P4);
  156. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P5, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P5);
  157. //TX
  158. data[0] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_0;
  159. data[1] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_1;
  160. data[2] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_2;
  161. data[3] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_3;
  162. data[4] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_4;
  163. TM_NRF24L01_WriteRegisterMulti(NRF24L01_REG_TX_ADDR, data, 5);
  164. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, NRF24L01_REG_DEFAULT_VAL_RX_PW_P0);
  165. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, NRF24L01_REG_DEFAULT_VAL_RX_PW_P1);
  166. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, NRF24L01_REG_DEFAULT_VAL_RX_PW_P2);
  167. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, NRF24L01_REG_DEFAULT_VAL_RX_PW_P3);
  168. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, NRF24L01_REG_DEFAULT_VAL_RX_PW_P4);
  169. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, NRF24L01_REG_DEFAULT_VAL_RX_PW_P5);
  170. TM_NRF24L01_WriteRegister(NRF24L01_REG_FIFO_STATUS, NRF24L01_REG_DEFAULT_VAL_FIFO_STATUS);
  171. TM_NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, NRF24L01_REG_DEFAULT_VAL_DYNPD);
  172. TM_NRF24L01_WriteRegister(NRF24L01_REG_FEATURE, NRF24L01_REG_DEFAULT_VAL_FEATURE);
  173. }
  174. uint8_t Nrf24L01::RxFifoEmpty(void) {
  175. uint8_t reg = TM_NRF24L01_ReadRegister(NRF24L01_REG_FIFO_STATUS);
  176. return NRF24L01_CHECK_BIT(reg, NRF24L01_RX_EMPTY);
  177. }
  178. // ----------------------- PUBLIC METHODS -------------------------------------
  179. uint8_t Nrf24L01::init() {
  180. /* Initialize CE and CSN pins */
  181. /* CNS pin */
  182. //TM_GPIO_Init(NRF24L01_CSN_PORT, NRF24L01_CSN_PIN, TM_GPIO_Mode_OUT, TM_GPIO_OType_PP, TM_GPIO_PuPd_UP, TM_GPIO_Speed_Low);
  183. /* CE pin */
  184. //TM_GPIO_Init(NRF24L01_CE_PORT, NRF24L01_CE_PIN, TM_GPIO_Mode_OUT, TM_GPIO_OType_PP, TM_GPIO_PuPd_UP, TM_GPIO_Speed_Low);
  185. /* CSN high = disable SPI */
  186. PIN_HIGH(_cs_port, _cs_pin);
  187. /* CE low = disable TX/RX */
  188. PIN_LOW(_ce_port, _ce_pin);
  189. /* Max payload is 32bytes */
  190. if (_payload_size > 32) {
  191. _payload_size = 32;
  192. }
  193. /* Fill structure */
  194. nrf_config.Channel = !_channel; /* Set channel to some different value for TM_NRF24L01_SetChannel() function */
  195. nrf_config.PayloadSize = _payload_size;
  196. nrf_config.OutPwr = TM_NRF24L01_OutputPower_0dBm;
  197. nrf_config.DataRate = TM_NRF24L01_DataRate_2M;
  198. /* Reset nRF24L01+ to power on registers values */
  199. softwareReset();
  200. /* Channel select */
  201. SetChannel(_channel);
  202. /* Set pipeline to max possible 32 bytes */
  203. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, nrf_config.PayloadSize); // Auto-ACK pipe
  204. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, nrf_config.PayloadSize); // Data payload pipe
  205. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, nrf_config.PayloadSize);
  206. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, nrf_config.PayloadSize);
  207. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, nrf_config.PayloadSize);
  208. TM_NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, nrf_config.PayloadSize);
  209. /* Set RF settings (2mbps, output power) */
  210. SetRF(nrf_config.DataRate, nrf_config.OutPwr);
  211. /* Config register */
  212. TM_NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG);
  213. /* Enable auto-acknowledgment for all pipes */
  214. TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, 0x3F);
  215. /* Enable RX addresses */
  216. TM_NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, 0x3F);
  217. /* Auto retransmit delay: 1000 (4x250) us and Up to 15 retransmit trials */
  218. TM_NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, 0x4F);
  219. /* Dynamic length configurations: No dynamic length */
  220. TM_NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, (0 << NRF24L01_DPL_P0) | (0 << NRF24L01_DPL_P1) | (0 << NRF24L01_DPL_P2) | (0 << NRF24L01_DPL_P3) | (0 << NRF24L01_DPL_P4) | (0 << NRF24L01_DPL_P5));
  221. /* Clear FIFOs */
  222. NRF24L01_FLUSH_TX(_spi->Instance, _cs_port, _cs_pin);
  223. NRF24L01_FLUSH_RX(_spi->Instance, _cs_port, _cs_pin);
  224. /* Clear interrupts */
  225. Clear_Interrupts();
  226. /* Go to RX mode */
  227. PowerUpRx();
  228. /* Return OK */
  229. return 1;
  230. }
  231. void Nrf24L01::SetMyAddress(uint8_t *adr) {
  232. // NRF24L01_CE_LOW;
  233. PIN_LOW(_ce_port, _ce_pin);
  234. TM_NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P1, adr, 5);
  235. // NRF24L01_CE_HIGH;
  236. PIN_HIGH(_ce_port, _ce_pin);
  237. }
  238. void Nrf24L01::SetTxAddress(uint8_t *adr) {
  239. TM_NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P0, adr, 5);
  240. TM_NRF24L01_WriteRegisterMulti(NRF24L01_REG_TX_ADDR, adr, 5);
  241. }
  242. uint8_t Nrf24L01::GetStatus(void) {
  243. uint8_t status;
  244. // NRF24L01_CSN_LOW;
  245. PIN_LOW(_cs_port, _cs_pin);
  246. /* First received byte is always status register */
  247. status = SPI_Send(_spi->Instance, NRF24L01_NOP_MASK);
  248. /* Pull up chip select */
  249. // NRF24L01_CSN_HIGH;
  250. PIN_LOW(_cs_port, _cs_pin);
  251. return status;
  252. }
  253. Transmit_Status_t Nrf24L01::GetTransmissionStatus(void) {
  254. uint8_t status = GetStatus();
  255. if (NRF24L01_CHECK_BIT(status, NRF24L01_TX_DS)) {
  256. /* Successfully sent */
  257. return TM_NRF24L01_Transmit_Status_Ok;
  258. } else if (NRF24L01_CHECK_BIT(status, NRF24L01_MAX_RT)) {
  259. /* Message lost */
  260. return TM_NRF24L01_Transmit_Status_Lost;
  261. }
  262. /* Still sending */
  263. return TM_NRF24L01_Transmit_Status_Sending;
  264. }
  265. uint8_t Nrf24L01::GetRetransmissionsCount(void) {
  266. /* Low 4 bits */
  267. return TM_NRF24L01_ReadRegister(NRF24L01_REG_OBSERVE_TX) & 0x0F;
  268. }
  269. void Nrf24L01::PowerUpTx(void) {
  270. Clear_Interrupts();
  271. TM_NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | (0 << NRF24L01_PRIM_RX) | (1 << NRF24L01_PWR_UP));
  272. }
  273. void Nrf24L01::SetChannel(uint8_t channel) {
  274. if (channel <= 125 && channel != nrf_config.Channel) {
  275. /* Store new channel setting */
  276. nrf_config.Channel = channel;
  277. /* Write channel */
  278. TM_NRF24L01_WriteRegister(NRF24L01_REG_RF_CH, channel);
  279. }
  280. }
  281. void Nrf24L01::SetRF(TM_NRF24L01_DataRate_t DataRate, TM_NRF24L01_OutputPower_t OutPwr) {
  282. uint8_t tmp = 0;
  283. nrf_config.DataRate = DataRate;
  284. nrf_config.OutPwr = OutPwr;
  285. if (DataRate == TM_NRF24L01_DataRate_2M) {
  286. tmp |= 1 << NRF24L01_RF_DR_HIGH;
  287. } else if (DataRate == TM_NRF24L01_DataRate_250k) {
  288. tmp |= 1 << NRF24L01_RF_DR_LOW;
  289. }
  290. /* If 1Mbps, all bits set to 0 */
  291. if (OutPwr == TM_NRF24L01_OutputPower_0dBm) {
  292. tmp |= 3 << NRF24L01_RF_PWR;
  293. } else if (OutPwr == TM_NRF24L01_OutputPower_M6dBm) {
  294. tmp |= 2 << NRF24L01_RF_PWR;
  295. } else if (OutPwr == TM_NRF24L01_OutputPower_M12dBm) {
  296. tmp |= 1 << NRF24L01_RF_PWR;
  297. }
  298. TM_NRF24L01_WriteRegister(NRF24L01_REG_RF_SETUP, tmp);
  299. }
  300. uint8_t Nrf24L01::Read_Interrupts(TM_NRF24L01_IRQ_t* IRQ) {
  301. IRQ->Status = GetStatus();
  302. return IRQ->Status;
  303. }
  304. void Nrf24L01::Clear_Interrupts(void) {
  305. TM_NRF24L01_WriteRegister(0x07, 0x70);
  306. }
  307. void Nrf24L01::PowerUpRx(void) {
  308. /* Disable RX/TX mode */
  309. // NRF24L01_CE_LOW;
  310. PIN_LOW(_ce_port, _ce_pin);
  311. /* Clear RX buffer */
  312. NRF24L01_FLUSH_RX(_spi->Instance, _cs_port, _cs_pin);
  313. /* Clear interrupts */
  314. Clear_Interrupts();
  315. /* Setup RX mode */
  316. TM_NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | 1 << NRF24L01_PWR_UP | 1 << NRF24L01_PRIM_RX);
  317. /* Start listening */
  318. // NRF24L01_CE_HIGH;
  319. PIN_HIGH(_ce_port, _ce_pin);
  320. }
  321. void Nrf24L01::PowerDown(void) {
  322. // NRF24L01_CE_LOW;
  323. PIN_LOW(_ce_port, _ce_pin);
  324. TM_NRF24L01_WriteBit(NRF24L01_REG_CONFIG, NRF24L01_PWR_UP, 0);
  325. }
  326. void Nrf24L01::Transmit(uint8_t *data) {
  327. uint8_t count = nrf_config.PayloadSize;
  328. /* Chip enable put to low, disable it */
  329. // NRF24L01_CE_LOW;
  330. PIN_LOW(_ce_port, _ce_pin);
  331. /* Go to power up tx mode */
  332. PowerUpTx();
  333. /* Clear TX FIFO from NRF24L01+ */
  334. NRF24L01_FLUSH_TX(_spi->Instance, _cs_port, _cs_pin);
  335. /* Send payload to nRF24L01+ */
  336. // NRF24L01_CSN_LOW;
  337. PIN_LOW(_cs_port, _cs_pin);
  338. /* Send write payload command */
  339. SPI_Send(_spi->Instance, NRF24L01_W_TX_PAYLOAD_MASK);
  340. /* Fill payload with data*/
  341. SPI_WriteMulti(_spi->Instance, data, count);
  342. /* Disable SPI */
  343. // NRF24L01_CSN_HIGH;
  344. PIN_HIGH(_cs_port, _cs_pin);
  345. /* Send data! */
  346. // NRF24L01_CE_HIGH;
  347. PIN_HIGH(_ce_port, _ce_pin);
  348. }
  349. void Nrf24L01::GetData(uint8_t* data) {
  350. /* Pull down chip select */
  351. // NRF24L01_CSN_LOW;
  352. PIN_LOW(_cs_port, _cs_pin);
  353. /* Send read payload command*/
  354. SPI_Send(_spi->Instance, NRF24L01_R_RX_PAYLOAD_MASK);
  355. /* Read payload */
  356. SPI_SendMulti(_spi->Instance, data, data, nrf_config.PayloadSize);
  357. /* Pull up chip select */
  358. // NRF24L01_CSN_HIGH;
  359. PIN_HIGH(_cs_port, _cs_pin);
  360. /* Reset status register, clear RX_DR interrupt flag */
  361. TM_NRF24L01_WriteRegister(NRF24L01_REG_STATUS, (1 << NRF24L01_RX_DR));
  362. }
  363. uint8_t Nrf24L01::DataReady(void) {
  364. uint8_t status = GetStatus();
  365. if (NRF24L01_CHECK_BIT(status, NRF24L01_RX_DR)) {
  366. return 1;
  367. }
  368. return !RxFifoEmpty();
  369. }