Forum: Mikrocontroller und Digitale Elektronik RFM23B OOK Direct Mode


von jtag (Gast)


Lesenswert?

Hallo zusammen,

Auf der Suche nach einem Funkmodul, welches ASK, bzw OOK beherrscht bin 
ich auf das RFM23 bzw RFM22 gestoßen. Bisher hatte ich nur mit RF Link 
Funkmodulen wie diesen hier zu tun: 
http://www.watterott.com/de/RF-Link-2400bps-Empfaenger-434MHz
Nachteil an diesen einfachen Modulen ist, dass Empfänger und Sender 
getrennt sind. Dadurch bräuchte ich praktisch 2 Module auf meiner 
Platine, das ganze ist also uninteressant. Deshalb jetzt auch das RFM23.

Das RFM23 soll nun aber so wie die RF-Link Module arbeiten (Empfänger + 
Sender), sprich Daten an einem IO Pin direkt senden und empfangene Daten 
ohne weitere Verarbeitung oder sonst was an einem IO Pin ausgeben. Ziel 
ist es, verschiedene 434Mhz Systeme wie Funksteckdosen (interttechno, 
HomeEasy, usw) abzuhören und mitzusenden.
Das Datenblatt habe ich gelesen, aber jetzt kommt bei mir die Frage auf, 
ob das RFM23 das überhaupt kann, denn im Datenblatt 
(http://www.hoperf.com/upload/rf/RFM22B_23B.pdf) auf Seite 30 (Kapitel 
4.2.2 Direct Mode) steht folgendes: " In RX direct mode, the chip must 
still aquire bit timing during the Preamble, and thus the preamble 
detection threshold (SPI Register 35h) must still be programmed"
Das Problem ist, dass die Daten willkürlich sein können und es keine 
"Preamble" gibt.
Stellt das für meinen speziellen Fall ein Problem dar, oder habe ich da 
was übersehen? Leider hänge ich gerade an dieser Stelle fest, und komme 
nicht weiter. Kennt sich jemand mit dem Modul aus und kann mir einen 
Tipp geben?

Grüße,
Daniel /jtag

von jtag (Gast)


Lesenswert?

Hi,
noch ein kleiner Nachtrag:

Auch auf Seite 30, Kapitel 4.2.2.2., steht was von "Direct Asynchronous 
Mode", was ja eigentlich genau dem entspricht was ich haben will, 
zumindest sendeseitig. Leider steht hier nur was über Senden, aber gibt 
es diesen Modus auch beim Empfangen? Das Datenblatt ist an der Stelle zu 
mager für mich.

Was sagt ihr dazu?

Grüße,
jtag

von jtag (Gast)


Lesenswert?

Hallo zusammen,

hat keiner einen Vorschlag? Leider finde ich zu genau dem Betriebsmodus 
keine Projekte oder Zusatzinformationen, weil jeder seine Funkmodule mit 
FSK oder GFSK betreibt.
Da das Ganze wirklich sehr dringend ist, muss ich hier nochmal 
nachbohren ;)

Grüße,
jtag

von Philip P. (nerb)


Lesenswert?

up

von Carsten M. (ccp1con)


Lesenswert?

Glaube du musst das Modul dann im Raw Data mode betreiben.
"raw data mode from AN463" von Silicon Labs

GPIO_1 und GPIO_2 liefern dann die Daten im Raw mode (clk and data)
Alles weitere Preampleerkennung, Filterung ... bleibt dann deiner 
Software überlassen.

Ich habe damit auch schon mal rum-experimentiert, weil ich die gleiche 
Idee hatte. Es hat sich aber als nicht ganz so einfach erwiesen die 
Funksteckdosen, Temperatursensoren, Funkrollos ... mit RFM22B zu 
belauschen.

Ich weiß nicht mehr genau wo ich stecken geblieben bin.
Wenn du willst kann ich mal nachschauen.

Vielleicht kommen wir ja gemeinsam weiter ...

von Philip P. (nerb)


Lesenswert?

Hallo Carsten,

schön, dass sich noch jemand meldet, ich hatte die Hoffnung schon 
aufgegeben...

Der Tipp mit der Appnote ist super, danke vielmals.

Leider funktioniert es auch mit appnote überhaupt nicht, irgendwas zu 
empfangen. Zwar kommt am RX_DATA-out was raus, aber das ist nur 
Rauschen, auch bei sehr starken Signalen (die sieht man nur minimal im 
Rauschmuster).

