From 27a890cdf09df58c624047927cb97fbe97728c9c Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sun, 9 Feb 2025 17:55:18 +0800 Subject: wip. --- nrf24l01/Recv.Makefile | 43 ++++++++++++++++ nrf24l01/Send.Makefile | 44 ++++++++++++++++ nrf24l01/nrf24l01.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++ nrf24l01/radio.h | 19 +++++++ nrf24l01/recv.c | 64 +++++++++++++++++++++++ nrf24l01/send.c | 34 +++++++++++++ nrf24l01/uart.c | 33 ++++++++++++ nrf24l01/uart.h | 8 +++ 8 files changed, 379 insertions(+) create mode 100644 nrf24l01/Recv.Makefile create mode 100644 nrf24l01/Send.Makefile create mode 100644 nrf24l01/nrf24l01.c create mode 100644 nrf24l01/radio.h create mode 100644 nrf24l01/recv.c create mode 100644 nrf24l01/send.c create mode 100644 nrf24l01/uart.c create mode 100644 nrf24l01/uart.h (limited to 'nrf24l01') diff --git a/nrf24l01/Recv.Makefile b/nrf24l01/Recv.Makefile new file mode 100644 index 0000000..67ac41f --- /dev/null +++ b/nrf24l01/Recv.Makefile @@ -0,0 +1,43 @@ +CC = avr-gcc +MCU = atmega328p +TARGET = recv + +SRC = radio.c recv.c serial.c +OBJ = $(SRC:.c=.o) + +CFLAGS = -std=gnu99 +CFLAGS += -Os +CFLAGS += -Wall +CFLAGS += -mmcu=$(MCU) +CFLAGS += -DBAUD=115200 +CFLAGS += -DF_CPU=16000000UL +CFLAGS += -ffunction-sections -fdata-sections + +LDFLAGS = -mmcu=$(MCU) +LDFLAGS += -Wl,--gc-sections + +HEX_FLAGS = -O ihex +HEX_FLAGS += -j .text -j .data + +AVRDUDE_FLAGS = -p $(MCU) +AVRDUDE_FLAGS += -c arduino +AVRDUDE_FLAGS += -P /dev/cuaU0 +AVRDUDE_FLAGS += -D -U + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +elf: $(OBJ) + $(CC) $(LDFLAGS) $(OBJ) -o $(TARGET).elf + +hex: elf + avr-objcopy $(HEX_FLAGS) $(TARGET).elf $(TARGET).hex + +upload: hex + avrdude $(AVRDUDE_FLAGS) flash:w:$(TARGET).hex:i + +.PHONY: clean + +clean: + rm *.o *.elf *.hex + diff --git a/nrf24l01/Send.Makefile b/nrf24l01/Send.Makefile new file mode 100644 index 0000000..06e083b --- /dev/null +++ b/nrf24l01/Send.Makefile @@ -0,0 +1,44 @@ +CC = avr-gcc +MCU = atmega328p +TARGET = send + +SRC = radio.c send.c serial.c +OBJ = $(SRC:.c=.o) + +CFLAGS = -std=gnu99 +CFLAGS += -Os +CFLAGS += -Wall +CFLAGS += -mmcu=$(MCU) +CFLAGS += -DBAUD=115200 +CFLAGS += -DF_CPU=16000000UL +CFLAGS += -ffunction-sections -fdata-sections + +LDFLAGS = -mmcu=$(MCU) +LDFLAGS += -Wl,--gc-sections + +HEX_FLAGS = -O ihex +HEX_FLAGS += -j .text -j .data + +AVRDUDE_FLAGS = -p $(MCU) +AVRDUDE_FLAGS += -c arduino +AVRDUDE_FLAGS += -P /dev/cuaU0 +AVRDUDE_FLAGS += -D -U + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +elf: $(OBJ) + $(CC) $(LDFLAGS) $(OBJ) -o $(TARGET).elf + +hex: elf + avr-objcopy $(HEX_FLAGS) $(TARGET).elf $(TARGET).hex + +upload: hex + avrdude $(AVRDUDE_FLAGS) flash:w:$(TARGET).hex:i + +.PHONY: clean + +clean: + rm *.o *.elf *.hex + + diff --git a/nrf24l01/nrf24l01.c b/nrf24l01/nrf24l01.c new file mode 100644 index 0000000..3e92ac0 --- /dev/null +++ b/nrf24l01/nrf24l01.c @@ -0,0 +1,134 @@ +#include + +#include +#include + +#include "radio.h" +#include "uart.h" + +#define SPI_DDR DDRB +#define SPI_PORT PORTB +#define SPI_SS_PIN PB2 +#define SPI_SCK_PIN PB5 +#define SPI_MISO_PIN PB4 +#define SPI_MOSI_PIN PB3 + +#define NRF24_CE PB0 +#define NRF24_CE_DDR DDRB +#define NRF24_CE_PORT DDRB + +#define NRF24_POWER_ON_RST_DELAY 100 + +#define NRF24_REG_CONFIG 0x00 +#define NRF24_REG_EN_AA 0x01 +#define NRF24_REG_EN_RXADDR 0x02 +#define NRF24_REG_SETUP_AW 0x03 +#define NRF24_REG_SETUP_RETR 0x04 +#define NRF24_REG_RF_CH 0x05 +#define NRF24_REG_RF_SETUP 0x06 +#define NRF24_REG_STATUS 0x07 +#define NRF24_REG_OBSERVE_TX 0x08 +#define NRF24_REG_RPD 0x09 +#define NRF24_REG_RX_ADDR_P0 0x0A +#define NRF24_REG_RX_ADDR_P1 0x0B +#define NRF24_REG_RX_ADDR_P2 0x0C +#define NRF24_REG_RX_ADDR_P3 0x0D +#define NRF24_REG_RX_ADDR_P4 0x0E +#define NRF24_REG_RX_ADDR_P5 0x0F +#define NRF24_REG_TX_ADDR 0x10 +#define NRF24_REG_RX_PW_P0 0x11 +#define NRF24_REG_RX_PW_P1 0x12 +#define NRF24_REG_RX_PW_P2 0x13 +#define NRF24_REG_RX_PW_P3 0x14 +#define NRF24_REG_RX_PW_P4 0x15 +#define NRF24_REG_RX_PW_P5 0x16 +#define NRF24_REG_FIFO_STATUS 0x17 +#define NRF24_REG_DYNPD 0x1C +#define NRF24_REG_FEATURE 0x1D + +#define NRF24_NOP 0xFF +#define NRF24_R_REGISTER 0x00 +#define NRF24_W_REGISTER 0x20 +#define NRF24_R_RX_PAYLOAD 0x60 +#define NRF24_W_TX_PAYLOAD 0xA0 +#define NRF24_FLUSH_TX 0xE1 +#define NRF24_FLUSH_RX 0xE2 + +#define NRF24_MASK_RX_DR 6 +#define NRF24_MASK_TX_DS 5 +#define NRF24_MASK_MAX_RT 4 +#define NRF24_PWR_UP 1 +#define NRF24_PRIM_RX 0 +#define NRF24_ERX_P1 1 +#define NRF24_ERX_P0 0 + +static inline uint8_t read_reg(uint8_t reg) +{ + SPI_PORT &= ~(1 << SPI_SS); + SPDR = NRF24_R_REGISTER | reg; + while (!(SPSR & (1 << SPIF))) + ; + SPDR = 0; + while (!(SPSR & (1 << SPIF))) + ; + SPI_PORT |= (1 << SPI_SS); + return SPDR; +} + +static inline void write_reg(uint8_t reg, uint8_t val) +{ + SPI_PORT &= ~(1 << SPI_SS); + SPDR = NRF24_W_REGISTER | reg; + while (!(SPSR & (1 << SPIF))) + ; + SPDR = val; + while (!(SPSR & (1 << SPIF))) + ; + SPI_PORT |= (1 << SPI_SS); +} + +void radio_send(const char *data, uint8_t n) +{ +} + +uint8_t radio_recv(char *buf, uint8_t n) +{ +} + +void radio_listen(void) +{ +} + +void radio_init(const struct radio_cfg *cfg) +{ + uint8_t conf; + + SPI_DDR |= (1 << SPI_SS) | (1 << S2PI_SCK) | (1 << SPI_MOSI); + SPI_PORT |= (1 << SPI_SS); + SPCR |= (1 << SPE) | (1 << MSTR); + + NRF24_CE_DDR |= (1 << NRF24_CE); + NRF24_CE_PORT &= ~(1 << NRF24_CE); + + _delay_ms(NRF24_POWER_ON_RST_DELAY); + + // disable IRQs, set CRC encoding scheme to 2 bytes + conf = 0; + conf |= (1 << NRF24_MASK_RX_DR); + conf |= (1 << NRF24_MASK_TX_DS); + conf |= (1 << NRF24_MASK_MAX_RT); + conf |= (1 << NRF24_CRCO); + write_reg(NRF24_REG_CONFIG, conf); + + // only use data pipe 0 + conf = 0; + conf &= ~(1 << NRF24_ERX_P1); + conf |= (1 << NRF24_ERX_P0); + write_reg(NRF24_REG_EN_RXADDR, conf); + + // set address width to 3 bytes + write_reg(NRF24_REG_SETUP_AW, 0x01); + + conf = 0; + conf = +} diff --git a/nrf24l01/radio.h b/nrf24l01/radio.h new file mode 100644 index 0000000..a44d67e --- /dev/null +++ b/nrf24l01/radio.h @@ -0,0 +1,19 @@ +#ifndef RADIO_H +#define RADIO_H + +#include + +struct radio_cfg { + uint8_t netid; + uint8_t nodeid; +}; + +void radio_init(const struct radio_cfg *cfg); + +void radio_listen(void); + +void radio_send(const char *data, uint8_t n); + +uint8_t radio_recv(char *buf, uint8_t n); + +#endif diff --git a/nrf24l01/recv.c b/nrf24l01/recv.c new file mode 100644 index 0000000..1c6ac0f --- /dev/null +++ b/nrf24l01/recv.c @@ -0,0 +1,64 @@ +#include +#include + +#include "radio.h" +#include "serial.h" + +#define RX_PIN PD7 +#define RX_DDR DDRD +#define RX_PORT PORTD +#define RX_PCIE PCIE2 +#define RX_PCINT PCINT23 +#define RX_PCMSK PCMSK2 +#define RX_PCINTVEC PCINT2_vect + +#define MAX_PAYLOAD_LEN 60 + +static char *s = "hello, world!"; +static uint8_t slen = 13; + +int main(void) +{ + struct radio_cfg cfg; + + cfg.netid = 0x01; + cfg.nodeid = 0x01; + cfg.payload_len = slen; + + RX_DDR &= ~(1 << RX_PIN); + RX_PORT &= ~(1 << RX_PIN); + PCICR |= (1 << RX_PCIE); + RX_PCMSK |= (1 << RX_PCINT); + + serial_init(); + + radio_init(&cfg); + radio_listen(); + + sei(); + + for (;;) + ; + + return 0; +} + +ISR(RX_PCINTVEC) +{ + uint8_t i, n; + char buf[MAX_PAYLOAD_LEN]; + + cli(); + + serial_write_line("Detected pin change IRQ"); + + n = radio_recv(buf, MAX_PAYLOAD_LEN - 1); + buf[n] = '\0'; + + for (i = 0; i < n; i++) + serial_write(buf[i]); + serial_write('\r'); + serial_write('\n'); + + sei(); +} diff --git a/nrf24l01/send.c b/nrf24l01/send.c new file mode 100644 index 0000000..b390cf3 --- /dev/null +++ b/nrf24l01/send.c @@ -0,0 +1,34 @@ +#include +#include + +#include +#include +#include + +#include "radio.h" +#include "serial.h" + +int main(void) +{ + uint8_t n; + struct radio_cfg cfg; + const char *s = "hello, world!"; + + n = strlen(s); + + cfg.netid = 0x01; + cfg.nodeid = 0x02; + cfg.payload_len = n; + + serial_init(); + radio_init(&cfg); + radio_set_tx_power(18); + + for (;;) { + radio_send(s, n); + serial_write_line("sent"); + _delay_ms(1500); + } + + return 0; +} diff --git a/nrf24l01/uart.c b/nrf24l01/uart.c new file mode 100644 index 0000000..e5b6e05 --- /dev/null +++ b/nrf24l01/uart.c @@ -0,0 +1,33 @@ +#include +#include + +#include "uart.h" + +void uart_init(void) +{ + UBRR0H = UBRRH_VALUE; + UBRR0L = UBRRL_VALUE; +#if USE_2X + UCSR0A |= (1 << U2X0); +#else + UCSR0A &= ~(1 << U2X0); +#endif + UCSR0B = (1 << TXEN0) | (1 << RXEN0); + UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); +} + +void uart_write(char c) +{ + while (!(UCSR0A & (1 << UDRE0))) + ; + UDR0 = data; +} + +void uart_write_line(const char *s) +{ + for (; *s; s++) + serial_write(*s); + + serial_write('\r'); + serial_write('\n'); +} diff --git a/nrf24l01/uart.h b/nrf24l01/uart.h new file mode 100644 index 0000000..81db74b --- /dev/null +++ b/nrf24l01/uart.h @@ -0,0 +1,8 @@ +#ifndef UART_H +#define UART_H + +void uart_init(void); +void uart_write(char c); +void uart_write_line(const char *s); + +#endif /* UART_H */ -- cgit v1.2.3