diff --git a/avrrfm.c b/avrrfm.c index b8869f2..150a4ae 100644 --- a/avrrfm.c +++ b/avrrfm.c @@ -90,13 +90,13 @@ printString("Hello Radio!\r\n"); initRadio(868600); - // sendByte(0xaa); + // sendByte(0x7b); // sendString("Hello Radio!"); - receiveByte(); while (true) { - // sendByte(0xaa); + // transmitByte(0x7b); // _delay_ms(1000); + receiveByte(); } return 0; diff --git a/nbproject/Makefile-Custom.mk b/nbproject/Makefile-Custom.mk index e52435b..15dd811 100644 --- a/nbproject/Makefile-Custom.mk +++ b/nbproject/Makefile-Custom.mk @@ -36,8 +36,8 @@ # Object Files OBJECTFILES= \ ${OBJECTDIR}/_ext/48b9ad18/avrrfm.o \ - ${OBJECTDIR}/_ext/48b9ad18/spi.o \ - ${OBJECTDIR}/rfm69.o + ${OBJECTDIR}/_ext/48b9ad18/rfm69.o \ + ${OBJECTDIR}/_ext/48b9ad18/spi.o # C Compiler Flags @@ -68,14 +68,14 @@ ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -std=c99 -o ${OBJECTDIR}/_ext/48b9ad18/avrrfm.o /home/dode/dev/avrrfm/avrrfm.c +${OBJECTDIR}/_ext/48b9ad18/rfm69.o: /home/dode/dev/avrrfm/rfm69.c + ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 + $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/_ext/48b9ad18/rfm69.o /home/dode/dev/avrrfm/rfm69.c + ${OBJECTDIR}/_ext/48b9ad18/spi.o: /home/dode/dev/avrrfm/spi.c ${MKDIR} -p ${OBJECTDIR}/_ext/48b9ad18 $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -std=c99 -o ${OBJECTDIR}/_ext/48b9ad18/spi.o /home/dode/dev/avrrfm/spi.c -${OBJECTDIR}/rfm69.o: rfm69.c - ${MKDIR} -p ${OBJECTDIR} - $(COMPILE.c) -g -DBAUD=38400 -DDRIVER=1 -DF_CPU=16000000UL -D__AVR_ATmega328P__ -D__flash=volatile -I. -o ${OBJECTDIR}/rfm69.o rfm69.c - # Subprojects .build-subprojects: diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 3f32a66..9ba90f3 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -43,12 +43,12 @@ + + + + - - - - diff --git a/rfm69.c b/rfm69.c index 5a08700..3a57708 100644 --- a/rfm69.c +++ b/rfm69.c @@ -7,8 +7,8 @@ #include "rfm69.h" -static volatile uint8_t irqFlags1; -static volatile uint8_t irqFlags2; +static volatile uint8_t irqFlags1 = 0; +static volatile uint8_t irqFlags2 = 0; /** * Selects the radio to talk to via SPI. @@ -59,6 +59,14 @@ regWrite(OP_MODE, (regRead(OP_MODE) & ~MASK_MODE) | (mode & MASK_MODE)); } +/** + * Clears the IRQ flags read from the module. + */ +static void clearIrqFlags(void) { + irqFlags1 = 0; + irqFlags2 = 0; +} + ISR(INT0_vect) { irqFlags1 = regRead(IRQ_FLAGS1); irqFlags2 = regRead(IRQ_FLAGS2); @@ -74,7 +82,13 @@ _delay_ms(5); + // turn off CLKOUT + regWrite(DIO_MAP2, 0x07); + setFreq(kHz); + // regWrite(NODE_ADDR, 0x42); + + // add initialization so both modules actually talk to each other :-) } void setFreq(uint32_t freq) { @@ -85,48 +99,62 @@ regWrite(FRF_LSB, freq >> 0); } -void sendByte(uint8_t payload) { - uint8_t opMode = regRead(OP_MODE); - printString("OpMode: "); - printByte(opMode); - - /* - regWrite(NODE_ADDR, 0xaa); - uint8_t nodeAddr = regRead(NODE_ADDR); - printString("NodeAddr: "); - printByte(nodeAddr); - */ - +void transmitByte(uint8_t payload) { // set variable packet length, turn off CRC for now - regWrite(PCK_CFG1, (regRead(PCK_CFG1) | 0x80) & ~0x10); + regWrite(PCK_CFG1, 0x80); // set TX start condition to "at least one byte in FIFO" - regWrite(FIFO_THRESH, regRead(FIFO_THRESH) | 0x80); + regWrite(FIFO_THRESH, 0x8f); - regWrite(FIFO, 1); // packet length - regWrite(FIFO, payload); // 1 byte payload + spiSel(); + transmit(FIFO | 0x80); + transmit(2); // TODO includes address? + transmit(0x42); + transmit(payload); + spiDes(); // get "PacketSent" on DIO0 (default) - regWrite(DIO_MAP1, regRead(DIO_MAP1) & ~0xc0); - - printString("Sending payload: "); - printByte(payload); + regWrite(DIO_MAP1, 0x00); setMode(MODE_TX); loop_until_bit_is_set(irqFlags2, 3); - printString("PacketSent\r\n"); + clearIrqFlags(); - // better wait a bit before going to standby? - _delay_ms(10); setMode(MODE_STDBY); + + printString("PacketSent\r\n"); } -size_t sendString(char *payload) { +uint8_t receiveByte(void) { + // set variable packet length, turn off CRC for now, address filtering + regWrite(PCK_CFG1, 0x84); + // regWrite(PCK_CFG1, 0x80); + + // get "PayloadReady" on DIO0 + regWrite(DIO_MAP1, 0x40); + + printString("Starting receiving...\r\n"); + setMode(MODE_RX); + + loop_until_bit_is_set(irqFlags2, 2); + clearIrqFlags(); + + setMode(MODE_STDBY); + + // can also read FIFO after going to standby + printByte(regRead(FIFO)); + printByte(regRead(FIFO)); + printByte(regRead(FIFO)); + + return 0; +} + +size_t transmitString(char *payload) { size_t len = fmin(strlen(payload), 64); - regWrite(PCK_CFG1, (regRead(PCK_CFG1) | 0x80) & ~0x10); - regWrite(FIFO_THRESH, regRead(FIFO_THRESH) | 0x80); + regWrite(PCK_CFG1, 0x80); + regWrite(FIFO_THRESH, 0x8f); spiSel(); transmit(FIFO); @@ -136,43 +164,17 @@ } spiDes(); + // get "PacketSent" on DIO0 (default) + regWrite(DIO_MAP1, 0x00); + printString("Sending payload...\r\n"); setMode(MODE_TX); loop_until_bit_is_set(irqFlags2, 3); + clearIrqFlags(); printString("PacketSent\r\n"); - _delay_ms(10); setMode(MODE_STDBY); return len; } - -uint8_t receiveByte(void) { - - // set variable packet length, turn off CRC for now - regWrite(PCK_CFG1, (regRead(PCK_CFG1) | 0x80) & ~0x10); - - // get "PayloadReady" on DIO0 - regWrite(DIO_MAP1, (regRead(DIO_MAP1) & ~0x80) | 0x40); - - printString("Starting receiving...\r\n"); - setMode(MODE_RX); - - loop_until_bit_is_set(irqFlags2, 2); - printString("PayloadReady\r\n"); - - // can also read FIFO after going to standby - uint8_t len = regRead(FIFO); - uint8_t payload = regRead(FIFO); - - printString("Length: "); - printUint(len); - printString("Payload: "); - printByte(payload); - - _delay_ms(10); - setMode(MODE_STDBY); - - return payload; -} \ No newline at end of file diff --git a/rfm69.h b/rfm69.h index cf42e2e..e3370c0 100644 --- a/rfm69.h +++ b/rfm69.h @@ -30,9 +30,10 @@ #define IRQ_FLAGS2 0x28 #define PCK_CFG1 0x37 #define NODE_ADDR 0x39 +#define BROAD_ADDR 0x3a #define FIFO_THRESH 0x3c -#define MASK_MODE 0x0e +#define MASK_MODE 0x1c #define MODE_SLEEP 0x00 #define MODE_STDBY 0x04 @@ -55,7 +56,14 @@ /** * Transmits one byte and prints some info. */ -void sendByte(uint8_t payload); +void transmitByte(uint8_t payload); + +/** + * Waits for one byte received and returns it. + * + * @return received byte + */ +uint8_t receiveByte(void); /** * Transmits up to 64 characters of the given string, excluding the @@ -64,9 +72,7 @@ * @param payload string to be sent * @return characters sent */ -size_t sendString(char *payload); - -uint8_t receiveByte(void); +size_t transmitString(char *payload); #endif /* RFM69_H */