nrf24l01.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright 2021 IOsetting <iosetting(at)outlook.com>
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "nrf24l01.h"
  15. uint8_t __IDATA NRF24L01_xbuf[NRF24_PLOAD_WIDTH + 1];
  16. uint8_t *NRF24L01_xbuf_data = NRF24L01_xbuf + 1;
  17. uint16_t NRF24L01_rxsn = 0;
  18. // T:0x22, R:0x65
  19. const uint8_t RX_ADDRESS[NRF24_ADDR_WIDTH] = {0x32,0x4E,0x6F,0x64,0x22};
  20. const uint8_t TX_ADDRESS[NRF24_ADDR_WIDTH] = {0x32,0x4E,0x6F,0x64,0x65};
  21. void NRF24L01_WriteReg(uint8_t reg, uint8_t value)
  22. {
  23. NRF_CSN = 0;
  24. NRF24L01_xbuf[0] = reg;
  25. NRF24L01_xbuf[1] = value;
  26. SPI_TxRxBytes(NRF24L01_xbuf, 2);
  27. NRF_CSN = 1;
  28. }
  29. uint8_t NRF24L01_ReadReg(uint8_t reg)
  30. {
  31. NRF_CSN = 0;
  32. NRF24L01_xbuf[0] = reg;
  33. NRF24L01_xbuf[1] = NRF24_CMD_NOP;
  34. SPI_TxRxBytes(NRF24L01_xbuf, 2);
  35. NRF_CSN = 1;
  36. return NRF24L01_xbuf[1];
  37. }
  38. void NRF24L01_ReadToBuf(uint8_t reg, uint8_t len)
  39. {
  40. NRF_CSN = 0;
  41. memset(NRF24L01_xbuf, NRF24_CMD_NOP, NRF24_PLOAD_WIDTH + 1);
  42. NRF24L01_xbuf[0] = reg;
  43. SPI_TxRxBytes(NRF24L01_xbuf, len + 1);
  44. NRF_CSN = 1;
  45. }
  46. void NRF24L01_WriteFromBuf(uint8_t reg, const uint8_t *pBuf, uint8_t len)
  47. {
  48. NRF_CSN = 0;
  49. NRF24L01_xbuf[0] = reg;
  50. memcpy(NRF24L01_xbuf_data, pBuf, len);
  51. SPI_TxRxBytes(NRF24L01_xbuf, len + 1);
  52. NRF_CSN = 1;
  53. }
  54. void NRF24L01_PrintBuf(void)
  55. {
  56. uint8_t i;
  57. for (i = 0; i < NRF24_PLOAD_WIDTH + 1; i++)
  58. {
  59. UART1_TxHex(NRF24L01_xbuf[i]);
  60. }
  61. UART1_TxString("\r\n");
  62. }
  63. /**
  64. * Flush the RX FIFO
  65. */
  66. void NRF24L01_FlushRX(void)
  67. {
  68. NRF24L01_WriteReg(NRF24_CMD_FLUSH_RX, NRF24_CMD_NOP);
  69. }
  70. /**
  71. * Flush the TX FIFO
  72. */
  73. void NRF24L01_FlushTX(void)
  74. {
  75. NRF24L01_WriteReg(NRF24_CMD_FLUSH_TX, NRF24_CMD_NOP);
  76. }
  77. void NRF24L01_CheckFlag(void)
  78. {
  79. // Read the status & reset the flags
  80. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_STATUS, NRF24_FLAG_RX_DREADY|NRF24_FLAG_TX_DSENT|NRF24_FLAG_MAX_RT);
  81. }
  82. uint8_t NRF24L01_HandelIrqFlag(void)
  83. {
  84. uint8_t status, tx_ds, max_rt, rx_dr, pipe_num;
  85. NRF24L01_CheckFlag();
  86. status = NRF24L01_xbuf[0];
  87. pipe_num = (status >> 1) & 0x07;
  88. if (pipe_num != 0x07)
  89. {
  90. NRF24L01_ReadToBuf(NRF24_CMD_R_RX_PAYLOAD, NRF24_PLOAD_WIDTH);
  91. NRF24L01_rxsn++;
  92. }
  93. return status;
  94. }
  95. void NRF24L01_Tx(uint8_t *pBuf)
  96. {
  97. NRF_CE = 0;
  98. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_CONFIG, 0x0E);
  99. NRF24L01_WriteFromBuf(NRF24_CMD_W_TX_PAYLOAD, pBuf, NRF24_PLOAD_WIDTH);
  100. NRF_CE = 1;
  101. SYS_Delay(10); // for reliable DS state when SETUP_RETR is 0x13
  102. NRF_CE = 0;
  103. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_CONFIG, 0x0F);
  104. NRF_CE = 1;
  105. }
  106. void NRF24L01_StartFastWrite(const void* pBuf)
  107. {
  108. NRF24L01_WriteFromBuf(NRF24_CMD_W_TX_PAYLOAD, pBuf, NRF24_PLOAD_WIDTH);
  109. NRF_CE = 1;
  110. }
  111. uint8_t NRF24L01_WriteFast(const void* pBuf)
  112. {
  113. //Blocking only if FIFO is full. This will loop and block until TX is successful or fail
  114. while ((NRF24L01_ReadReg(NRF24_REG_STATUS) & NRF24_FLAG_TX_FULL)) {
  115. if (NRF24L01_xbuf[0] & NRF24_FLAG_MAX_RT) {
  116. return 0;
  117. }
  118. }
  119. NRF24L01_StartFastWrite(pBuf);
  120. return 1;
  121. }
  122. void NRF24L01_ResetTX(void)
  123. {
  124. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_STATUS, NRF24_FLAG_MAX_RT);//Clear max retry flag
  125. NRF_CE = 0;
  126. NRF_CE = 1;
  127. }
  128. uint8_t NRF24L01_Check(void)
  129. {
  130. uint8_t i;
  131. const uint8_t *ptr = (const uint8_t *)NRF24_TEST_ADDR;
  132. NRF24L01_WriteFromBuf(NRF24_CMD_W_REGISTER | NRF24_REG_TX_ADDR, ptr, NRF24_ADDR_WIDTH);
  133. NRF24L01_ReadToBuf(NRF24_CMD_R_REGISTER | NRF24_REG_TX_ADDR, NRF24_ADDR_WIDTH);
  134. for (i = 0; i < NRF24_ADDR_WIDTH; i++) {
  135. UART1_TxHex(*(NRF24L01_xbuf_data + i));
  136. if (*(NRF24L01_xbuf_data + i) != *ptr++) return 1;
  137. }
  138. return 0;
  139. }
  140. void NRF24L01_Init(NRF24_MODE mode)
  141. {
  142. NRF_CE = 0;
  143. NRF24L01_WriteFromBuf(NRF24_CMD_W_REGISTER + NRF24_REG_TX_ADDR, (uint8_t *)TX_ADDRESS, NRF24_ADDR_WIDTH);
  144. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_RX_PW_P0, NRF24_PLOAD_WIDTH);
  145. NRF24L01_WriteFromBuf(NRF24_CMD_W_REGISTER + NRF24_REG_RX_ADDR_P0, (uint8_t *)TX_ADDRESS, NRF24_ADDR_WIDTH);
  146. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_RX_PW_P1, NRF24_PLOAD_WIDTH);
  147. NRF24L01_WriteFromBuf(NRF24_CMD_W_REGISTER + NRF24_REG_RX_ADDR_P1, (uint8_t *)RX_ADDRESS, NRF24_ADDR_WIDTH);
  148. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_EN_AA, 0x3f);
  149. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_EN_RXADDR, 0x3f);
  150. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_SETUP_RETR, 0x13);
  151. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_RF_CH, 40);
  152. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_RF_SETUP, 0x07);
  153. switch (mode)
  154. {
  155. case NRF24_MODE_TX:
  156. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_CONFIG, 0x0E);
  157. break;
  158. case NRF24_MODE_RX:
  159. default:
  160. NRF24L01_WriteReg(NRF24_CMD_W_REGISTER + NRF24_REG_CONFIG, 0x0F);
  161. break;
  162. }
  163. NRF_CE = 1;
  164. }