RFM69
Das RFM69 von HopeRF ist ein universelles Funkmodul für die ISM-Frequenzbänder 315, 433, 868 und 915 MHz. Eine SPI-Schnitttstelle ermöglicht die einfache Integration in Mikrocontrollerprojekte.
Ausführungen
RFM69HC(W) | RFM69H(W) | RFM69C(W) | RFM69(W) | |
---|---|---|---|---|
Sendeleistung | 20 dBm | 20 dBm | 13 dBm | 13 dBm |
Pins | 16 | 16 | 14 | 16 |
Abmessungen | 16 x 16 mm | 19,7 x 16 mm | 16 x 16 mm | 19,7 x 16 mm |
Status | aktiv | EOL | aktiv | EOL |
Die H-Variante hat eine eingebaute Endstufe für eine etwas höhrere Ausgangsleistung. Das RFM69C hat 2 Pins weniger (es fehlt der Pin DIO4), und ist Pinkompatibel zum Vorgänger RFM12B. Es kann ohne Änderung am Layout oder der Schaltung ausgetauscht werden. Lediglich die Software muss angepasst werden. Viele Module haben noch die Endung "W": "Note: This module is the Chinese distribution version of the 'RFM69HW', hence missing the 'W' tag. This module is specified as being identical in functionality and performance as well as still complaint to ETSI and FCC requirements."
Ausstattung
- Betriebsspannung 1,8 - 3,6 V
- SPI-Schnittstelle
- FSK- und OOK-Modulation (Frequency Shift Keying = Frequenzumtastung, On-Off-Keying = Amplitudentastung)
- Eingebauter Manchester de- und -encoder
- Frequenzbereiche 315, 433, 868, 915 MHz
- Max. Datenrate 300 kbit/s
- Ausgangsleistung +13 dBm (rund 20 mW)
- Stromaufnahme 45 mA senden (13 dBm), 16 mA empfangen, 0,1 µA Standby
- Integrierte Packetengine für Synchronwort, CRC, Scrambling und AES-Verschlüsselung
- 66 Byte FIFO
- Module RFM69W und RFM69CW basieren auf dem SX1231 von Semtech (Pin PA_BOOST fehlt, deswegen nur +13dB)
- Module RFM69HW und RFM69HCW basieren auf dem SX1231H von Semtech
Vergleich zum RFM12B
RFM12B | RFM69(C)W | |
---|---|---|
Versorgungsspannung | 2,2 - 3,8 V | 1,8 - 3,6 V |
Max. Datenrate | 115,2 kbit/s | 300 kbit/s |
Sendeleistung | 5 dBm | 13 dBm |
Empfindlichkeit | -105 dBm | -120 dBm |
Stromaufnahme | 22 mA/11 mA/0,3 µA | 45 mA/16 mA/0,1 µA |
FIFO Größe | 16 Bit | 66 Bytes |
Syncmustererkennung | Fest 0x2DD4 oder 0xD4 | Frei bis zu 8 Bytes |
Ansteuerung
Das Funkmodul kommuniziert über die SPI Schnittstelle mit dem µC. Im einfachsten Fall werden SCK, MISO, MOSI und NSS benötigt. Am besten führt man auch noch DIO0 zum Prozessor. Dieser Pin kann softwareseitig so konfiguriert werden, dass er anzeigt, wenn ein Paket vollständig gesendet oder ein neues Paket empfangen wurde. Ist das Modul in Minimalkonfiguration angeschlossen, müssen dazu die Statusregister RegIrqFlags1 (0x27) oder RegIrqFlags2 (0x28) ausgelesen werden.
Die SPI-Ansteuerung erfolgt im Modus CPOL=0, CPHA=0, wobei jeweils 16 Bits vom µC zum Modul geschickt werden: Das erste Bit teilt dem Modul mit, ob es sich um einen Lese- (Bitwert 0) oder Schreibvorgang (Bitwert 1) handelt, die restlichen sieben Bit des ersten Bytes geben die Registeradresse an. Mit den zweiten acht Bit wird im Schreibmodus der zu übertragende Befehl an das Modul übermittelt, im Lesemodus kann eine beliebige Bitfolge gesendet werden. Während das zweite Byte gesendet wird, empfängt der µC sowohl im Lese- als auch im Schreibmodus den Inhalt des angesprochenen Registers vor dem aktuellen Zugriff.
Werden nach dem Adressbyte mehrere Bytes empfangen oder gelesen, wird der Adresszeiger im RFM69 automatisch inkrementiert, so dass in einem einzigen Burst mehrere Register gelesen werden können. Zu beachten ist dabei, dass in Registern die mehr als 8 Bit breit sind (Frequenz, Bitrate, ...), das höchstwertige Byte zu erst geschrieben/gelesen wird (big endian). Wird das FIFO Register gelesen/geschrieben, wird der Adresszeiger nicht inkrementiert, so dass auf das FIFO in einem Burst zugegriffen werden kann.
Funktionsweise
Es gibt zwei grundsätzliche Funktionsmodi, die im Register "RegDataModule" gewählt werden:
Continuous Mode
Für die Datenübertragung vom/zum Modul werden die beiden Pins "DIO1/DCLK" und "DIO2/DATA" verwendet. An DCLK gibt das Modul den Takt vor mit dem die Datenbits an DATA geschrieben oder gelesen werden müssen.
Packet Mode
Die Packetengine des RFM69 kümmert sich um die Erzeugung und Auswertung der Preamble, des Synchronwortes, des Scramblings, der CRC und der Verschlüsselung. Im Sendebetrieb bearbeitet die eingebaute Packet Engine ein Nutzdatenpaket folgendermaßen:
Fixed Length Format
Senden
- Einstellbare Anzahl (0-65535) von Preamblebytes (0xAA) an den Anfang setzen
- Synchronwort hinzufügen (Länge zwischen 0-8 Bytes einstellbar, Synchronwort selbst ebenfalls einstellbar)
- Nutzdaten hinzufügen (Länge wird in einem Register angegeben)
- CRC hinzufügen (abschaltbar)
Empfangen
- Länge des zu empfangenden Frames wird in einem Register angegeben
Variable Length Format
Senden
- Länge des zu sendenen Frames in einem Register angeben. Die Packetengine sendet das Längenbyte automatisch vor den Nutzdaten
Empfangen
- Packetengine erkennt automatisch die Packetlänge
Unlimited Length Packet Format
Senden
- Beliebig lange Frames; Senden muss von der Software selber gestoppt werden
Empfangen
- Empfangen muss von der Software selber gestoppt werden
Interrupts
Bezeichnung | Beschreibung | Verfügbar an (Packet mode) | Verfügbar an (Cont. mode) |
---|---|---|---|
ModeReady | Beispiel | DIO5 | |
RxReady | Beispiel | Beispiel | |
TxReady | Beispiel | DIO3, DIO0 | |
PllLock | Beispiel | DIO3, DIO1, DIO0 | |
Rssi | Eingestellte Rssi-Schwelle überschritten; wird gelöscht wenn RX Modus verlassen wird | DIO0, DIO3 | DIO0, DIO3, DIO5 |
Timeout | Beispiel | DIO1 | |
AutoMode | Beispiel | DIO2 | |
SyncAddressMatch | Syncadresse empfangen | DIO0, DIO3 | DIO0, DIO1 |
FifoFull | Beispiel | DIO3, DIO1 | |
FifoNotEmpty | DIO2, DIO1 | ||
FifoLevel | DIO1 | ||
FifoOverrun | |||
PacketSent | DIO0 | ||
PayloadReady | DIO0 | ||
CrcOk | DIO0 |
Pinbelegung RFM69(H)CW
Pinnummer | Name | Richtung | Fktn. im packet mode | Fktn. im cont. mode | Pin am RFM12 |
---|---|---|---|---|---|
1 | ANA | Antennenanschluss | ANT | ||
2 | 3.3V | Versorgungsspannung | VDD | ||
3 | GND | GND | |||
4 | DIO3 | FifoFull PllLock Rssi SyncAdress TXReady |
nINT/VDI | ||
5 | MOSI | SPI Daten Eingang | SDI | ||
6 | SCK | SPI Takt | SCK | ||
7 | NSS | Chip select | nSEL | ||
8 | MISO | SPI Daten Ausgang | SDO | ||
9 | DIO0 | PllLock (FS, TX) CrcOK (RX) PayloadReady (RX) SyncAddress (RX) Rssi (RX) PacketSent (TX) TxReady (TX) |
ModeReady PllLock | ||
10 | DIO2 | FifoNotEmpty (Sleep, Stdby, FS, RX, TX) AutoMode(Sleep, Stdby, FS, RX, TX) Data (RX, TX) |
Data | FSK DATA nFFS | |
11 | DIO1 | FifoLevel (Sleep, Stdby, FS, RX, TX) FifoFull (Sleep, Stdby, FS, RX, TX) FifoNotEmpty (Sleep, Stdby, FS, RX, TX) PllLock (FS, TX) Timeout (RX) |
PllLock Dclk |
DCLK/CFIL/FFIT | |
12 | DIO5 | ModeReady ClkOut (Stdby, FS, RX, TX) Data (RX, TX) |
CLK | ||
13 | RESET | nRES | |||
14 | GND | GND |
Register
Adresse | Registername | Beschreibung | Beispiel |
---|---|---|---|
0x00 | RegFifo | Zugriff auf das FIFO Register | |
0x01 | RegOpMode | Betriebsart (senden, empfangen, ...) | 0x04 = Standby |
0x02 | RegDataModule | Modulationsart &-shaping, Packetengine | 0x00 = FSK, Packetengine aktiv |
0x03 - 0x04 | RegBitrate | = FXOSC/Bitrate | 0x1A0B = 6667 -> 4,8 kbit/s |
0x05 - 0x06 | RegFdev | Frequenzabweichung (Hub * 2) | 0x52 = 82 -> 5 kHz |
0x07 - 0x09 | RegFrf | Mittenfrequenz; RegFrf = Frequenz_in_Hz / (FXOSC / 524288) | 0xD91333 = 14226227 -> 868,300 MHz |
0x11 | RegPaLevel | Sendeleistung und Ausgangspin, muss passend zum Modultyp gewaehlt werden: PA1+2 funktionieren nur bei den *H*-Varianten, dafuer funktioniert dort PA0 nicht. | 0x12 = 18 -> 0 dBm (? stimmt das Beispiel?) ; 0x5F -> 13 dBM auf RFM69HCW ; 0x9F -> 13 dBm auf RFM69W |
0x19 | RegRxBw | Filterbandbreite | 0b01001 -> 200 kHz |
0x25 | RegDioMapping1 | DIO Funktionen | |
0x27 | RegIrqFlags1 | Statusflags (ModeReady, RxReady, TxReady, PllLock, RSSI, Timeout, AutoMode, SyncAddressMatch) | 0xD0 -> Empfänger bereit zum Datenempfang |
0x28 | RegIrqFlags2 | Statusflags (FifoFull, FifoNotEmpty, FifoLevel, FifoOverrun, PacketSent, PayloadReady, CrcOk, LowBat) | 0x06 -> Daten mit erfolgreichem CRC empfangen |
0x2C - 0x2D | RegPreamble | Preamblelänge | |
0x2E | RegSyncConfig | Synchronworteinstellungen | |
0x2F - 0x36 | RegSyncValue | Synchronwort | 0x2DD4 |
0x37 | RegPacketConfig1 | Einstellungen Packetengine | |
0x38 | RegPayloadLength | Datenpacketgröße |
Software Implementierungen
- Arduinobibliothek (C++) von LowPowerLab
- Arduinobibliothek (C++) für JeeNodes
- Linux Kerneltreiber (C) für RFM12 und RFM69
- Bibliothek (C++) für STM32
- RFM69 Anbindung in Python
- RFM69 Anbindung in Python
- RFM69 in C
Projekte
Intertechno, Brennenstuhl, FS20, und andere Funksteckdosen schalten
Hier gibt es einen Artikel wie mit einem Raspberry Pi und einem RFM69 Modul Funksteckdosen angesteuert werden: [Funksteckdosen am Raspberry Pi]
Conrad Energy Count 3000
Unter http://forum.jeelabs.net/node/3412679.html?page=1 wurde schon das Protokoll der Conrad Energy Count 3000 (baugleich mit Technoline Cost Control RC) Funk-Energiekostenmessgeräte beschrieben. Mit dem RFM69 lässt sich ein Frame des Messgerätes mit dem konfigurierbarem Synchronwortfinder bequem empfangen.
LaCrosse Temperatursensoren empfangen
Ein Raumklimalogger für den Raspberry PI mit einem RFM69CW Funkmodule
Wetterstation Davis Vantage Vue ISS
Datalogger für die Wetterstation mit Raspberry PI und RaspyRFM
Open Energy Monitor empfangen
Hardware mit RFM69
- RaspyRFM, ein Aufsteckmodul für den Raspberry Pi
- Moteino, Arduino kompatibles Board mit RFM69
- radino, Minimodul mit ATMega32u4 und RFM69
- Adafruit Feather M0, Modul mit Atmel ARM und RFM69
Themen zum RFM69 im Forum
- Thread im Forum: Wer verwendet RFM69
- RFM69 - Beispiel für Initialisierung gesucht
- RFM69 - RSSI Messung
- Simple SPI Interaktion mit dem rfm69 Modul
- RFM69 Sleep Mode
- Raspberry Pi mit RFM69 und FS20
- RFM 69 Hub, Bandbreite, Bitrate?
- RFM69 AFC Versatz auslesen?
- Umstieg von RFM22 auf RFM69
Bezugsquellen
- Seegel Systeme
- Pollin: 433 MHz / 868 MHz
- AliExpress