summaryrefslogtreecommitdiffstats
path: root/rf_test
diff options
context:
space:
mode:
Diffstat (limited to 'rf_test')
-rw-r--r--rf_test/rfm.c41
-rw-r--r--rf_test/rfm.h10
-rw-r--r--rf_test/send.c15
-rw-r--r--rf_test/spi.c48
-rw-r--r--rf_test/spi.h12
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 */