Hier mal mein Code, der im grobem der Beispiel-initialisierung aus der 
Appnote entspricht:
1
void rfm_init3()
2
{
3
  spiD_init(SPI_MASTER, SPI_PRESCALER_DIV64_gc, 0);
4
  
5
  PORTD_DIRSET = rfm_TX_ANT | rfm_RX_ANT;
6
  //PORTE_DIRSET = rfm_GPIO0;  //GPIO0-Pin Ausgang
7
  //PORTE_OUTCLR = 
8
  
9
  /*
10
   Set preamble detection threshold to maximum.
11
   Enable all Header comparisons.
12
   Enable multi packet mode.
13
   Enable CRC check.
14
  */
15
16
  //read interrupt status registers to clear the interrupt flags and release NIRQ pin
17
  rfm_read(0x03);
18
  rfm_read(0x04);
19
  //SW reset
20
  rfm_write(0x07, 0x80);
21
  //wait for chip ready interrupt from the radio (while the nIRQ pin is high)
22
  while ( PORTE_IN & rfm_NIRQ);
23
  //read interrupt status registers to clear the interrupt flags and release NIRQ pin
24
  rfm_read(0x03);
25
  rfm_read(0x04);
26
  //set the physical parameters
27
  //set Crystal Oscillator Load Capacitance register
28
  rfm_write(0x09, 0x7f);
29
  //set the center frequency 430-440MHz
30
  rfm_write(0x75, 0x53);
31
  rfm_setfreq(RFMFREQ(433.92));
32
  // packet handler settings
33
  rfm_write(0x35, 0xF8);
34
  //rfm_write(0x71, 0x63);
35
  rfm_write(0x71, 0b01000001);    //Asynchronous Mode, direct Mode (GPIO), OOK
36
  // set to avoid false packet detection
37
  rfm_write(0x30, 0x84);
38
  rfm_write(0x32, 0x0F);
39
  rfm_write(0x33, 0x77);
40
  rfm_write(0x08, 0x10);
41
  
42
43
  // packet handler settings
44
  rfm_write(0x35, 0xF8);
45
  rfm_write(0x71, 0x63);
46
  // set GPIOs
47
  rfm_write(0x0b, 0b11010100); //GPIO0: full driving capability, no pullup, RX_DATA_out
48
  rfm_write(0x0c, 0xCF);     //GPIO1: full driving capability, no pullup, TX/RX Data CLK
49
  rfm_write(0x51, 0x36);
50
  // Set Non default registers
51
  rfm_write(0x69, 0x60);
52
  
53
  
54
  // Turn Receiver ON
55
  rfm_write(0x07, 0x04);
56
  
57
  
58
}

Leider werden auch hier wieder einige Register gesetzt, die nirgends 
beschrieben sind, auch nicht in den AN440 Register Settings.

Wie weit bist du gekommen mit deinem Versuch? Hast du mehr als nur 
Rauschen empfangen? Wäre super, wenn du nochmal nachschauen könntest. 
Kannst du dann vllt deine Initialisierung posten?

danke und lG,
Philip

von Carsten M. (ccp1con)


Angehängte Dateien:

Lesenswert?

Die Daten, die in diesem Modus geliefert werden sind Rohdaten, wie der 
Name schon sagt. Also ich glaube die sind oversampled und ungefiltert.
D.h. der Bitstrom muss noch entsprechend nachbehandelt werden.

Bei mir im Quelltext steht was von deglitching with median filtering und 
retiming. Den Madian Filter habe ich noch verstanden und hinbekommen 
aber bin dann leider am retiming gescheitert (naja nicht wirklich 
gescheitert - nur gestoppt;-), weil ich nicht verstanden habe, wie viel 
Samples per Bit nun  eigentlich da sind.

Außerdem hatte ich keine konstante Quelle mit bekanntem Signal, was die 
Sache nicht vereinfacht. Was benutzt du als Sendequelle?

Hast du gefiltert und „geretimed“? Oder hast du das anders verstanden?

Ich hänge hier meine Initialisierung an.
Bedenke aber die ist für RFM22B.
Sollte aber nicht viel anders sein.

Welche Register sind denn unbekannt?

Gruß Carsten

von Philip P. (nerb)


Lesenswert?

Hallo Carsten,

das RFM22B habe ich auch in Betrieb, ist ja bis auf die Sendeleistung 
und der manuellen Antennenumschaltung gleich dem RFM23B.

Also auch wenn ich die "Empfehlungen" aus AN415 einbaue, bekomme ich 
wieder nur Rauschen... Auch mit Filterung lässt sich da nichts machen, 
das sieht echt nur nach weißem Rauschen aus, das Nutzsignal kann man 
eigentlich nicht erkennen. Selbst wenn das jetzt so stimmt, würde das 
den Prozessor zu stark auslasten...aber ich bin mir sicher, dass 
irgendwas falsch ist. So schlecht kann der Chip nicht sein...mit einer 
Filterung habe ich es deshalb nicht probiert.

