/* hrf69_test.c D.J.Whale 03/04/2016
*
* A simple exerciser for the HopeRF RFM69 radio
*/
/***** INCLUDES *****/
#include <stdio.h>
//#include <stdlib.h>
#include "system.h"
#include "delay.h"
#include "gpio.h"
#include "spi.h"
#include "hrf69.h"
#include "trace.h"
/***** CONFIGURATION *****/
/* Only define this if you are running mac/pc/pi,
* arduino will have a different console wrapper to drive tests, probably
*/
#define HRF69_TEST
/* GPIO assignments for Arduino Pro Micro */
#define RESET 2
#define CS 3
#define MOSI 4
#define MISO 5
#define SCLK 6
/***** FUNCTION PROTOTYPES *****/
static void reset(void);
void hrf_test_rw(void);
void hrf_test_send_ook(void);
#if defined(HRF69_TEST)
int main(int argc, char **argv)
{
hrf_test_rw();
//TODO: Can't test this until real radio added,
// polling means flags will never clear
//hrf_test_send_ook();
return 0;
}
#endif
// Reset is really a function of how the Energenie radio is wired up to the Pi or
// Arduino, so it will appear in the 'radio' module. It is here for testing convenience.
static void reset(void)
{
SPI_CONFIG radioConfig = {CS, SCLK, MOSI, MISO, SPI_SPOL0, SPI_CPOL0, SPI_CPHA0};
//TSETTLE, THOLD, TFREQ};
spi_init(&radioConfig);
gpio_setout(RESET);
gpio_low(RESET);
delayus(100);
gpio_high(RESET);
delayms(150);
gpio_low(RESET);
delayus(100);
}
extern void gpio_mock_set_in(uint8_t g, uint8_t v);
// write a register and read it back
#define TX 0x04
#define RX 0x0C
void hrf_test_rw(void)
{
uint8_t result;
reset();
gpio_mock_set_in(MISO, 1); // force return bus high to test
//printf("** write:%02X\n", (unsigned int) HRF_MODE_TRANSMITER);
TRACE_OUTS("** write:");
TRACE_OUTN(TX);
TRACE_NL();
HRF_writereg(HRF_ADDR_OPMODE, TX);
result = HRF_readreg(0x00);
//printf("** read:%02X\n", (unsigned int) result);
TRACE_OUTS("** read:");
TRACE_OUTN(result);
TRACE_NL();
//printf("** write:%02X\n", (unsigned int) HRF_MODE_RECEIVER);
TRACE_OUTS("** write:");
TRACE_OUTN(RX);
TRACE_NL();
HRF_writereg(HRF_ADDR_OPMODE, RX);
result = HRF_readreg(0x00);
//printf("** read:%02X\n", (unsigned int) result);
TRACE_OUTS("** read:");
TRACE_OUTN(result);
TRACE_NL();
spi_finished();
}
HRF_CONFIG_REC config_OOK[] = {
{HRF_ADDR_REGDATAMODUL, HRF_VAL_REGDATAMODUL_OOK}, // modulation scheme OOK
{HRF_ADDR_FDEVMSB, 0}, // frequency deviation -> 0kHz
{HRF_ADDR_FDEVLSB, 0}, // frequency deviation -> 0kHz
{HRF_ADDR_FRMSB, HRF_VAL_FRMSB433}, // carrier freq -> 433.92MHz 0x6C7AE1
{HRF_ADDR_FRMID, HRF_VAL_FRMID433}, // carrier freq -> 433.92MHz 0x6C7AE1
{HRF_ADDR_FRLSB, HRF_VAL_FRLSB433}, // carrier freq -> 433.92MHz 0x6C7AE1
{HRF_ADDR_RXBW, HRF_VAL_RXBW120}, // channel filter bandwidth 120kHz
{HRF_ADDR_BITRATEMSB, 0x40}, // 1938b/s
{HRF_ADDR_BITRATELSB, 0x80}, // 1938b/s
{HRF_ADDR_PREAMBLELSB, 0}, // preamble size LSB 3
{HRF_ADDR_SYNCCONFIG, HRF_VAL_SYNCCONFIG4}, // Size of the Sync word = 4 (SyncSize + 1)
{HRF_ADDR_SYNCVALUE1, HRF_VAL_SYNCVALUE1OOK}, // sync value 1
{HRF_ADDR_SYNCVALUE2, 0}, // sync value 2
{HRF_ADDR_SYNCVALUE3, 0}, // sync value 3
{HRF_ADDR_SYNCVALUE4, 0}, // sync value 4
{HRF_ADDR_PACKETCONFIG1, HRF_VAL_PACKETCONFIG1OOK}, // Fixed length, no Manchester coding, OOK
{HRF_ADDR_PAYLOADLEN, HRF_VAL_PAYLOADLEN_OOK}, // Payload Length
{HRF_ADDR_FIFOTHRESH, HRF_VAL_FIFOTHRESH30} // Condition to start packet transmission: wait for 30 bytes in FIFO
};
// A 'go for broke' OOK payload sender
void hrf_test_send_ook(void)
{
reset();
gpio_mock_set_in(MISO, 1); // force return bus high to test
HRF_config(config_OOK, sizeof(config_OOK));
HRF_change_mode(HRF_MODE_TRANSMITTER);
static uint8_t payload[] = {
// Preamble
0x00, 0x80, 0x00, 0x00, 0x00,
// Encoded 20 bit address
0x8E, 0xE8, 0xEE, 0x88, 0x8E, 0xE8, 0xEE, 0x88, 0x8E, 0xE8,
// Command bits
0xEE, 0xE8 // 1110 = E = switch 1 off
//0xEE, 0xEE // 1111 = F = switch 1 on
};
HRF_pollreg(HRF_ADDR_IRQFLAGS1, HRF_MASK_MODEREADY|HRF_MASK_TXREADY, HRF_MASK_MODEREADY|HRF_MASK_TXREADY);
HRF_writefifo_burst(payload, sizeof(payload));
for (int i=0; i<8; i++)
{
HRF_pollreg(HRF_ADDR_IRQFLAGS2, HRF_MASK_FIFOLEVEL, 0);
HRF_writefifo_burst(payload, sizeof(payload));
}
HRF_pollreg(HRF_ADDR_IRQFLAGS2, HRF_MASK_PACKETSENT, HRF_MASK_PACKETSENT); // wait for Packet sent
uint8_t irqflags2 = HRF_readreg(HRF_ADDR_IRQFLAGS2);
TRACE_OUTS("irqflags2:");
TRACE_OUTN(irqflags2);
TRACE_NL();
if (((irqflags2 & HRF_MASK_FIFONOTEMPTY) != 0) || ((irqflags2 & HRF_MASK_FIFOOVERRUN) != 0))
{
TRACE_FAIL("Failed to send repeated payload");
}
spi_finished();
}
/***** END OF FILE *****/