nrf24.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "nrf24.h"
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <furi_hal_resources.h>
  5. #include <assert.h>
  6. #include <string.h>
  7. void nrf24_init() {
  8. furi_hal_spi_bus_handle_init(nrf24_HANDLE);
  9. furi_hal_spi_acquire(nrf24_HANDLE);
  10. furi_hal_gpio_init(nrf24_CE_PIN, GpioModeOutputPushPull, GpioPullUp, GpioSpeedVeryHigh);
  11. furi_hal_gpio_write(nrf24_CE_PIN, false);
  12. }
  13. void nrf24_deinit() {
  14. furi_hal_spi_release(nrf24_HANDLE);
  15. furi_hal_spi_bus_handle_deinit(nrf24_HANDLE);
  16. furi_hal_gpio_write(nrf24_CE_PIN, false);
  17. furi_hal_gpio_init(nrf24_CE_PIN, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
  18. }
  19. void nrf24_spi_trx(
  20. FuriHalSpiBusHandle* handle,
  21. uint8_t* tx,
  22. uint8_t* rx,
  23. uint8_t size,
  24. uint32_t timeout) {
  25. UNUSED(timeout);
  26. furi_hal_gpio_write(handle->cs, false);
  27. furi_hal_spi_bus_trx(handle, tx, rx, size, nrf24_TIMEOUT);
  28. furi_hal_gpio_write(handle->cs, true);
  29. }
  30. uint8_t nrf24_write_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t data) {
  31. uint8_t tx[2] = {W_REGISTER | (REGISTER_MASK & reg), data};
  32. uint8_t rx[2] = {0};
  33. nrf24_spi_trx(handle, tx, rx, 2, nrf24_TIMEOUT);
  34. return rx[0];
  35. }
  36. uint8_t nrf24_read_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size) {
  37. uint8_t tx[size + 1];
  38. uint8_t rx[size + 1];
  39. memset(rx, 0, size + 1);
  40. tx[0] = R_REGISTER | (REGISTER_MASK & reg);
  41. memset(&tx[1], 0, size);
  42. nrf24_spi_trx(handle, tx, rx, size + 1, nrf24_TIMEOUT);
  43. memcpy(data, &rx[1], size);
  44. return rx[0];
  45. }
  46. uint8_t nrf24_flush_rx(FuriHalSpiBusHandle* handle) {
  47. uint8_t tx[] = {FLUSH_RX};
  48. uint8_t rx[] = {0};
  49. nrf24_spi_trx(handle, tx, rx, 1, nrf24_TIMEOUT);
  50. return rx[0];
  51. }
  52. uint8_t nrf24_get_rdp(FuriHalSpiBusHandle* handle) {
  53. uint8_t rdp;
  54. nrf24_read_reg(handle, REG_RDP, &rdp, 1);
  55. return rdp;
  56. }
  57. uint8_t nrf24_status(FuriHalSpiBusHandle* handle) {
  58. uint8_t status;
  59. uint8_t tx[] = {R_REGISTER | (REGISTER_MASK & REG_STATUS)};
  60. nrf24_spi_trx(handle, tx, &status, 1, nrf24_TIMEOUT);
  61. return status;
  62. }
  63. uint8_t nrf24_set_idle(FuriHalSpiBusHandle* handle) {
  64. uint8_t status = 0;
  65. uint8_t cfg = 0;
  66. nrf24_read_reg(handle, REG_CONFIG, &cfg, 1);
  67. cfg &= 0xfc; // clear bottom two bits to power down the radio
  68. status = nrf24_write_reg(handle, REG_CONFIG, cfg);
  69. furi_hal_gpio_write(nrf24_CE_PIN, false);
  70. return status;
  71. }
  72. uint8_t nrf24_set_rx_mode(FuriHalSpiBusHandle* handle, bool nodelay) {
  73. uint8_t status = 0;
  74. uint8_t cfg = 0;
  75. nrf24_read_reg(handle, REG_CONFIG, &cfg, 1);
  76. cfg |= 0x03; // PWR_UP, and PRIM_RX
  77. status = nrf24_write_reg(handle, REG_CONFIG, cfg);
  78. furi_hal_gpio_write(nrf24_CE_PIN, true);
  79. if(!nodelay) furi_delay_ms(2000);
  80. return status;
  81. }
  82. bool nrf24_check_connected(FuriHalSpiBusHandle* handle) {
  83. uint8_t status = nrf24_status(handle);
  84. if(status != 0x00) {
  85. return true;
  86. } else {
  87. return false;
  88. }
  89. }