@@ 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