summaryrefslogtreecommitdiffstats
path: root/nrfm.c
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-04-02 10:48:33 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-04-02 10:48:33 +0800
commitc354dd7324fc4d5fa25fd5f9d33408bef42ad98c (patch)
treefff3fca03c11071fcd30e13d0ff72c662b37782b /nrfm.c
parent5a5f6b4c04623dc634e7004a306ac4a9db3b9d10 (diff)
downloadavr-nrf24l01-driver-c354dd7324fc4d5fa25fd5f9d33408bef42ad98c.tar.gz
Add batching logic for payloads larger than maxpdlen.
Diffstat (limited to 'nrfm.c')
-rw-r--r--nrfm.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/nrfm.c b/nrfm.c
index d8a95c0..1105326 100644
--- a/nrfm.c
+++ b/nrfm.c
@@ -187,7 +187,7 @@ void radio_init(const uint8_t rxaddr[ADDRLEN])
void radio_sendto(const uint8_t addr[ADDRLEN], const void *msg, uint8_t n)
{
- uint8_t i, rv;
+ uint8_t i, j;
enable_tx();
reset_irqs();
@@ -196,19 +196,20 @@ void radio_sendto(const uint8_t addr[ADDRLEN], const void *msg, uint8_t n)
setaddr(0x10, addr);
setaddr(0x0A, addr);
- SPI_PORT &= ~(1 << SPI_SS);
- SPDR = 0b10100000;
- while (!(SPSR & (1 << SPIF)))
- ;
- for (i = n - 1; i >= 0; i--) {
- SPDR = ((uint8_t *)msg)[i];
+ for (i = 0; i < n; i += MAXPDLEN) {
+ SPI_PORT &= ~(1 << SPI_SS);
+ SPDR = 0b10100000;
while (!(SPSR & (1 << SPIF)))
;
+ for (j = MAXPDLEN - 1 + i; j >= i * MAXPDLEN; j--) {
+ SPDR = ((uint8_t *)msg)[j];
+ while (!(SPSR & (1 << SPIF)))
+ ;
+ }
+ SPI_PORT |= (1 << SPI_SS);
+ NRF_CE_PORT |= (1 << NRF_CE);
+ _delay_us(12);
+ NRF_CE_PORT &= ~(1 << NRF_CE);
}
- SPI_PORT |= (1 << SPI_SS);
-
- NRF_CE_PORT |= (1 << NRF_CE);
- _delay_us(12);
- NRF_CE_PORT &= ~(1 << NRF_CE);
}