diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2025-04-03 18:00:26 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2025-04-03 18:00:26 +0800 |
| commit | 0727556315b67d7eeff9c632f2f576427ae1491d (patch) | |
| tree | 689004fc46dc12296d5b889f49f39be83371b991 /nrfm.c | |
| parent | 50ffb4ead7293067144496894822436ba098656a (diff) | |
| download | avr-nrf24l01-driver-0727556315b67d7eeff9c632f2f576427ae1491d.tar.gz | |
Read data outside of IRQ handler.
Diffstat (limited to 'nrfm.c')
| -rw-r--r-- | nrfm.c | 53 |
1 files changed, 28 insertions, 25 deletions
@@ -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; } |
