Esempio n. 1
0
int main(int argc, char* argv[]) {
  //if (argc != 2) uso();
  int i;

  printf("Initializing...\n");
  rfm69_initialize(FREQUENCY, NODEID, NETWORKID);
  printf("Listening...\n");

  rfm69_readAllRegs();
  printf("RSSI: %i", rfm69_readRSSI(0));

  rfm69_encrypt(CRYPTPASS);
  rfm69_setPowerLevel(TXPOWER); // Max Power


  while(1) {
    rfm69_receive();
    datalen = rfm69_getDataLen();
    if(datalen > 0) {
      rssi = rfm69_getRssi();
      rfm69_getData(received);
      senderId = rfm69_getSenderId();

      char packet[8] = {0, 1, 2, 3, 4, 5, 6, 7};

      rfm69_send(senderId, (const void*) packet, 8, 0);

      printf("New packet received! ---------------\n\r");
      printf("From: %i\n\r", senderId);
      printf("Length: %i\n\r", datalen);
      printf("RSSI: %i\n\r", rssi);
      printf("Data: \n\r");
      for(i = 0; i < datalen; i++) {
        printf("%c", received[i]);
      }
      printf("\n\r------------------------------------\n\r");

      printf("A response has been sent\n\r");
    }
  }

}
Esempio n. 2
0
int rfm69_initialize(char freqBand, char nodeID, char networkID) {
char i;
const char CONFIG[][2] = {
    // Operation Mode: Sequencer ON, Listen Mode OFF, Standby mode
    /* 0x01 */ { REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY },
    // Data Module: Packet mode, FSK Modulation, No Shaping (Might use Gaussian Filter)
    /* 0x02 */ { REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00 },
    // Bit Rate More Significant Byte: 4.8 Kbps
    /* 0x03 */ { REG_BITRATEMSB, RF_BITRATEMSB_55555},
    // Bit Rate Less Significant Byte: 4.8 Kbps
    /* 0x04 */ { REG_BITRATELSB, RF_BITRATELSB_55555},
    // Frequency Deviation MSB: 5 KHz, (FDEV + BitRate/2 <= 500 KHz)
    /* 0x05 */ { REG_FDEVMSB, RF_FDEVMSB_50000},
    // Frequency Deviation LSB: 5KHz, (FDEV + BitRate/2 <= 500 KHz)
    /* 0x06 */ { REG_FDEVLSB, RF_FDEVLSB_50000},
    // RF Carrier Frequency MSB: Depending on the first parameter
    /* 0x07 */ { REG_FRFMSB, (freqBand==RF69_315MHZ ? RF_FRFMSB_315 : (freqBand==RF69_433MHZ ? RF_FRFMSB_433 : (freqBand==RF69_868MHZ ? RF_FRFMSB_868 : RF_FRFMSB_915))) },
    /* 0x08 */ { REG_FRFMID, (freqBand==RF69_315MHZ ? RF_FRFMID_315 : (freqBand==RF69_433MHZ ? RF_FRFMID_433 : (freqBand==RF69_868MHZ ? RF_FRFMID_868 : RF_FRFMID_915))) },
    /* 0x09 */ { REG_FRFLSB, (freqBand==RF69_315MHZ ? RF_FRFLSB_315 : (freqBand==RF69_433MHZ ? RF_FRFLSB_433 : (freqBand==RF69_868MHZ ? RF_FRFLSB_868 : RF_FRFLSB_915))) },

    // looks like PA1 and PA2 are not implemented on RFM69W, hence the max output power is 13dBm
    // +17dBm and +20dBm are possible on RFM69HW
    // +13dBm formula: Pout=-18+OutputPower (with PA0 or PA1**)
    // +17dBm formula: Pout=-14+OutputPower (with PA1 and PA2)**
    // +20dBm formula: Pout=-11+OutputPower (with PA1 and PA2)** and high power PA settings (section 3.3.7 in datasheet)
    /* 0x11 */ { REG_PALEVEL, RF_PALEVEL_PA0_ON | RF_PALEVEL_PA1_ON | RF_PALEVEL_PA2_ON | RF_PALEVEL_OUTPUTPOWER_11111},
    /* 0x13 */ { REG_OCP, RF_OCP_ON | RF_OCP_TRIM_95 }, //over current protection (default is 95mA)

    ///* 0x18*/ { REG_LNA,  RF_LNA_ZIN_200 | RF_LNA_CURRENTGAIN }, //as suggested by mav here: http://lowpowerlab.com/forum/index.php/topic,296.msg1571.html

    // RXBW defaults are { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_5} (RxBw: 10.4khz)
    /* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2 }, //(BitRate < 2 * RxBw)
    /* 0x25 */ { REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 }, //DIO0 is the only IRQ we're using
    /* 0x29 */ { REG_RSSITHRESH, 220 }, //must be set to dBm = (-Sensitivity / 2) - default is 0xE4=228 so -114dBm
    ///* 0x2d */ { REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } // default 3 preamble bytes 0xAAAAAA
    /* 0x2e */ { REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0 },
    /* 0x2f */ { REG_SYNCVALUE1, 0x2D },      //attempt to make this compatible with sync1 byte of RFM12B lib
    // Network ID on Syncvalue2
    /* 0x30 */ { REG_SYNCVALUE2, networkID },
    /* 0x37 */ { REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_OFF | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF },
    /* 0x38 */ { REG_PAYLOADLENGTH, 66 }, //in variable length mode: the max frame size, not used in TX
    //* 0x39 */ { REG_NODEADRS, nodeID }, //turned off because we're not using address filtering
    /* 0x3C */ { REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_FIFOTHRESH_VALUE }, //TX on FIFO not empty
    /* 0x3d */ { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF }, //RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent)
    /* 0x6F */ { REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0 }, // run DAGC continuously in RX mode, recommended default for AfcLowBetaOn=0
    {255, 0}
  };

  // Initialize SPI device 0
  if(wiringPiSPISetup(SPI_DEVICE, SPI_SPEED) < 0) {
    fprintf(stderr, "Unable to open SPI device\n\r");
    exit(1);
  }

  do rfm69_writeReg(REG_SYNCVALUE1, 0xaa); while(rfm69_readReg(REG_SYNCVALUE1) != 0xaa);
  do rfm69_writeReg(REG_SYNCVALUE1, 0x55); while(rfm69_readReg(REG_SYNCVALUE1) != 0x55);

  for(i = 0; CONFIG[i][0] != 255; i++)
    rfm69_writeReg(CONFIG[i][0], CONFIG[i][1]);

  // Encryption is persistent between resets and can trip you up during debugging.
  // Disable it during initialization so we always start from a known state.
  rfm69_encrypt(0);

  rfm69_setMode(RF69_MODE_STANDBY);

  // Is this done on function?
  while ((rfm69_readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00);

  _address = nodeID;

  return 0;  // No error
}