@@ 15,7 15,7 @@
#define RF24_RX_ADDR_P0_ADDR 0x0A // location of pipe 0 rx address
#define RF24_RX_ADDR_P1_ADDR 0x0B // location of pipe 1 rx address
#define RF24_RX_PW_P0_ADDR 0x11 // Payload len of (rx) pipe 0
-
+#define RF24_FIFO_STATUS_ADDR 0x17
#define RF24_TX_ADDR_ADDR 0x10 // location of tx address
@@ 44,8 44,12 @@
#define PWR_UP (1 << 1)
#define PRIM_RX (1 << 0)
-// #define LOG debug_printf
-#define LOG
+#ifdef NDEBUG
+#define LOG
+#else
+#define LOG debug_printf
+#endif
+// #define LOG
const struct rf24_settings rf24_defaults =
{
@@ 170,7 174,7 @@ uint8_t rf24_write_register(uint8_t reg,
if (write_status != CTL_NO_ERROR) {
LOG("write_register, write error: %d\n", write_status);
}
-
+
ctl_spi_deselect_device(&nrf24_device);
LOG("rf24_write_register ok\n");
@@ 200,6 204,11 @@ void rf24_set_status(uint8_t value)
(void)rf24_write_register(RF24_STATUS_ADDR, value);
}
+uint8_t rf24_get_fifo_status(void)
+{
+ return rf24_read_register(RF24_FIFO_STATUS_ADDR);
+}
+
void rf24_set_channel(uint8_t ch)
{
uint8_t s;
@@ 276,7 285,7 @@ int rf24_get_rx_payload_len(uint8_t pipe
return 0;
}
-int rf24_get_rx_payload(char *payload, uint8_t payload_max_len, uint8_t *len)
+int rf24_get_rx_payload(unsigned char *payload, uint8_t payload_max_len, uint8_t *len)
{
CTL_STATUS_t transfer_status, read_status;
uint8_t data, command;
@@ 324,7 333,7 @@ int rf24_set_tx_payload(const char *payl
transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
if (transfer_status != CTL_NO_ERROR) {
LOG("rf24_set_tx_payload, transfer error: %d\n", transfer_status);
-
+
ctl_spi_deselect_device(&nrf24_device);
return RF24_ERROR;
}
@@ 414,6 423,7 @@ void rf24_receive_task_code(void *p);
void rf24_start_listening_with_callback(nrf24_payload_handler payload_handler)
{
rf24_start_listening();
+ nrf24_payload_handler_fn = payload_handler;
if (!nrf24_listening_task_running) {
nrf24_listening_task_running = true;
memset(listening_task_stack, 0xcd, sizeof(listening_task_stack));
@@ 472,11 482,11 @@ void rf24_init(const struct rf24_setting
nrf24_listening_task_running = false;
ctl_spi_attach_device(spi_bus, &nrf24_device);
-
+
nrf24_device.select = rf24_select;
nrf24_cs_fn = select_fn;
nrf24_ce_fn = ce_fn;
-
+
ctl_spi_set_protocol(&nrf24_device, CTL_SPI_MODE0, 8, 100000, 0xFF);
rf24_ce(false);
@@ 492,7 502,7 @@ void rf24_init(const struct rf24_setting
}
s = rf24_read_register_array(0x0A, addr, 5);
- LOG("rf24 default address: %02x %02x %02x %02x %02x\n", addr[0], addr[1], addr[2], addr[3], addr[4]);
+ LOG("rf24 default address: %02x %02x %02x %02x %02x\n", addr[0], addr[1], addr[2], addr[3], addr[4]);
s = rf24_write_register(0x05, 76);
LOG("channel write status: %d\n", s);
@@ 528,11 538,16 @@ void rf24_receive_task_code(void *p)
while(1) {
ctl_events_set_clear(&rf24_events, 0, RX_PACKET_ARRIVED_EVENT|ERROR_EVENT);
+ LOG("%ld RF24 RX task: waiting for data...\n", ctl_get_current_time());
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);
+
+ LOG("wait_status: %x\n", wait_status);
+
if (wait_status & RX_PACKET_ARRIVED_EVENT) {
+ out = false;
while (!out) {
// read status
// read payload
@@ 540,6 555,7 @@ void rf24_receive_task_code(void *p)
// read fifo status
status = rf24_status();
+ LOG("rf24_status: %x\n", status);
if ((status & RF24_STATUS_RX_DR) == 0) {
out = true;
break;
@@ 554,7 570,9 @@ void rf24_receive_task_code(void *p)
rf24_set_status(status);
if (nrf24_payload_handler_fn) {
- nrf24_payload_handler_fn(fifo_no, payload);
+ nrf24_payload_handler_fn(fifo_no, payload, 32);
+ } else {
+ LOG("warning: no payload handler\n");
}
}
}
@@ 12,11 12,13 @@
#define RF24_STATUS_TX_FULL (1 << 0) // TX FIFO full
#define RF24_STATUS_MASK 0b01111111 // bits 0..6 are used in status
+#define RF24_FIFO_STATUS_RX_FULL (1 << 1) // RX FIFO full
+
#define RF24_OK 0
#define RF24_ERROR -1
typedef void (*nrf24_pin_state)(int state);
-typedef void (*nrf24_payload_handler)(uint8_t fifo_no, const char *payload);
+typedef void (*nrf24_payload_handler)(uint8_t fifo_no, const unsigned char *payload, uint8_t payload_len);
struct rf24_settings {
bool data_received_interrupt;
@@ 34,9 36,10 @@ void rf24_init(const struct rf24_setting
void rf24_get_config(struct rf24_settings* config);
uint8_t rf24_status(void);
void rf24_set_status(uint8_t value);
+uint8_t rf24_get_fifo_status(void);
void rf24_set_rx_addr(uint8_t pipe_no, const uint8_t *addr, uint8_t addr_len);
void rf24_set_rx_payload_len(uint8_t pipe_no, uint8_t payload_len);
-int rf24_get_rx_payload(char *payload, uint8_t payload_max_len, uint8_t *len);
+int rf24_get_rx_payload(unsigned char *payload, uint8_t payload_max_len, uint8_t *len);
int rf24_set_tx_payload(const char *payload, uint8_t payload_len);
void rf24_enable_pipes(uint8_t pipe_mask);
void rf24_set_tx_addr(const uint8_t *addr, uint8_t addr_len);