I implemented a simple version of what was discussed. RSSIvalue isn't read until after the RSSI flag goes HIGH. However, I think what will surprise you guys is that after doing so the RSSI value afterward (but before the next Rx cycle is started) doesn't settle onto a single value but rather continues to jump around.
Here's the Version 3.0 code:
//Version 3.0
// Sample RFM69 receiver/gateway sketch, with ACK and optional encryption
// Passes through any wireless received messages to the serial port & responds to ACKs
// It also looks for an onboard FLASH chip, if present
// Library and code by Felix Rusu - felix@lowpowerlab.com
// Get the RFM69 and SPIFlash library at: https://github.com/LowPowerLab/
#include <RFM69.h> //get it here: https://www.github.com/lowpowerlab/rfm69
#include <SPI.h>
#include <SPIFlash.h> //get it here: https://www.github.com/lowpowerlab/spiflash
#include <RFM69registers.h>
#define NODEID 1 //unique for each node on same network
#define NETWORKID 100 //the same on all nodes that talk to each other
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
//#define FREQUENCY RF69_433MHZ
//#define FREQUENCY RF69_868MHZ
#define FREQUENCY RF69_915MHZ
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W!
#define SERIAL_BAUD 250000
#ifdef __AVR_ATmega1284P__
#define LED 15 // Moteino MEGAs have LEDs on D15
#define FLASH_SS 23 // and FLASH SS on D23
#else
#define LED 9 // Moteinos have LEDs on D9
#define FLASH_SS 8 // and FLASH SS on D8
#endif
RFM69 radio;
SPIFlash flash(FLASH_SS, 0xEF30); //EF30 for 4mbit Windbond chip (W25X40CL)
bool promiscuousMode = false; //set to 'true' to sniff all packets on the same network
void setup() {
Serial.begin(SERIAL_BAUD);
delay(10);
radio.initialize(FREQUENCY,NODEID,NETWORKID);
#ifdef IS_RFM69HW
radio.setHighPower(); //only for RFM69HW!
#endif
radio.encrypt(ENCRYPTKEY);
radio.promiscuous(promiscuousMode);
radio.writeReg(REG_BITRATEMSB, RF_BITRATEMSB_300000); //set MSB bitrate to 300Kbps
radio.writeReg(REG_BITRATELSB, RF_BITRATELSB_300000); //set LSB bitrate to 300Kbps
Serial.println(F("Bitrate set to 300Kbps."));
char buff[50];
sprintf(buff, "\nListening at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
Serial.println(buff);
if (flash.initialize())
{
Serial.print("SPI Flash Init OK. Unique MAC = [");
flash.readUniqueId();
for (byte i=0;i<8;i++)
{
Serial.print(flash.UNIQUEID[i], HEX);
if (i!=8) Serial.print(':');
}
Serial.println(']');
//alternative way to read it:
//byte* MAC = flash.readUniqueId();
//for (byte i=0;i<8;i++)
//{
// Serial.print(MAC[i], HEX);
// Serial.print(' ');
//}
}
else
Serial.println("SPI Flash Init FAIL! (is chip present?)");
radio.writeReg(REG_OPMODE, (radio.readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_STANDBY); //set standby-mode
radio.writeReg(REG_RSSITHRESH, 0xFF); //set RSSI threshhold as low as possible
radio.writeReg(REG_OPMODE, (radio.readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_RECEIVER); //set Rx-mode
}
long loopCount=0;
int theRSSI;
int maxRSSI= (-125);
uint8_t regIrqFlags1;
void loop() {
loopCount++;
while (!(radio.readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_RSSI)) { //busy-wait until RSSI flag goes HIGH
}
for (int i=0;i<10; i++) {
regIrqFlags1 = radio.readReg(REG_IRQFLAGS1);
theRSSI = -(radio.readReg(REG_RSSIVALUE))/2;
if ((theRSSI > maxRSSI)) {
maxRSSI = theRSSI;
}
Serial.print(loopCount);Serial.print(F("."));Serial.print(i);
Serial.print(F(": regIrqFlags1="));Serial.print((regIrqFlags1),BIN);
Serial.print(F(", RSSI=")); Serial.println(theRSSI);
}
radio.writeReg(REG_OPMODE, (radio.readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_STANDBY); //set standby-mode
radio.writeReg(REG_OPMODE, (radio.readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_RECEIVER); //set Rx-mode
}
and here is some sample output:
302.0: regIrqFlags1=10011000, RSSI=-79
302.1: regIrqFlags1=11011000, RSSI=-99
302.2: regIrqFlags1=11011000, RSSI=-103
302.3: regIrqFlags1=11011000, RSSI=-98
302.4: regIrqFlags1=11011000, RSSI=-99
302.5: regIrqFlags1=11011000, RSSI=-103
302.6: regIrqFlags1=11011000, RSSI=-101
302.7: regIrqFlags1=11011000, RSSI=-104
302.8: regIrqFlags1=11011000, RSSI=-96
302.9: regIrqFlags1=11011000, RSSI=-104
303.0: regIrqFlags1=10011000, RSSI=-76
303.1: regIrqFlags1=11011000, RSSI=-98
303.2: regIrqFlags1=11011000, RSSI=-127
303.3: regIrqFlags1=11011000, RSSI=-105
303.4: regIrqFlags1=11011000, RSSI=-94
303.5: regIrqFlags1=11011000, RSSI=-96
303.6: regIrqFlags1=11011000, RSSI=-97
303.7: regIrqFlags1=11011000, RSSI=-101
303.8: regIrqFlags1=11011000, RSSI=-100
303.9: regIrqFlags1=11011000, RSSI=-106
304.0: regIrqFlags1=10011000, RSSI=-78
304.1: regIrqFlags1=11011000, RSSI=-95
304.2: regIrqFlags1=11011000, RSSI=-101
304.3: regIrqFlags1=11011000, RSSI=-99
304.4: regIrqFlags1=11011000, RSSI=-99
304.5: regIrqFlags1=11011000, RSSI=-98
304.6: regIrqFlags1=11011000, RSSI=-107
304.7: regIrqFlags1=11011000, RSSI=-98
304.8: regIrqFlags1=11011000, RSSI=-104
304.9: regIrqFlags1=11011000, RSSI=-101
305.0: regIrqFlags1=10011000, RSSI=-81
305.1: regIrqFlags1=11011000, RSSI=-96
305.2: regIrqFlags1=11011000, RSSI=-103
305.3: regIrqFlags1=11011000, RSSI=-99
305.4: regIrqFlags1=11011000, RSSI=-99
305.5: regIrqFlags1=11011000, RSSI=-103
305.6: regIrqFlags1=11011000, RSSI=-99
305.7: regIrqFlags1=11011000, RSSI=-102
305.8: regIrqFlags1=11011000, RSSI=-105
305.9: regIrqFlags1=11011000, RSSI=-98
Is that what you expected?