Hi I am trying to setup a RFM69W to pickup my Door Bell OOK transmitter. I have been able to get it to pick up the transmission of the bell when looking at the Data output pin DIO2 using a logic analyser. However it is not the correct data that has been transmitted. If I use a RXB6 OOK Reciever it picks up the signal perfectly. You can see this in the attached images (top is RFM69, Bottom is RXB6). Can anyone help on what I am missing. Here is the code I am using, it partially uses the library "GitHub - kobuki/RFM69OOK: A general OOK transceiver library for RFM69":
#include <SPI.h>
#include <RFM69OOKregisters.h>
#define RF69OOK_FSTEP 61.03515625
const int buttonPin = 5;
int buttonState = 0;
const byte CONFIG[][2] =
{
/* 0x01 */ { REG_OPMODE, RF_OPMODE_SEQUENCER_OFF | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY },
/* 0x02 */ { REG_DATAMODUL, RF_DATAMODUL_DATAMODE_CONTINUOUSNOBSYNC | RF_DATAMODUL_MODULATIONTYPE_OOK | RF_DATAMODUL_MODULATIONSHAPING_00 }, // no shaping
/* 0x03 */ { REG_BITRATEMSB, 0x03}, // bitrate: 32768 Hz
/* 0x04 */ { REG_BITRATELSB, 0xD1},
/* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_4}, // BW: 10.4 kHz
/* 0x1B */ { REG_OOKPEAK, RF_OOKPEAK_THRESHTYPE_PEAK | RF_OOKPEAK_PEAKTHRESHSTEP_000 | RF_OOKPEAK_PEAKTHRESHDEC_000 },
/* 0x1D */ { REG_OOKFIX, 6 }, // Fixed threshold value (in dB) in the OOK demodulator
/* 0x29 */ { REG_RSSITHRESH, 15 }, // RSSI threshold in dBm = -(REG_RSSITHRESH / 2)
/* 0x6F */ { REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA1 }, // run DAGC continuously in RX mode, recommended default for AfcLowBetaOn=0
{255, 0}
};
class ESPSafeMaster {
private:
uint8_t _ss_pin;
public:
ESPSafeMaster(uint8_t pin): _ss_pin(pin) {}
void begin() {
pinMode(_ss_pin, OUTPUT);
}
uint32_t readStatus() {
SPI.transfer(0x04);
digitalWrite(_ss_pin, LOW);
uint32_t status = (SPI.transfer(0) | ((uint32_t)(SPI.transfer(0)) << 8) | ((uint32_t)(SPI.transfer(0)) << 16) | ((uint32_t)(SPI.transfer(0)) << 24));
digitalWrite(_ss_pin, HIGH);
return status;
}
void writeStatus(uint32_t status) {
digitalWrite(_ss_pin, LOW);
SPI.transfer(0x01);
SPI.transfer(status & 0xFF);
SPI.transfer((status >> 8) & 0xFF);
SPI.transfer((status >> 16) & 0xFF);
SPI.transfer((status >> 24) & 0xFF);
digitalWrite(_ss_pin, HIGH);
}
byte readData(byte addr) {
digitalWrite(_ss_pin, LOW);
SPI.transfer(addr & 0x7F);
byte regval = SPI.transfer(0);
digitalWrite(_ss_pin, HIGH);
return regval;
}
void writeData(byte addr, byte value) {
digitalWrite(_ss_pin, LOW);
SPI.transfer(addr | 0x80);
SPI.transfer(value);
digitalWrite(_ss_pin, HIGH);
}
void setFrequencyMHz(float f)
{
setFrequency(f * 1000000);
}
void setFrequency(uint32_t freqHz)
{
// TODO: p38 hopping sequence may need to be followed in some cases
freqHz /= RF69OOK_FSTEP; // divide down by FSTEP to get FRF
writeData(REG_FRFMSB, freqHz >> 16);
writeData(REG_FRFMID, freqHz >> 8);
writeData(REG_FRFLSB, freqHz);
}
void setFixedThreshold(uint8_t threshold)
{
writeData(REG_OOKFIX, threshold);
}
int8_t readRSSI(bool forceTrigger) {
if (forceTrigger)
{
// RSSI trigger not needed if DAGC is in continuous mode
writeData(REG_RSSICONFIG, RF_RSSI_START);
while ((readData(REG_RSSICONFIG) & RF_RSSI_DONE) == 0x00); // Wait for RSSI_Ready
}
return -(readData(REG_RSSIVALUE) >> 1);
}
};
ESPSafeMaster esp(SS);
void setup() {
Serial.begin(115200);
SPI.begin();
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV32);
esp.begin();
pinMode(buttonPin, INPUT);
delay(1000);
for (byte i = 0; CONFIG[i][0] != 255; i++)
esp.writeData(CONFIG[i][0], CONFIG[i][1]);
esp.writeData(REG_OPMODE, (esp.readData(REG_OPMODE) & 0xE3) | RF_OPMODE_RECEIVER);
esp.writeData(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_CRC_OFF | RF_PACKET1_ADRSFILTERING_OFF);
esp.writeData(REG_SYNCCONFIG, RF_SYNC_OFF | RF_SYNC_FIFOFILL_MANUAL);
esp.writeData(REG_TESTLNA, RF_TESTLNA_HIGH_SENSITIVITY);
esp.writeData(REG_LNA, RF_LNA_GAINSELECT_MAXMINUS12);
esp.setFrequencyMHz(443.92);
esp.setFixedThreshold(60);
}
void loop() {
delay(5000);
Serial.println(esp.readData(REG_OPMODE), HEX);
Serial.println(esp.readData(REG_DATAMODUL), HEX);
Serial.println(esp.readData(REG_OOKPEAK), HEX);
Serial.println(esp.readData(REG_DIOMAPPING1), HEX);
Serial.println(esp.readData(REG_OOKAVG), HEX);
Serial.println(esp.readData(REG_PACKETCONFIG1), HEX);
Serial.println(RF69OOK_FSTEP * (((uint32_t)esp.readData(REG_FRFMSB)<<16) + ((uint16_t)esp.readData(REG_FRFMID)<<8) + esp.readData(REG_FRFLSB)));
Serial.println(esp.readData(REG_LNA), HEX);
Serial.println(esp.readRSSI(true));;
if (buttonState != digitalRead(buttonPin)) {
buttonState = digitalRead(buttonPin);
Serial.println(buttonState);
}
}