summaryrefslogtreecommitdiffstats
path: root/nrfm.c
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-04-11 13:25:11 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-04-11 13:25:11 +0800
commit52112f19821f6f667c51f3ac2c68da41365e0b43 (patch)
tree7747b55922d76d435ea2b528f87201950a14b5e2 /nrfm.c
parent7b9d39da831a6454eb0eb57bbfa86ff2d615d287 (diff)
downloadavr-nrf24l01-driver-52112f19821f6f667c51f3ac2c68da41365e0b43.tar.gz
wip: some packets are being exchanged, after about 3 packets they fail (WDT)
Diffstat (limited to 'nrfm.c')
-rw-r--r--nrfm.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/nrfm.c b/nrfm.c
index 84f790a..de9d132 100644
--- a/nrfm.c
+++ b/nrfm.c
@@ -79,6 +79,22 @@ static inline void read_reg_bulk(uint8_t reg, uint8_t *data, uint8_t n)
SPI_PORT |= (1 << SPI_SS);
}
+static inline void write_reg_bulk(uint8_t reg, const uint8_t *data, uint8_t n)
+{
+ int i;
+
+ SPI_PORT &= ~(1 << SPI_SS);
+ SPDR = (reg & 0x1F) | W_REGISTER;
+ while (!(SPSR & (1 << SPIF)))
+ ;
+ for (i = 0; i < n; i++) {
+ SPDR = data[i];
+ while (!(SPSR & (1 << SPIF)))
+ ;
+ }
+ SPI_PORT |= (1 << SPI_SS);
+}
+
static inline void setaddr(uint8_t reg, const uint8_t addr[ADDRLEN])
{
int i;
@@ -221,11 +237,18 @@ void radio_init(const uint8_t rxaddr[ADDRLEN])
setaddr(0x0A, rxaddr);
}
+void radio_listen(void)
+{
+ disable_chip();
+ rx_mode();
+ enable_chip();
+}
+
void radio_sendto(const uint8_t addr[ADDRLEN], const char *msg, uint8_t n)
{
char s[4];
int i, imax;
- uint8_t cfg, rv, maxrt, txds;
+ uint8_t cfg, rv, maxrt, txds, rxaddr[ADDRLEN];
disable_chip();
@@ -235,6 +258,7 @@ void radio_sendto(const uint8_t addr[ADDRLEN], const char *msg, uint8_t n)
flush_tx();
reset_irqs();
+ read_reg_bulk(0x0A, rxaddr, ADDRLEN);
setaddr(0x10, addr);
setaddr(0x0A, addr);
@@ -276,14 +300,9 @@ void radio_sendto(const uint8_t addr[ADDRLEN], const char *msg, uint8_t n)
uart_write_line("ERROR: sendto() failed: MAX_RT");
}
+ // restore config, typically rx mode
write_reg(0x00, cfg);
- _delay_ms(MODCHG_DELAY_MS);
-}
-
-void radio_listen(void)
-{
- disable_chip();
- rx_mode();
+ write_reg_bulk(0x0A, rxaddr, ADDRLEN);
enable_chip();
}