RFM69CW, wer kann helfen?

OP #5047013
Lesenswert?

Hallo,

ich versuche seit geraumer Zeit eine Kommunikation zwischen zwei 
RFM69CW, bzw. auch RFM69 und RFM12 hinzubekommen. Leider keinerlei 
Empfang. Zwei RFM12 sind kein Problem!
Ich meine zwar, daß alle Register die ich auslese richtig sind, aber 
irgend etwas ist ja offensichtlich falsch. Wer hat Erfahrung und kann 
raten?
Gast #5047052
Lesenswert?

Ja, schon mal erfolgreich gemacht. Aber lang her.

Wichtig ist wohl, beim RFM69 das Whitening und CRC auszuschalten.

Des weiteren muss der RFM12 eine korrekte Preamble schicken, sonst 
springt der RX beim RFM69 nicht an.

Zeig mal Code und Initialisierung...
#5047117
Lesenswert?

Hmmm, da sind noch zu viel Unbekannte.
- feste Paketlänge?
- Interrupt oder Polling?
- RSSI-Schwelle?

...und ja: auch mich schreckt das Lesen von langem ASM-Code ab.

Welche Status-Register sind im "Status.txt" (Ich vermute die vom RFM69)

Beim RFM69 würde ich setzen:
Register 0x2E = 0x88 // REG_SYNCCONFIG = RF_SYNC_ON | RF_SYNC_SIZE_2
Register 0x2F = 0x2D // REG_SYNCVALUE1 = 0x2D
Register 0x30 = 0xD4 // REG_SYNCVALUE2 = networkID
Register 0x37 = 0x80 // REG_PACKETCONFIG1 = RF_PACKET1_FORMAT_VARIABLE
Register 0x3D = 0x12 // REG_PACKETCONFIG2 = 
RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON

Ansonsten hatte ich mir geholfen, in dem ich beim RFM69 auf 
Continuous-RX gestellt hatte und
den Empfangs-FIFO dauerhaft ausgeprinted habe.

Nützt Dir C++ - Code etwas?
OP #5047140
Lesenswert?

Peter S. schrieb:
> Welche Status-Register sind im "Status.txt" (Ich vermute die vom RFM69)

richtig vermutet.

> Nützt Dir C++ - Code etwas?

Ich kann einigermaßen nachvollziehen was passiert, aber selbst schreiben 
kann ich nicht.

Ich habe z.B. den Code von Felix Pflaum, den ich zum probieren nutzen 
könnte, aber wenn ich das richtig sehe ist das zwar eine main für den 
Empfang, aber nichts zum senden.
Angehängte Dateien:
#5047196
Lesenswert?

RFM69:
#define RF_SYNC_SIZE_1            0x00
#define RF_SYNC_SIZE_2            0x08
#define RF_SYNC_SIZE_3            0x10
#define RF_SYNC_SIZE_4            0x18
#define RF_SYNC_SIZE_5            0x20
#define RF_SYNC_SIZE_6            0x28
#define RF_SYNC_SIZE_7            0x30
#define RF_SYNC_SIZE_8            0x38

Das Sync-Word beim RFM12 ist per default (2 Bytes):
0x2D (fest)
   und
0xD4 (einstellbar)

So muss beim RFM69 "RF_SYNC_SIZE_2" = 0x08 gesetzt sein.
#5047216
Lesenswert?

