summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-04-03 18:00:26 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-04-03 18:00:26 +0800
commit0727556315b67d7eeff9c632f2f576427ae1491d (patch)
tree689004fc46dc12296d5b889f49f39be83371b991
parent50ffb4ead7293067144496894822436ba098656a (diff)
downloadavr-nrf24l01-driver-0727556315b67d7eeff9c632f2f576427ae1491d.tar.gz
Read data outside of IRQ handler.
-rw-r--r--nrfm.c53
-rw-r--r--recv.c32
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;
}