Als Sendequelle nehme ich einen Funkschalter von Homeeasy (HE307EU) der 
bekannte Daten schickt.

Wie sehen die Daten aus, die du mit deinem Code bekommst, auch vor der 
Filterung? Mit einem RFLink Empfänger kann ich die Daten auf Anhieb 
auslesen. Da klappt alles bestens, leider gibt es diese Dinger nicht als 
Transceiver sondern der Empfänger ist vom Sender her immer getrennt.

Also das Register 0x51 ( rfm_write(0x51, 0x36);) ist unbekannt, bzw als 
reserved im AN440 notiert und nicht weiter ausgeführt. Was macht das RFM 
hier?

Grüße,
Philip

von Philip P. (nerb)


Lesenswert?

Hallo zusammen,

ich habe endlich das passende Funkmodul gefunden! Das RFM kommt jetzt in 
den Müll.

http://www.soselectronic.de/?str=371&artnum=65101

Grüße

von Ian Daintith (Gast)


Lesenswert?

Hi, I finally got the HopeRF23b to receive 434 OOK in Raw mode. Config 
below. Hope this helps someone. Hallo, Ich habe endlich die HopeRF23b 
auf 434 OOK im Raw-Modus zu empfangen. Config unten. Hoffe, dass dies 
jemand hilft.


void SPIHopeRF1Init(char power)
{
volatile BYTE Dummy;
SPIRF1_SDN_IO = 1;
SPIRF1_SDN_TRIS=0; // make sure SDN is low = power on.
SPIRF1_SDN_IO = 1;
DelayMs(200);
SPIRF1_SDN_IO = 0;
DelayMs(50);
SPIRF1_CS_IO = 1;
SPIRF1_CS_TRIS = 0; // Drive SPI Flash chip select pin
SPIFLASH_SCK_TRIS = 0; // Set SCK pin as an output
SPIFLASH_SDI_TRIS = 1; // Make sure SDI pin is an input
SPIFLASH_SDO_TRIS = 0; // Set SDO pin as an output
SPIHopeRF1Write(0x06, 0x00); // interrupt disable
SPIHopeRF1Write(0x07, 0x01); // to ready mode
DelayMs(50);
//read interrupt status registers to clear
// the interrupt flags and release NIRQ pin
Dummy = SPIHopeRF1Read(0x03);
Dummy = SPIHopeRF1Read(0x04);
// Set crystal osc load capacitance
SPIHopeRF1Write(0x09, 0x7F);  // cap = 12.5pf
// Set frequency to 434
SPIHopeRF1Write(0x75, 0x53);
SPIHopeRF1Write(0x76, 0x62);
SPIHopeRF1Write(0x77, 0x00);
// packet handler
SPIHopeRF1Write(0x35, 0xF8);
SPIHopeRF1Write(0x71, 0x63);
// set to avoid false packet detection
SPIHopeRF1Write(0x30, 0x84);
SPIHopeRF1Write(0x32, 0x0F);
SPIHopeRF1Write(0x33, 0x77);
SPIHopeRF1Write(0x08, 0x10);
// packet handler settings
SPIHopeRF1Write(0x35, 0xF8);
SPIHopeRF1Write(0x71, 0x63);
// set GPIOs
SPIHopeRF1Write(0x0b, 0xD4);
SPIHopeRF1Write(0x0c, 0xCF);
SPIHopeRF1Write(0x51, 0x36);
// Set Non default registers
SPIHopeRF1Write(0x69, 0x60);
// Modem Parameters
SPIHopeRF1Write(0x1F, 0x00);
SPIHopeRF1Write(0x1C, 0xC7); // 412.1 KHz BW
SPIHopeRF1Write(0x20, 0x7D);
SPIHopeRF1Write(0x21, 0x63);
SPIHopeRF1Write(0x22, 0x86);
SPIHopeRF1Write(0x23, 0x25);
SPIHopeRF1Write(0x24, 0x01);
SPIHopeRF1Write(0x25, 0x08);
SPIHopeRF1Write(0x2C, 0x18);
SPIHopeRF1Write(0x2D, 0xD0);
SPIHopeRF1Write(0x2E, 0x2E);
SPIHopeRF1Write(0x71, 0x69);
SPIHopeRF1Write(0x70, 0x0E);
// Turn Receiver ON
SPIHopeRF1Write(0x07, 0x04);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.