Meine Init-Werte...
- ohne Frequenz
- ohne Baudrate
- mit Interruptbetrieb
- mit Whitening (ggf. rausnehmen: RF_PACKET1_DCFREE_WHITENING)
- mit CRC (ggf. rausnehmen: RF_PACKET1_CRC_ON)
1
/* 0x01 */ { REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY },
2
/* 0x02 */ { REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00 }, // no shaping
3
/* 0x05 */ { REG_FDEVMSB, RF_FDEVMSB_90000}, // default: 5KHz, (FDEV + BitRate / 2 <= 500KHz)
4
/* 0x06 */ { REG_FDEVLSB, RF_FDEVLSB_90000},
5
/* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2 }, // (BitRate < 2 * RxBw)
6
/* 0x25 */ { REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 }, // DIO0 is the only IRQ we're using
7
/* 0x26 */ { REG_DIOMAPPING2, RF_DIOMAPPING2_CLKOUT_OFF }, // DIO5 ClkOut disable for power saving
8
/* 0x28 */ { REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN }, // writing to this bit ensures that the FIFO & status flags are reset
9
/* 0x29 */ { REG_RSSITHRESH, 170 }, // must be set to dBm = (-Sensitivity / 2), default is 0xE4 = 228 so -114dBm <-------- ACHTUNG, zuviel dBm verursachen ziemlich fehlerhaften Empfang
10
/* 0x2E */ { REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0 },
11
/* 0x2F */ { REG_SYNCVALUE1, 0x2D },      // attempt to make this compatible with sync1 byte of RFM12B lib
12
/* 0x30 */ { REG_SYNCVALUE2, networkID }, // NETWORK ID
13
/* 0x37 */ { REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_WHITENING | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF },
14
/* 0x38 */ { REG_PAYLOADLENGTH, 66 }, // in variable length mode: the max frame size, not used in TX
15
/* 0x3C */ { REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_FIFOTHRESH_VALUE }, // TX on FIFO not empty
16
/* 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)
17
/* 0x6F */ { REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0 }, // run DAGC continuously in RX mode for Fading Margin Improvement, recommended default for AfcLowBetaOn=0


Konstanten von hier:
https://github.com/LowPowerLab/RFM69/blob/master/RFM69registers.h
#5047266
Lesenswert?

Laut Datenblatt:
1
After PayloadReady occurred, defines the delay between FIFO empty and the start of a new RSSI phase for next packet. Must match the transmitter’s PA ramp-down time.

Ich denke, das ist die minimale Zeit zwischen Ende eines Paketes und dem 
Start eines Folgepaketes. Ist aber sicher nicht kriegsentscheidend und 
muss sicher nicht genau zum Sender passen).

Empfängst Du per Polling oder Interrupt?

Und bedenke, der RFM69 hat einen Sequencer drin, der den Ablauf zwischen 
RX/TX und Standby handhabt.

Nach dem Umschalten muss man warten:
1
void RFM69::setMode(uint8_t newMode)
2
{
3
  switch (newMode) {
4
    case RF69_MODE_TX:
5
      writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_TRANSMITTER);
6
      break;
7
    case RF69_MODE_RX:
8
      writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_RECEIVER);
9
      break;
10
    case RF69_MODE_SYNTH:
11
      writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_SYNTHESIZER);
12
      break;
13
    case RF69_MODE_STANDBY:
14
      writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_STANDBY);
15
      break;
16
    case RF69_MODE_SLEEP:
17
      writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_SLEEP);
18
      break;
19
    default:
20
      return;
21
  }
22

23
  int max_tries = 20000;
24
  while (((readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00) && (max_tries-- > 0)); // wait for ModeReady
25
}
OP #5047289
Lesenswert?

Peter S. schrieb:
> Empfängst Du per Polling oder Interrupt?

Z.Zt. überwache ich das PayloadReady Bit (Bit 2 von RegIrqFlag2 0x28).

Ich habe aber auch schon versucht den FIFO ständig auszulesen.

Den Sender habe ich so eingestellt, daß er laufend (mit kurzen Pausen) 
sendet.

Peter S. schrieb:
> Nach dem Umschalten muss man warten:

Ich schalte z.Zt. nicht um!
#5047320
Lesenswert?

Bruno M. schrieb:
> Z.Zt. überwache ich das PayloadReady Bit (Bit 2 von RegIrqFlag2 0x28).
Genauso - korrekt.

...

Schreibe gelegentlich:

writeReg(REG_PACKETCONFIG2, (readReg(REG_PACKETCONFIG2) & 0xFB) | 
RF_PACKET2_RXRESTART);

Das startet den RX-Fifo neu.

Mein RX-Init sieht so aus:
1
void RFM69::rx_enable()
2
{
3
  setMode(RF69_MODE_STANDBY);
4
  if (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY)
5
    writeReg(REG_PACKETCONFIG2, (readReg(REG_PACKETCONFIG2) & 0xFB) | RF_PACKET2_RXRESTART); // avoid RX deadlocks
6
  writeReg(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01); // set DIO0 to "PAYLOADREADY" in receive mode
7
  setMode(RF69_MODE_RX);
8
}

...

Ansonsten schon mal den TX-Teil getestet? (sieht man an der 
Stromaufnahme oder mit einem SDR)
OP #5066067
Lesenswert?

