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 ++++++++++++++++++++++++++++------------------------- recv.c | 32 +++++++++++++++++--------------- 2 files changed, 45 insertions(+), 40 deletions(-) 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; } diff --git a/recv.c b/recv.c index dc5aa44..8321fa8 100644 --- a/recv.c +++ b/recv.c @@ -13,8 +13,13 @@ #define RX_PCMSK PCMSK2 #define RX_PCINTVEC PCINT2_vect +static int rxdr = 0; + int main(void) { + uint8_t n; + char buf[MAXPDLEN + 1]; + uint8_t rxaddr[] = { 194, 178, 83 }; RX_DDR &= ~(1 << RX_PIN); @@ -29,25 +34,22 @@ int main(void) sei(); radio_listen(); - for (;;) - ; + for (;;) { + if (rxdr) { + cli(); + n = radio_recv(buf, MAXPDLEN); + buf[n] = '\0'; + uart_write("INFO: "); + uart_write_line(buf); + rxdr = 0; + sei(); + } + } return 0; } ISR(RX_PCINTVEC) { - uint8_t n; - char buf[MAXPDLEN + 1]; - - cli(); - - uart_write_line("DEBUG: Pin change IRQ"); - - n = radio_recv(buf, MAXPDLEN); - buf[n] = '\0'; - uart_write("INFO: "); - uart_write_line(buf); - - sei(); + rxdr = 1; } -- cgit v1.2.3