Cleanups and a task for rx.
1 files changed, 74 insertions(+), 49 deletions(-)

M nrf24.c
M nrf24.c +74 -49
@@ 5,10 5,6 @@ 
 #include <stdbool.h>
 #include <sam.h>
 
-#include "d2x_gpio.h"
-#include "d2x_eic.h"
-#include "d2x_common.h"
-
 #include "nrf24.h"
 
 #define RF24_CONFIG_ADDR 0x00

          
@@ 40,17 36,15 @@ 
 #define MAX_PIPE_AMOUNT 6 // pipes 0..5
 
 // -- config register --
-#define MASK_RX_DR (1 << 6)
-#define MASK_TX_DS (1 << 5)
+#define MASK_RX_DR  (1 << 6)
+#define MASK_TX_DS  (1 << 5)
 #define MASK_MAX_RT (1 << 4)
-#define EN_CRC (1 << 3)
-#define CRC0 (1 << 2)
-#define PWR_UP (1 << 1)
-#define PRIM_RX (1 << 0)
+#define EN_CRC      (1 << 3)
+#define CRC0        (1 << 2)
+#define PWR_UP      (1 << 1)
+#define PRIM_RX     (1 << 0)
 
-#define RF24_SERCOM 0
-
-// #define LOG(...)
+// #define LOG debug_printf
 #define LOG 
 
 const struct rf24_settings rf24_defaults =

          
@@ 70,12 64,7 @@ static nrf24_pin_state nrf24_cs_fn;
 
 static uint8_t rf24_addr_len = 0;
 