Hallo Sascha,

nochmals herzlichen Dank für deinen Code. Ich habe mich in der 
Zwischenzeit intensiv damit beschäftigt und auch einiges dazugelernt. 
Leider habe ich aber noch immer keinen Empfang, obwohl ich nur 
geringfügige Änderungen vorgenommen habe.

Folgende Anpassungen habe ich im Wesentlichen vorgenommen:

- kein Interrupt, sondern Dauerschleife bei TX und warten auf 
PayloadReady Flag bei RX.

- Software SPI statt USI

- rfm_txon vor dem Füllen des Fifo. Nach langer Suche mußte ich diese 
Änderung vornehmen, da sonst kein TXReady und kein PacketSent!

Tx funktioniert jetzt anscheinend normal, aber ich bekomme keinen 
Empfang. Am Modul kann es eigentlich nicht liegen, da beide Module als 
Sender normal funktionieren.

Hast du eventuell noch einen Tip?
Angehängte Dateien:
#5066078
Lesenswert?

Wie hast Du den Reset am RFM69CW beschaltet? Bei mir funktioniert ein 
Pulldown-Widerstand (SMD 0805) direkt auf Modul gelötet am besten. 
Floaten lassen oder Pullup haben langfristig immer unreproduzierbare 
Störungen bewirkt. Mit Pulldown funktioniert mein Aussensender seit 1,5 
Jahren ohne Probleme.

Hier habe ich mal eine funktionierende Konfiguration für 433 MHz 
gepostet:
Beitrag "Re: RFM69 - Beispiel für Initialisierung gesucht"

Nutzt Du das Hersteller-Tool für die Erstellung der Konfiguration?
Beitrag "Re: RFM69 - Beispiel für Initialisierung gesucht"
OP #5066126
Lesenswert?

Klaus I. schrieb:
> Hier habe ich mal eine funktionierende Konfiguration für 433 MHz
> gepostet:
> Beitrag "Re: RFM69 - Beispiel für Initialisierung gesucht"

Das hatte ich mir schon vor längerer Zeit runtergeladen, aber irgendwo 
drehe ich mich im Kreis. Außerdem arbeite ich mit 868 MHz.

Mit dem Pulldown will ich aber mal versuchen.
#5066660
Lesenswert?

Peter S. schrieb:
> Bruno M. schrieb:
>> So einfach war es dann wohl doch nicht.
>
> falls es tröstet: ich habe mehrere Wochen damit zugebracht, RFM12 und
> RFM69 kompatibel zu bekommen.
>
> Dafür hab ich aber die CRC-Generierung und das Whitening in Software für
> den RFM12 geschrieben. Der RFM69 kann ja beides in Hardware.

Das ging mir auch so, dass ich einige Tage über mehrere Wochen damit 
zubrachte die beiden zum Reden zu bringen. Gerade die CRC-Geschichte war 
eine der Hürden. Und dann habe ich noch ein Wrapper-Protokoll für 
Paketwiederholung drüber und das bekam ich nicht so einfach kompatibel 
für beide Libs darunter. Und habe dann beschlossen ich werfe alle RFM12 
raus, die RFM69 haben sowieso sehr viel bessere Reichweite (150m vs. 
50m, jeweils durch eine Außenwand).
Habe dann eine SMD-Adapterplatine für die RFM69CW gemacht, die auf 
"Beinchen" auf dem ehemaligen Platz der RFM12 sitzt und die 
5V-3.3V-Übersetzung macht (Low Drop Spannungsregler, Spannungsteiler). 
Ziemliches Gefummel die auf die Pads der RFM12 aufzulöten, aber konnte 
damit 3 alte Schaltungen umrüsten und vermeiden alle diese Schaltungen 
neu zu machen (paar Stunden Adapterplatine vs. paar Tage ganz neue 
Platinen entwickeln).
#5067631
Lesenswert?

Bruno M. schrieb:
> Das Problem mit rfm_txon ist gelöst! Ich hatte das CS nicht wieder auf
> high gesetzt. Das hat aber nichts daran geändert, dass ich keinen
> Empfang habe.
lass doch am Empfänger mal die Statusbits dauernd ausgeben, bis 
Payload-Rdy passiert ja zuvor noch einiges, evl. lässt sich damit 
erkennen wo es klemmt.
Hast du an den Modulen eine Antenne dran? Hatte bei mir schon beim 
probieren ohne Antenne das Problem das das Teil nicht auf Empfang geht 
wenn es offenbar keinen sinnvollen RSSI im Ruhezustand bestimmen kann.

