From e34917da814c2cdb3710553d479df0aed3979e28 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 6 Apr 2025 12:01:05 +0800 Subject: Recv data reliably, but PDLEN value is wrong. --- nrfm.c | 28 ++++++++++++++++------------ recv.c | 16 +++++++++------- 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 #include #include +#include #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; } -- cgit v1.2.3