nrf24l01.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. #include "nrf24l01.h"
  2. /*
  3. #define SPI_CHECK_ENABLED_RESP(SPIx, val) if (!((SPIx)->CR1 & SPI_CR1_SPE)) {return (val);}
  4. #define SPI_WAIT_TX(SPIx) while ((SPIx->SR & SPI_FLAG_TXE) == 0 || (SPIx->SR & SPI_FLAG_BSY))
  5. #define SPI_WAIT_RX(SPIx) while ((SPIx->SR & SPI_FLAG_RXNE) == 0 || (SPIx->SR & SPI_FLAG_BSY))
  6. #define SPI_CHECK_ENABLED(SPIx) if (!((SPIx)->CR1 & SPI_CR1_SPE)) {return;}
  7. #define SPI_CHECK_ENABLED_RESP(SPIx, val) if (!((SPIx)->CR1 & SPI_CR1_SPE)) {return (val);}
  8. */
  9. Nrf24L01::Nrf24L01(uint8_t channel, NrfManager *nrf_manager, GPIO_TypeDef *port_cs, uint16_t pin_cs, GPIO_TypeDef *port_ce, uint16_t pin_ce){
  10. _nrfManager = nrf_manager;
  11. _cs_port = port_cs;
  12. _cs_pin = pin_cs;
  13. _ce_port = port_ce;
  14. _ce_pin = pin_ce;
  15. _channel = channel;
  16. _payload_size = 32;
  17. init();
  18. }
  19. uint8_t Nrf24L01::init() {
  20. //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);
  21. //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);
  22. // CSN high = disable SPI
  23. PIN_HIGH(_cs_port, _cs_pin);
  24. // CE low = disable TX/RX
  25. PIN_LOW(_ce_port, _ce_pin);
  26. /* Max payload is 32bytes */
  27. if (_payload_size > 32) {
  28. _payload_size = 32;
  29. }
  30. /* Fill structure */
  31. nrf_config.Channel = !_channel; /* Set channel to some different value for TM_NRF24L01_SetChannel() function */
  32. nrf_config.PayloadSize = _payload_size;
  33. nrf_config.OutPwr = TM_NRF24L01_OutputPower_0dBm;
  34. nrf_config.DataRate = TM_NRF24L01_DataRate_2M;
  35. /* Reset nRF24L01+ to power on registers values */
  36. softwareReset();
  37. /* Channel select */
  38. SetChannel(_channel);
  39. /* Set pipeline to max possible 32 bytes */
  40. writeRegister(NRF24L01_REG_RX_PW_P0, nrf_config.PayloadSize); // Auto-ACK pipe
  41. writeRegister(NRF24L01_REG_RX_PW_P1, nrf_config.PayloadSize); // Data payload pipe
  42. writeRegister(NRF24L01_REG_RX_PW_P2, nrf_config.PayloadSize);
  43. writeRegister(NRF24L01_REG_RX_PW_P3, nrf_config.PayloadSize);
  44. writeRegister(NRF24L01_REG_RX_PW_P4, nrf_config.PayloadSize);
  45. writeRegister(NRF24L01_REG_RX_PW_P5, nrf_config.PayloadSize);
  46. /* Set RF settings (2mbps, output power) */
  47. SetRF(nrf_config.DataRate, nrf_config.OutPwr);
  48. /* Config register */
  49. writeRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG);
  50. /* Enable auto-acknowledgment for all pipes */
  51. writeRegister(NRF24L01_REG_EN_AA, 0x3F);
  52. /* Enable RX addresses */
  53. writeRegister(NRF24L01_REG_EN_RXADDR, 0x3F);
  54. /* Auto retransmit delay: 1000 (4x250) us and Up to 15 retransmit trials */
  55. writeRegister(NRF24L01_REG_SETUP_RETR, 0x4F);
  56. /* Dynamic length configurations: No dynamic length */
  57. 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));
  58. /* Clear FIFOs */
  59. NRF24L01_FLUSH_TX(_nrfManager, _cs_port, _cs_pin);
  60. NRF24L01_FLUSH_RX(_nrfManager, _cs_port, _cs_pin);
  61. /* Clear interrupts */
  62. Clear_Interrupts();
  63. /* Go to RX mode */
  64. PowerUpRx();
  65. /* Return OK */
  66. return 1;
  67. }
  68. void Nrf24L01::writeBit(uint8_t reg, uint8_t bit, uint8_t value) {
  69. uint8_t tmp;
  70. tmp = readRegister(reg);
  71. if (value) {
  72. tmp |= 1 << bit;
  73. } else {
  74. tmp &= ~(1 << bit);
  75. }
  76. writeRegister(reg, tmp);
  77. }
  78. uint8_t Nrf24L01::readBit(uint8_t reg, uint8_t bit) {
  79. uint8_t tmp;
  80. tmp = readRegister(reg);
  81. if (!NRF24L01_CHECK_BIT(tmp, bit)) {
  82. return 0;
  83. }
  84. return 1;
  85. }
  86. uint8_t Nrf24L01::readRegister(uint8_t reg) {
  87. uint8_t value;
  88. PIN_LOW(_cs_port, _cs_pin);
  89. _nrfManager->SPI_Send(NRF24L01_READ_REGISTER_MASK(reg));
  90. value = _nrfManager->SPI_Send(NRF24L01_NOP_MASK);
  91. PIN_HIGH(_cs_port, _cs_pin);
  92. return value;
  93. }
  94. void Nrf24L01::readRegisterMulti(uint8_t reg, uint8_t* data, uint8_t count) {
  95. PIN_LOW(_cs_port, _cs_pin);
  96. _nrfManager->SPI_Send(NRF24L01_READ_REGISTER_MASK(reg));
  97. _nrfManager->SPI_ReadMulti(data, NRF24L01_NOP_MASK, count);
  98. PIN_HIGH(_cs_port, _cs_pin);
  99. }
  100. void Nrf24L01::writeRegister(uint8_t reg, uint8_t value) {
  101. PIN_LOW(_cs_port, _cs_pin);
  102. _nrfManager->SPI_Send(NRF24L01_WRITE_REGISTER_MASK(reg));
  103. _nrfManager->SPI_Send(value);
  104. PIN_HIGH(_cs_port, _cs_pin);
  105. }
  106. void Nrf24L01::writeRegisterMulti(uint8_t reg, uint8_t *data, uint8_t count) {
  107. PIN_LOW(_cs_port, _cs_pin);
  108. _nrfManager->SPI_Send(NRF24L01_WRITE_REGISTER_MASK(reg));
  109. _nrfManager->SPI_WriteMulti(data, count);
  110. PIN_HIGH(_cs_port, _cs_pin);
  111. }
  112. void Nrf24L01::softwareReset(void) {
  113. uint8_t data[5];
  114. writeRegister(NRF24L01_REG_CONFIG, NRF24L01_REG_DEFAULT_VAL_CONFIG);
  115. writeRegister(NRF24L01_REG_EN_AA, NRF24L01_REG_DEFAULT_VAL_EN_AA);
  116. writeRegister(NRF24L01_REG_EN_RXADDR, NRF24L01_REG_DEFAULT_VAL_EN_RXADDR);
  117. writeRegister(NRF24L01_REG_SETUP_AW, NRF24L01_REG_DEFAULT_VAL_SETUP_AW);
  118. writeRegister(NRF24L01_REG_SETUP_RETR, NRF24L01_REG_DEFAULT_VAL_SETUP_RETR);
  119. writeRegister(NRF24L01_REG_RF_CH, NRF24L01_REG_DEFAULT_VAL_RF_CH);
  120. writeRegister(NRF24L01_REG_RF_SETUP, NRF24L01_REG_DEFAULT_VAL_RF_SETUP);
  121. writeRegister(NRF24L01_REG_STATUS, NRF24L01_REG_DEFAULT_VAL_STATUS);
  122. writeRegister(NRF24L01_REG_OBSERVE_TX, NRF24L01_REG_DEFAULT_VAL_OBSERVE_TX);
  123. writeRegister(NRF24L01_REG_RPD, NRF24L01_REG_DEFAULT_VAL_RPD);
  124. //P0
  125. data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_0;
  126. data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_1;
  127. data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_2;
  128. data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_3;
  129. data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_4;
  130. writeRegisterMulti(NRF24L01_REG_RX_ADDR_P0, data, 5);
  131. //P1
  132. data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_0;
  133. data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_1;
  134. data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_2;
  135. data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_3;
  136. data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_4;
  137. writeRegisterMulti(NRF24L01_REG_RX_ADDR_P1, data, 5);
  138. writeRegister(NRF24L01_REG_RX_ADDR_P2, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P2);
  139. writeRegister(NRF24L01_REG_RX_ADDR_P3, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P3);
  140. writeRegister(NRF24L01_REG_RX_ADDR_P4, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P4);
  141. writeRegister(NRF24L01_REG_RX_ADDR_P5, NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P5);
  142. //TX
  143. data[0] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_0;
  144. data[1] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_1;
  145. data[2] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_2;
  146. data[3] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_3;
  147. data[4] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_4;
  148. writeRegisterMulti(NRF24L01_REG_TX_ADDR, data, 5);
  149. writeRegister(NRF24L01_REG_RX_PW_P0, NRF24L01_REG_DEFAULT_VAL_RX_PW_P0);
  150. writeRegister(NRF24L01_REG_RX_PW_P1, NRF24L01_REG_DEFAULT_VAL_RX_PW_P1);
  151. writeRegister(NRF24L01_REG_RX_PW_P2, NRF24L01_REG_DEFAULT_VAL_RX_PW_P2);
  152. writeRegister(NRF24L01_REG_RX_PW_P3, NRF24L01_REG_DEFAULT_VAL_RX_PW_P3);
  153. writeRegister(NRF24L01_REG_RX_PW_P4, NRF24L01_REG_DEFAULT_VAL_RX_PW_P4);
  154. writeRegister(NRF24L01_REG_RX_PW_P5, NRF24L01_REG_DEFAULT_VAL_RX_PW_P5);
  155. writeRegister(NRF24L01_REG_FIFO_STATUS, NRF24L01_REG_DEFAULT_VAL_FIFO_STATUS);
  156. writeRegister(NRF24L01_REG_DYNPD, NRF24L01_REG_DEFAULT_VAL_DYNPD);
  157. writeRegister(NRF24L01_REG_FEATURE, NRF24L01_REG_DEFAULT_VAL_FEATURE);
  158. }
  159. uint8_t Nrf24L01::rxFifoEmpty(void) {
  160. uint8_t reg = readRegister(NRF24L01_REG_FIFO_STATUS);
  161. return NRF24L01_CHECK_BIT(reg, NRF24L01_RX_EMPTY);
  162. }
  163. // ----------------------- PUBLIC METHODS -------------------------------------
  164. void Nrf24L01::SetMyAddress(uint8_t *adr) {
  165. PIN_LOW(_ce_port, _ce_pin);
  166. writeRegisterMulti(NRF24L01_REG_RX_ADDR_P1, adr, 5);
  167. PIN_HIGH(_ce_port, _ce_pin);
  168. }
  169. void Nrf24L01::SetTxAddress(uint8_t *adr) {
  170. writeRegisterMulti(NRF24L01_REG_RX_ADDR_P0, adr, 5);
  171. writeRegisterMulti(NRF24L01_REG_TX_ADDR, adr, 5);
  172. }
  173. uint8_t Nrf24L01::GetStatus(void) {
  174. uint8_t status;
  175. PIN_LOW(_cs_port, _cs_pin);
  176. /* First received byte is always status register */
  177. status = _nrfManager->SPI_Send(NRF24L01_NOP_MASK);
  178. PIN_LOW(_cs_port, _cs_pin);
  179. return status;
  180. }
  181. Transmit_Status_t Nrf24L01::GetTransmissionStatus(void) {
  182. uint8_t status = GetStatus();
  183. if (NRF24L01_CHECK_BIT(status, NRF24L01_TX_DS)) {
  184. /* Successfully sent */
  185. return TM_NRF24L01_Transmit_Status_Ok;
  186. } else if (NRF24L01_CHECK_BIT(status, NRF24L01_MAX_RT)) {
  187. /* Message lost */
  188. return TM_NRF24L01_Transmit_Status_Lost;
  189. }
  190. /* Still sending */
  191. return TM_NRF24L01_Transmit_Status_Sending;
  192. }
  193. uint8_t Nrf24L01::GetRetransmissionsCount(void) {
  194. /* Low 4 bits */
  195. return readRegister(NRF24L01_REG_OBSERVE_TX) & 0x0F;
  196. }
  197. void Nrf24L01::PowerUpTx(void) {
  198. Clear_Interrupts();
  199. writeRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | (0 << NRF24L01_PRIM_RX) | (1 << NRF24L01_PWR_UP));
  200. }
  201. void Nrf24L01::SetChannel(uint8_t channel) {
  202. if (channel <= 125 && channel != nrf_config.Channel) {
  203. /* Store new channel setting */
  204. nrf_config.Channel = channel;
  205. /* Write channel */
  206. writeRegister(NRF24L01_REG_RF_CH, channel);
  207. }
  208. }
  209. void Nrf24L01::SetRF(NRF_DataRate_t DataRate, NRF_OutputPower_t OutPwr) {
  210. uint8_t tmp = 0;
  211. nrf_config.DataRate = DataRate;
  212. nrf_config.OutPwr = OutPwr;
  213. if (DataRate == TM_NRF24L01_DataRate_2M) {
  214. tmp |= 1 << NRF24L01_RF_DR_HIGH;
  215. } else if (DataRate == TM_NRF24L01_DataRate_250k) {
  216. tmp |= 1 << NRF24L01_RF_DR_LOW;
  217. }
  218. /* If 1Mbps, all bits set to 0 */
  219. if (OutPwr == TM_NRF24L01_OutputPower_0dBm) {
  220. tmp |= 3 << NRF24L01_RF_PWR;
  221. } else if (OutPwr == TM_NRF24L01_OutputPower_M6dBm) {
  222. tmp |= 2 << NRF24L01_RF_PWR;
  223. } else if (OutPwr == TM_NRF24L01_OutputPower_M12dBm) {
  224. tmp |= 1 << NRF24L01_RF_PWR;
  225. }
  226. writeRegister(NRF24L01_REG_RF_SETUP, tmp);
  227. }
  228. uint8_t Nrf24L01::Read_Interrupts(NRF_IRQ_t* IRQ) {
  229. IRQ->Status = GetStatus();
  230. return IRQ->Status;
  231. }
  232. void Nrf24L01::Clear_Interrupts(void) {
  233. writeRegister(0x07, 0x70);
  234. }
  235. void Nrf24L01::PowerUpRx(void) {
  236. /* Disable RX/TX mode */
  237. PIN_LOW(_ce_port, _ce_pin);
  238. NRF24L01_FLUSH_RX(_nrfManager, _cs_port, _cs_pin);
  239. Clear_Interrupts();
  240. /* Setup RX mode */
  241. writeRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | 1 << NRF24L01_PWR_UP | 1 << NRF24L01_PRIM_RX);
  242. /* Start listening */
  243. PIN_HIGH(_ce_port, _ce_pin);
  244. }
  245. void Nrf24L01::PowerDown(void) {
  246. PIN_LOW(_ce_port, _ce_pin);
  247. writeBit(NRF24L01_REG_CONFIG, NRF24L01_PWR_UP, 0);
  248. }
  249. void Nrf24L01::Transmit(uint8_t *data) {
  250. uint8_t count = nrf_config.PayloadSize;
  251. /* Chip enable put to low, disable it */
  252. PIN_LOW(_ce_port, _ce_pin);
  253. /* Go to power up tx mode */
  254. PowerUpTx();
  255. /* Clear TX FIFO from NRF24L01+ */
  256. NRF24L01_FLUSH_TX(_nrfManager, _cs_port, _cs_pin);
  257. /* Send payload to nRF24L01+ */
  258. PIN_LOW(_cs_port, _cs_pin);
  259. /* Send write payload command */
  260. _nrfManager->SPI_Send(NRF24L01_W_TX_PAYLOAD_MASK);
  261. /* Fill payload with data*/
  262. _nrfManager->SPI_WriteMulti(data, count);
  263. PIN_HIGH(_cs_port, _cs_pin);
  264. PIN_HIGH(_ce_port, _ce_pin);
  265. }
  266. void Nrf24L01::GetData(uint8_t* data) {
  267. PIN_LOW(_cs_port, _cs_pin);
  268. /* Send read payload command*/
  269. _nrfManager->SPI_Send(NRF24L01_R_RX_PAYLOAD_MASK);
  270. /* Read payload */
  271. _nrfManager->SPI_SendMulti(data, data, nrf_config.PayloadSize);
  272. /* Pull up chip select */
  273. PIN_HIGH(_cs_port, _cs_pin);
  274. /* Reset status register, clear RX_DR interrupt flag */
  275. writeRegister(NRF24L01_REG_STATUS, (1 << NRF24L01_RX_DR));
  276. }
  277. uint8_t Nrf24L01::DataReady(void) {
  278. uint8_t status = GetStatus();
  279. if (NRF24L01_CHECK_BIT(status, NRF24L01_RX_DR)) {
  280. return 1;
  281. }
  282. return !rxFifoEmpty();
  283. }