diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2024-11-30 20:21:45 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2024-11-30 20:21:45 +0800 |
| commit | 78f6e22eced54963e21f12b47b24222be6615ad7 (patch) | |
| tree | 29bbe4bf78de79abc66d8ed26789bcaf5b034b58 /rf_test/send.c | |
| parent | dbb36ce5a45ad9526d21df392951049caad69881 (diff) | |
| download | smart-home-78f6e22eced54963e21f12b47b24222be6615ad7.tar.gz | |
wip: RFM69 SPI connection.
Diffstat (limited to 'rf_test/send.c')
| -rw-r--r-- | rf_test/send.c | 109 |
1 files changed, 52 insertions, 57 deletions
diff --git a/rf_test/send.c b/rf_test/send.c index 4b6c458..540efa4 100644 --- a/rf_test/send.c +++ b/rf_test/send.c @@ -2,81 +2,84 @@ #include <avr/interrupt.h> #include <util/delay.h> -#include "rfm.h" #include "serial.h" -#define LED_PIN PC1 -#define LOCK_BTN PD6 -#define UNLOCK_BTN PD7 +#define SPI_SS PB2 +#define SPI_SCK PB5 +#define SPI_MISO PB4 +#define SPI_MOSI PB3 -#define ADDR 0xAA -#define LOCK 0xB5 -#define UNLOCK 0xAE +#define SPI_DDR DDRB +#define SPI_PORT PORTB -static inline void lock(void) +#define STDBY 0x04 +#define LISTEN_ON 0x40 + +static inline uint8_t read_reg(uint8_t reg) { - uint8_t data[1]; + uint8_t data; + + SPI_PORT &= ~(1 << SPI_SS); - data[0] = LOCK; + SPDR = reg | 0x7F; + while (!(SPSR & (1 << SPIF))) + ; + + SPDR = 0; + while (!(SPSR & (1 << SPIF))) + ; - - serial_write_line("sending lock command..."); - rfm_sendto(ADDR, data, 1); - serial_write_line("lock command sent"); + data = SPDR; + SPI_PORT |= (1 << SPI_SS); - PORTB |= (1 << LED_PIN); - _delay_ms(500); - PORTB &= ~(1 << LED_PIN); + return data; } -static inline void unlock(void) +static inline void write_reg(uint8_t reg, uint8_t val) { - uint8_t data[1]; + serial_write_line("writing register"); - data[0] = UNLOCK; + while (read_reg(reg) != val) { + SPI_PORT &= ~(1 << SPI_SS); - serial_write_line("sending unlock command..."); - rfm_sendto(ADDR, data, 1); - serial_write_line("unlock command sent"); + SPDR = reg | 0x80; + while (!(SPSR & (1 << SPIF))) + ; - PORTB |= (1 << LED_PIN); - _delay_ms(500); - PORTB &= ~(1 << LED_PIN); -} + SPDR = val; + while (!(SPSR & (1 << SPIF))) + ; -static inline int is_btn_pressed(unsigned char btn) -{ - if (!((PIND >> btn) & 0x01)) { - _delay_us(2000); - return !((PIND >> btn) & 0x01); + SPI_PORT |= (1 << SPI_SS); } - - return 0; + + serial_write_line("writing register done"); } -static inline void pcint2_init(void) +static inline void set_mode(uint8_t mode) { - PCICR |= (1 << PCIE2); - PCMSK2 |= ((1 << PCINT22) | (1 << PCINT23)); + write_reg(0x01, mode); + while (!read_reg(0x27)) + ; } -int main(void) +static inline void rfm69_init(void) { - DDRD &= ~((1 << LOCK_BTN) | (1 << UNLOCK_BTN)); - PORTD |= (1 << LOCK_BTN) | (1 << UNLOCK_BTN); + SPI_DDR |= (1 << SPI_SS) | (1 << SPI_SCK) | (1 << SPI_MOSI); + SPI_PORT |= (1 << SPI_SS); + SPCR |= (1 << SPE) | (1 << MSTR); - DDRB |= (1 << LED_PIN); + set_mode(STDBY | LISTEN_ON); +} +int main(void) +{ serial_init(); - _delay_ms(3000); - serial_write_line("intializing RF module..."); - rfm_init(); - serial_write_line("intialized RF module"); - - pcint2_init(); - - sei(); + _delay_ms(5000); + serial_write_line("Initializing radio"); + rfm69_init(); + serial_write_line("Initialized radio"); for (;;) ; @@ -84,11 +87,3 @@ int main(void) return 0; } -ISR(PCINT2_vect) -{ - if (is_btn_pressed(LOCK_BTN)) - lock(); - - if (is_btn_pressed(UNLOCK_BTN)) - unlock(); -} |