-#if 0
-static void rf24_cs(bool state)
-{
-  gpio_set_state(D2X_PORT_A, 5, state);
-}
-#endif
+
 static void rf24_select(struct CTL_SPI_DEVICE_s *self, int state)
 {
   if (nrf24_cs_fn) {

          
@@ 89,7 78,6 @@ static void rf24_ce(bool state)
   if (nrf24_ce_fn) {
     nrf24_ce_fn(state);
   }
-  // gpio_set_state(D2X_PORT_A, 17, state);
 }
 
 uint8_t rf24_read_register_array(uint8_t reg, uint8_t *buf, uint32_t len)

          
@@ 102,12 90,12 @@ uint8_t rf24_read_register_array(uint8_t
   ctl_spi_select_device(&nrf24_device);
   transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
   if (transfer_status != CTL_NO_ERROR) {
-    debug_printf("read_register_array, transfer error: %d\n", transfer_status);
+    LOG("read_register_array, transfer error: %d\n", transfer_status);
   }
 
   read_status = ctl_spi_read(&nrf24_device, buf, len);
   if (read_status != CTL_NO_ERROR) {
-    debug_printf("read_register_array, read error: %d\n", read_status);
+    LOG("read_register_array, read error: %d\n", read_status);
   }
 
   ctl_spi_deselect_device(&nrf24_device);

          
@@ 125,18 113,19 @@ uint8_t rf24_read_register(uint8_t reg)
   ctl_spi_select_device(&nrf24_device);
   transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
   if (transfer_status != CTL_NO_ERROR) {
-    debug_printf("read_register, transfer error: %d\n", transfer_status);
+    LOG("read_register, transfer error: %d\n", transfer_status);
+    ctl_spi_deselect_device(&nrf24_device);
+    return 0;
   }
 
   command = 0xFF;
   read_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
   if (read_status != CTL_NO_ERROR) {
-    debug_printf("rf24_read_register, read error: %d\n", read_status);
+    LOG("rf24_read_register, read error: %d\n", read_status);
   }
   ctl_spi_deselect_device(&nrf24_device);
 
   return data;
-
 }
 
 uint8_t rf24_write_register_array(uint8_t reg, const uint8_t *buf, uint32_t len)

          
@@ 149,17 138,16 @@ uint8_t rf24_write_register_array(uint8_
   ctl_spi_select_device(&nrf24_device);
   transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
   if (transfer_status != CTL_NO_ERROR) {
-    debug_printf("write_register_array, transfer error: %d\n", transfer_status);
+    LOG("write_register_array, transfer error: %d\n", transfer_status);
   }
 
   send_status = ctl_spi_write(&nrf24_device, buf, len);
   if (send_status != CTL_NO_ERROR) {
-    debug_printf("write_register_array, send error: %d\n", send_status);
+    LOG("write_register_array, send error: %d\n", send_status);
   }
   ctl_spi_deselect_device(&nrf24_device);
 
   return data;
-
 }
 
 uint8_t rf24_write_register(uint8_t reg, uint8_t val)

          
@@ 173,13 161,13 @@ uint8_t rf24_write_register(uint8_t reg,
   ctl_spi_select_device(&nrf24_device);
   transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
   if (transfer_status != CTL_NO_ERROR) {
-    debug_printf("write_register, transfer error: %d\n", transfer_status);
+    LOG("write_register, transfer error: %d\n", transfer_status);
   }
 
   command = val;
   write_status = ctl_spi_write(&nrf24_device, &command, 1);
   if (write_status != CTL_NO_ERROR) {
-    debug_printf("write_register, write error: %d\n", write_status);
+    LOG("write_register, write error: %d\n", write_status);
   }
   
   ctl_spi_deselect_device(&nrf24_device);

          
@@ 199,7 187,7 @@ uint8_t rf24_status(void)
   ctl_spi_deselect_device(&nrf24_device);
 
   if (spi_status != CTL_NO_ERROR) {
-    debug_printf("ERROR: spi_transfer(NOP) failed\n");
+    LOG("ERROR: spi_transfer(NOP) failed\n");
     return 0xFF;
   }
 

          
@@ 222,10 210,10 @@ void rf24_set_address_len(uint8_t addr_l
 {
   uint8_t len = addr_len;
   if (len < 3) {
-    debug_printf("WARNING: Len %d too small, setting it to 3\n", len);
+    LOG("WARNING: Len %d too small, setting it to 3\n", len);
     len = 3;
   } else if (len > 5) {
-    debug_printf("WARNING: Len %d too big, setting it to 5\n", len);
+    LOG("WARNING: Len %d too big, setting it to 5\n", len);
     len = 5;
   }
   (void)rf24_write_register(RF24_SETUP_ADDR_LEN_ADDR, len);

          
@@ 239,12 227,12 @@ void rf24_set_rx_addr(uint8_t pipe_no, c
   }
 
   if (pipe_no > 1) {
-    debug_printf("ERROR: rf24_set_rx_addr: pipe number %d too big, doing nothing\n", pipe_no);
+    LOG("ERROR: rf24_set_rx_addr: pipe number %d too big, doing nothing\n", pipe_no);
     return;
   }
 
   if (addr == NULL) {
-    debug_printf("ERROR: rf24_set_rx_addr: addr NULL!\n");
+    LOG("ERROR: rf24_set_rx_addr: addr NULL!\n");
     return;
   }
 

          
@@ 260,7 248,7 @@ void rf24_set_rx_payload_len(uint8_t pip
   uint8_t len = payload_len;
 
   if (pipe_no >= MAX_PIPE_AMOUNT) {
-    debug_printf("ERROR: rf24_set_rx_payload_len: invalid pipe number %d\n", pipe_no);
+    LOG("ERROR: rf24_set_rx_payload_len: invalid pipe number %d\n", pipe_no);
     return;
   }
 

          
@@ 274,11 262,11 @@ void rf24_set_rx_payload_len(uint8_t pip
 int rf24_get_rx_payload_len(uint8_t pipe_no, uint8_t* payload_len)
 {
   if (pipe_no >= MAX_PIPE_AMOUNT) {
-    debug_printf("ERROR: rf24_get_rx_payload_len: invalid pipe number %d\n", pipe_no);
+    LOG("ERROR: rf24_get_rx_payload_len: invalid pipe number %d\n", pipe_no);
     return -1;
   }
   if (payload_len == NULL) {
-    debug_printf("ERROR: rf24_get_rx_payload_len: pointer NULL\n");
+    LOG("ERROR: rf24_get_rx_payload_len: pointer NULL\n");
     return -1;
   }
 

          
@@ 302,14 290,14 @@ int rf24_get_rx_payload(char *payload, u
   transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
 
   if (transfer_status != CTL_NO_ERROR) {
-    debug_printf("rf24_get_rx_payload, transfer error: %d\n", transfer_status);
+    LOG("rf24_get_rx_payload, transfer error: %d\n", transfer_status);
     ctl_spi_deselect_device(&nrf24_device);
     return RF24_ERROR;
   }
 
   read_status = ctl_spi_read(&nrf24_device, payload, payload_len);
   if (read_status != CTL_NO_ERROR) {
-    debug_printf("rf24_get_rx_payload, read error: %d\n", read_status);
+    LOG("rf24_get_rx_payload, read error: %d\n", read_status);
     ctl_spi_deselect_device(&nrf24_device);
     return RF24_ERROR;
   }

          
@@ 435,7 423,6 @@ void rf24_flush_tx(void)
   }
 
   ctl_spi_deselect_device(&nrf24_device);
-
 }
 
 void rf24_flush_rx(void)

          
@@ 471,14 458,6 @@ void rf24_init(const struct rf24_setting
   
   ctl_spi_set_protocol(&nrf24_device, CTL_SPI_MODE0, 8, 100000, 0xFF);
 
-  // status = spi_enable(0, SPI_EDGE_FIRST_RISING);
-
-  // debug_printf("spi_enable: %d\n", status);
-
-  /* CE pin as output */
-  status = gpio_set_output(D2X_PORT_A, 17);
-  status = gpio_set_output(D2X_PORT_A, 5);
-
   rf24_ce(false);
   select_fn(1);
 

          
@@ 501,8 480,54 @@ void rf24_init(const struct rf24_setting
   LOG("rf24 channel: %d\n", s);
 }
 
+static CTL_EVENT_SET_t rf24_events;
+
 void rf24_interrupt_handler(void)
 {
   int i = 0;
   i++;
+
+  ctl_events_set_clear(&rf24_events, RX_PACKET_ARRIVED_EVENT, 0);
+}
+
+#define RX_PACKET_ARRIVED_EVENT (1 << 0)
+#define ERROR_EVENT (1 << 1)
+
+void rf24_receive_task(void *p)
+{
+  unsigned wait_status;
+  bool out = false;
+  uint8_t status;
+  unsigned char payload[33];
+  uint8_t payload_len;
+  uint8_t fifo_no;
+
+  while(1) {
+    ctl_events_set_clear(&rf24_events, 0, RX_PACKET_ARRIVED_EVENT|ERROR_EVENT);
+
+    wait_status = ctl_events_wait(CTL_EVENT_WAIT_ANY_EVENTS_WITH_AUTO_CLEAR,
+      &rf24_events, RX_PACKET_ARRIVED_EVENT|ERROR_EVENT,
+      CTL_TIMEOUT_INFINITE, 0);
+    
+  
+    
+    // read status
+    // read payload
+    // clear RX_DR
+    // read fifo status
+
+    status = rf24_status();
+    if ((status & RF24_STATUS_RX_DR) == 0) {
+      continue;
+    }
+
+    fifo_no = (status & 0b1110) >> 1;
+
+    payload_len = 0;
+    rf24_get_rx_payload(payload, 32, &payload_len);
+
+    status = RF24_STATUS_RX_DR;
+    rf24_set_status(status);
+
+  }
 }
  No newline at end of file