I have a somewhat unusual application for RFM69 -- trying to use it to receive zwave signals to troubleshoot various problems.
Firstly, I have to say that I already build a zwave receiver using a CC1110 development board two years ago, and it works reasonably well. It appears that it can see all the frames on the air that the controller does withing a 30'-40' radius. However, the board is not very portable, so I thought about using a moteino or an arduino pro either of which can be placed in a small box with a battery.
Programming an RFM69 was not too hard -- I just had to subclass a couple of functions, mainly to be able to receive unlimited length packets since the zwave frame has its length byte in position 7 as opposed to the standard variable length location than the RFM69 expects in position 0.
However, I've encountered two issues:
1. The RSSI settings below -90 cause too many false positives (as matched by the sync word) which is problematic because a typical zwave signal is usually about -85 to -90 at about 25' from the source and some walls. Interestingly and encouragingly, RSSI is about the same as indicated by my old probe at the same location. The old probe has about a couple of false positives a day at a -100 RSSI threshold, though, so I have a much better measurement safety margin with it than with the RFM69.
2. The Manchester encoding used for the old R1 zwave devices does not quite work. The datasheet is vague about it, but I suspect that Manchester simply does not work with unlimited length packets on the RFM69. The CC1110 decodes the Manchester frames just fine. This problem is less important because I have only 3 R1 zwave device but still unpleasant.
I've spent probably 95% time trying to improve signal selectivity with no success. I tried changing LNA settings, RxBw, AutoAfc, preamble length to no avail. Afc is especially tricky as it apparently puts the RFM69 chip into a state that only a power reset can cure it.
Here are my best performing settings. If you have any helpful comments, they'll be appreciated:
// Bitrate 40K:
radio.writeReg(0x03, 0x03);
radio.writeReg(0x04, 0x20);
// Deviation 20K:
radio.writeReg(0x05, 0x01);
radio.writeReg(0x06, 0x48);
// Zwave frequency:
radio.setFrequency(908400000); //908.4 MHz
// RxBw filter:
radio.writeReg(0x19, 0x4A); // 100 kHz *
// RSSI threshold -90:
radio.writeReg(0x29, 0xB4);
// Preamble size 8:
radio.writeReg(0x2D, 0x8);
// Two byte sync:
radio.writeReg(0x2E, 0x88);
// Sync word:
radio.writeReg(0x2F, 0xAA);
radio.writeReg(0x30, 0x0F);
// Packet cfg1 (Fixed length, no CRC):
radio.writeReg(0x37, 0x0);
// Payload length -- unlimited:
radio.writeReg(0x38, 0x0);
The rest of the settings are the library defaults.