Sascha
OP #5067746
Lesenswert?

Sascha W. schrieb:
> lass doch am Empfänger mal die Statusbits dauernd ausgeben, bis
> Payload-Rdy passiert ja zuvor noch einiges, evl. lässt sich damit
> erkennen wo es klemmt.

Danke, daß du nochmals reinschaust!

Die Statusbits habe ich mehrfach kontrolliert. Ich kann daraus aber 
leider keine Erkenntnisse ableiten.

0x27=11011001
0x28=01100100 ?? was bedeutet FIFO strictly exceeds FifiThreshold
0x27=00010000
0x28=00000000
0x27=11011000
0x28=00000000
0x27=11011000
0x28=00000000 usw.

> Hast du an den Modulen eine Antenne dran?

Ja, Antenne ist dran. Die Schaltung funktioniert auch mit einem RFM12.

Während ich das schreibe, habe ich weiter getestet und dabei 
festgestellt, daß ich doch etwas empfange. Bei jedem Signal des Senders 
geht PayloadReady tatsächlich hoch und auch die LED leuchtet auf. Es 
wird allerdings nichts über UART ausgegeben. Warum das so ist weiß ich 
noch nicht.

Damit bin ich aber schon einen großen Schritt weiter!!!
OP #5068666
Lesenswert?

Ich muß feststellen, das war eine schwierige Geburt, aber jetzt 
funktioniert es!!!
Allen die mitgeholfen haben, herzlichen Dank, insbesondere an Sascha.

Die Ausgabe in UART ging nicht, da ich als Empfangsroutine das 
Codesegment RFM_RX_IRQ: von Sascha (wie alles andere auch, natürlich 
leicht modifiziert!) übernommen habe. Das kann aber vom Grundsatz her 
nicht funktionieren, da beim Auslesen des FIFO nicht bei jedem Byte CS 
low und high gesetzt werden darf. Genau das passiert aber mit 
RFM_SEND_CMD.
Für alle die es eventuell interessiert anliegend der letzte Code.
Angehängte Dateien:
#5069020
Lesenswert?

Hallo,

mit der Bitrate hab ich auch schon rumgespielt das gestaltet sich recht 
schwierig. An die Bitrate scheinen noch ein paar andere Register 
(Bandbreite) angepasst werden müssen.
Für das RFM22 gibt's von SiLabs ne Konfigurations-Excel-Datei mit der 
man die Registerwerte berechnen kann - da steig ich aber auch nicht ganz 
durch. Sollte evl. auch für das '69 verfügbar sein.

Sascha
Gast #5251758
Lesenswert?

Hallo,
vorweg: Seit Jahren benutze ich erfolgreich den RFM12B mit dem 
TMS320F280xx.
Wegen der Reichweite möchte ich den RFM69CW einsetzen.
Zuerst habe ich versucht, zwei RFM69CW zu verbinden (Sender - 
Empfänger). Negativ.
Danach habe ich den Sender-RFM69 auf die Frequenz, BAUT-Rate, Anzahl der 
Präambel-Bytes, Sync.-Bytes (x02D,x0D4) und Nutzdatenlänge eines im 10 
Sek.-Takt funktionierenden RFM12B-Empfänger gesetzt, in der Annahme, der 
RFM12B-Empfänger müsste jetzt den Checksummenfehler melden, da die 
Checksumme nicht stimmt, oder zu mindestens den Empfang irgendwelcher 
Daten. Der RFM69CW sendete im Sek.-Takt.
Keine Funktion.
Als Softwareunterstützung habe ich
Beitrag "Wer verwendet RFM69?"
und
Beitrag "RFM69 - Beispiel für Initialisierung gesucht"
von maggggus genutzt.

Mit der Software sind die Register auslesbar.
Der 32MHZ-Takt ist auch vorhanden.

Mittlerweile habe ich den Verdacht, dass diese CHINA-Ware im 
HF-Ausgansbereich einen Defekt hat oder falsch bestückt ist.

Wäre jemand bereit, dies bei sich in ein einem funktionieren System zu 
testen?
Weiter Konditionen über PN?
VG Walter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren