Newer
Older
pyenergenie / src / energenie / drv / hrf69_test.c
/* 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 *****/