From 0727556315b67d7eeff9c632f2f576427ae1491d Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Thu, 3 Apr 2025 18:00:26 +0800 Subject: Read data outside of IRQ handler. --- nrfm.c | 53 ++++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 25 deletions(-) (limited to 'nrfm.c') diff --git a/nrfm.c b/nrfm.c index fb3a0fa..f34eb83 100644 --- a/nrfm.c +++ b/nrfm.c @@ -279,37 +279,40 @@ void radio_listen(void) uint8_t radio_recv(char *buf, uint8_t n) { - uint8_t rv, readlen, pdlen, maxlen; + uint8_t rxdr, readlen, pdlen, maxlen; - readlen = 0; disable_chip(); - rv = read_reg(0x07); - if (rv & ~(1 << 6)) { - pdlen = rx_pdlen(); - maxlen = pdlen < n ? pdlen : n; - - if (pdlen <= MAXPDLEN) { - SPI_PORT &= ~(1 << SPI_SS); - SPDR = 0b01100001; - while (!(SPSR & (1 << SPIF))) - ; - for (readlen = 0; readlen < maxlen; readlen++) { - SPDR = NRF_NOP; - while (!(SPSR & (1 << SPIF))) - ; - buf[readlen] = SPDR; - } - SPI_PORT |= (1 << SPI_SS); - if (pdlen != n) - flush_rx(); - } else { - flush_rx(); - readlen = 0; - } + rxdr = read_reg(0x07) & ~(1 << 6); + if (!rxdr) { + uart_write_line("DEBUG: RX_DR=0, abort read"); + return 0; + } + pdlen = rx_pdlen(); + 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); + SPDR = 0b01100001; + while (!(SPSR & (1 << SPIF))) + ; + for (readlen = 0; readlen < maxlen; readlen++) { + SPDR = NRF_NOP; + while (!(SPSR & (1 << SPIF))) + ; + buf[readlen] = SPDR; + } + SPI_PORT |= (1 << SPI_SS); + + if (pdlen != n) + flush_rx(); + reset_irqs(); + return readlen; } -- cgit v1.2.3