summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nrfm.c28
-rw-r--r--recv.c16
2 files changed, 25 insertions, 19 deletions
diff --git a/nrfm.c b/nrfm.c
index 6f27a82..afbb1d9 100644
--- a/nrfm.c
+++ b/nrfm.c
@@ -212,7 +212,7 @@ void radio_init(const uint8_t rxaddr[ADDRLEN])
write_reg(0x05, 0b01110011); /* use 2.515GHz channel */
write_reg(0x06, 0b00001110); /* set data rate to 1Mbps */
write_reg(0x1D, 0b00000100); /* enable dynamic payload length */
- write_reg(0x1C, 0b00000001); /* enable dynamic payload length for pipe 0 */
+ write_reg(0x1C, 0b00111111); /* enable dynamic payload length for all pipes */
reset_irqs();
setaddr(0x0A, rxaddr);
@@ -287,24 +287,28 @@ void radio_listen(void)
uint8_t radio_recv(char *buf, uint8_t n)
{
+ char s[5];
uint8_t rxdr, readlen, pdlen, maxlen;
+ pdlen = 0;
disable_chip();
- rxdr = read_reg(0x07) & ~(1 << 6);
- if (!rxdr) {
- uart_write_line("ERROR: RX_DR=0, abort read");
- return 0;
- }
-
pdlen = rx_pdlen();
- if (pdlen > MAXPDLEN) {
+ if (pdlen == 0) {
flush_rx();
reset_irqs();
- uart_write_line("ERROR: PDLEN > MAXPDLEN, abort read");
+ uart_write_line("ERROR: PDLEN = 0, abort read");
return 0;
}
+ // for some reason, PDLEN reads as 64 causing the below check to fail
+ //if (pdlen > MAXPDLEN) {
+ // flush_rx();
+ // reset_irqs();
+ // uart_write_line("ERROR: PDLEN > MAXPDLEN, abort read");
+ // return 0;
+ //}
+
maxlen = pdlen < n ? pdlen : n;
SPI_PORT &= ~(1 << SPI_SS);
@@ -319,9 +323,9 @@ uint8_t radio_recv(char *buf, uint8_t n)
}
SPI_PORT |= (1 << SPI_SS);
- if (pdlen != n)
- flush_rx();
+ flush_rx();
reset_irqs();
-
+ enable_chip();
+
return readlen;
}
diff --git a/recv.c b/recv.c
index 7217e47..70006dc 100644
--- a/recv.c
+++ b/recv.c
@@ -1,6 +1,7 @@
#include <stdint.h>
#include <string.h>
#include <avr/interrupt.h>
+#include <util/delay.h>
#include "nrfm.h"
#include "uart.h"
@@ -36,14 +37,17 @@ int main(void)
for (;;) {
if (rxdr) {
+ uart_write_line("IRQ recv, reading data");
n = radio_recv(buf, MAXPDLEN);
buf[n] = '\0';
rxdr = 0;
- uart_write("INFO: ");
- uart_write_line(buf);
-
- radio_listen();
- sei();
+ if (n > 0) {
+ uart_write("INFO: ");
+ uart_write_line(buf);
+ }
+ } else {
+ uart_write_line("No IRQ");
+ _delay_ms(2000);
}
}
@@ -52,7 +56,5 @@ int main(void)
ISR(RX_PCINTVEC)
{
- cli();
- uart_write_line("IRQ detected");
rxdr = 1;
}