/*    mija 2008
      demo for RFM01 - RX 868MHz

      PIC 16F876A
      xtal = 4MHz
*/
#include "RX_RFM01.h"

//************************************************************************

#define SDI    PIN_B0
#define SCK    PIN_B1
#define SDO    PIN_B2      // input for PIC
#define nIRQ   PIN_B3
#define nSEL   PIN_B4
#define LED    PIN_B5

//************************************************************************
unsigned char RF_RXBUF[22];
int1 led_trg;

//************************************************************************

void RF_INIT(void)
{
   output_high(nSEL);
   output_high(SDI);
   output_low(SCK);
   input(SDO);
}

void RF_WRITE_CMD(unsigned int16 cmd)
{
   unsigned int8 i;

   output_low(SCK);
   output_low(nSEL);
   for (i=0;i<16;i++)
   {
      output_low(SCK);
      if (cmd & 0x8000) output_high(SDI);
      else output_low(SDI);
      output_high(SCK);
      cmd <<= 1;
   }
   output_low(SCK);
   output_high(nSEL);
}

int8 RF_RDFIFO(void)
{
   unsigned int8 i,Result;

   output_low(SCK);
   output_low(nSEL);
   output_low(SDI);
   for (i=0;i<16;i++)      // skip satus bits
   {
      output_high(SCK);
      output_high(SCK);
      output_low(SCK);
      output_low(SCK);
   }
   Result = 0;
   for (i=0;i<8;i++)
   {
      Result <<= 1;
      if (input(SDO)) Result |= 1;
      output_high(SCK);
      output_high(SCK);
      output_low(SCK);
      output_low(SCK);
   }
   output_high(nSEL);
   return Result;
}

void main()
{
   unsigned int8 i,j,ChkSum;

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   output_high(LED);
   delay_ms(1000);
   output_low(LED);

   RF_INIT();

   RF_WRITE_CMD(0x0000);
   RF_WRITE_CMD(0x918A);   // 868BAND,134kHz
   RF_WRITE_CMD(0xA640);   // 868Mhz
   RF_WRITE_CMD(0xC847);   // 4.8kbps
   RF_WRITE_CMD(0xC69B);   // AFC setting
   RF_WRITE_CMD(0xC42A);   // Clock recovery manualcontrol,Dig. filter, DQD=4
   RF_WRITE_CMD(0xC240);   // output 1.66Mhz
   RF_WRITE_CMD(0xC080);
   RF_WRITE_CMD(0xCE88);   // use FIFO 8bit
   RF_WRITE_CMD(0xCE8B);
   RF_WRITE_CMD(0xC081);   // open RX

   led_trg = 0;
   i = 0;
   while (1)
   {
      while (!input(nIRQ))
      {
         RF_RXBUF[i++] = RF_RDFIFO();
         putc(RF_RXBUF[i-1]);
         if (i == 18)
         {
            i = 0;
            RF_WRITE_CMD(0xCE88);
            RF_WRITE_CMD(0xCE8B);
            ChkSum = 0;
            for (j=0;j<16;j++) ChkSum += RF_RXBUF[j];
            if (ChkSum == RF_RXBUF[16])
            {
               led_trg = ~led_trg;
               output_bit(LED,led_trg);
            }
         }
      }
   }
}