diff options
Diffstat (limited to 'rf_test')
| -rw-r--r-- | rf_test/rfm.c | 41 | ||||
| -rw-r--r-- | rf_test/rfm.h | 10 | ||||
| -rw-r--r-- | rf_test/send.c | 15 | ||||
| -rw-r--r-- | rf_test/spi.c | 48 | ||||
| -rw-r--r-- | rf_test/spi.h | 12 |
5 files changed, 113 insertions, 13 deletions
diff --git a/rf_test/rfm.c b/rf_test/rfm.c new file mode 100644 index 0000000..1b88773 --- /dev/null +++ b/rf_test/rfm.c @@ -0,0 +1,41 @@ +#include "rfm.h" +#include "spi.h" + +#define READ_MASK 0x7F +#define WRITE_MASK 0x80 + +static inline void send_cmd(uint8_t addr, uint8_t val) +{ + uint8_t ra, wa; + + ra = addr | READ_MASK; + wa = addr | WRITE_MASK; + + while (spi_recv(ra) != val) + spi_send(wa, val); +} + +void rfm_init(uint8_t addr) +{ + spi_init(); + + // mode: standby + packet + send_cmd(0x01, 0x44); + + // rx interrupt on DPIO0 + send_cmd(0x25, 0x40); + send_cmd(0x26, 0x07); + + // packet format: 8 bits + whitening + crc + addr filtering + send_cmd(0x37, 0x52); + send_cmd(0x38, 0x08); + send_cmd(0x38, addr); + + // disable encryption + send_cmd(0x3D, 0x02); +} + +void rfm_send(uint8_t addr, uint8_t data) +{ + +} diff --git a/rf_test/rfm.h b/rf_test/rfm.h new file mode 100644 index 0000000..d74dff7 --- /dev/null +++ b/rf_test/rfm.h @@ -0,0 +1,10 @@ +#ifndef RFM69_H +#define RFM69_H + +#include <stdint.h> + +void rfm_init(void); + +void rfm_send(uint8_t addr, uint8_t data); + +#endif /* RFM69_H */ diff --git a/rf_test/send.c b/rf_test/send.c index 370a6f4..d0a27c7 100644 --- a/rf_test/send.c +++ b/rf_test/send.c @@ -2,6 +2,8 @@ #include <avr/interrupt.h> #include <util/delay.h> +#include "spi.h" + #define LOCK_BTN PD6 #define UNLOCK_BTN PD7 @@ -9,19 +11,6 @@ #define LOCK 0xB5 #define UNLOCK 0xAE -static inline void spi_init(void) -{ - DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK); - SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); -} - -static inline void spi_send(unsigned char data) -{ - SPRD = data; - while (!(SPSR & (1 << SPIF))) - ; -} - static inline void lock(void) { spi_send(SYN); diff --git a/rf_test/spi.c b/rf_test/spi.c new file mode 100644 index 0000000..282cdce --- /dev/null +++ b/rf_test/spi.c @@ -0,0 +1,48 @@ +#include <avr/io.h> + +#include "spi.h" + +#define SS_PIN PB2 +#define SS_DDR DDRB +#define SS_PORT PORTB + +void spi_init(void) +{ + SS_DDR |= (1 << SS_PIN); + SS_PORT |= (1 << SS_PIN); + + DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK); + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); +} + +uint8_t spi_send(uint8_t data) +{ + SS_PORT |= (1 << SS_PIN); + + SPDR = data; + while (!(SPSR & (1 << SPIF))) + ; + data = SPDR; + + SS_PORT &= ~(1 << SS_PIN); + + return data; +} + +uint8_t spi_send(uint8_t addr, uint8_t data) +{ + SS_PORT |= (1 << SS_PIN); + + SPDR = addr; + while (!(SPSR & (1 << SPIF))) + ; + + SPDR = data; + while (!(SPSR & (1 << SPIF))) + ; + + SS_PORT &= ~(1 << SS_PIN); + + return data; +} + diff --git a/rf_test/spi.h b/rf_test/spi.h new file mode 100644 index 0000000..220c08f --- /dev/null +++ b/rf_test/spi.h @@ -0,0 +1,12 @@ +#ifndef SPI_H +#define SPI_H + +#include <stdint.h> + +void spi_init(void); + +uint8_t spi_recv(uint8_t addr); + +uint8_t spi_send(uint8_t addr, data); + +#endif /* SPI_H */ |
