Hallo,
ich versuche derzeit, mit einem RFM22-Modul Homematic-Nachrichten
mitzulesen. Wenn ich die Informationen aus dem Datenblatt richtig lese,
müsste das gehen (RFM12 geht wegen des fixen Sync-Words nicht, was beim
RFM22 aber frei konfigurierbar ist).
Ich habe die Schaltung von Ulrich Radig übernommen und die Init-Routine
wie folgt angepasst:
rf22_write(0x05, 0x02); // valid packed received
interrupt on
rf22_write(0x06, 0x00); // all interrupts off
rf22_write(0x07, 0x01); // operating mode: ready mode
rf22_write(0x09, 0x7f); // xtal load capacitance
rf22_write(0x0A, 0x02); // uC CLK: 10MHz
rf22_write(0x0b, 0xf2); // GPIO0: TX_ANT - f2
rf22_write(0x0c, 0xf5); // GPIO1: RX ANT - f5
rf22_write(0x0d, 0x00); // GPIO2: uC Clock out
rf22_write(0x0e, 0x00);
rf22_write(0x0f, 0x70); // ADC Input: GND
rf22_write(0x10, 0x00); // ADC offset: 0
rf22_write(0x12, 0x00); // temp sensor calibration off
rf22_write(0x13, 0x00); // temp sensor offset: 0
rf22_write(0x1C, 0x01); // IF bandwidth
rf22_write(0x1d, 0x44); // enable AFC
rf22_write(0x1e, 0x0A); // afc timing
rf22_write(0x1f, 0x00); // afc timing
rf22_write(0x20, 0x90); // Clock Recovery Oversampling
Rate
rf22_write(0x21, 0x20); // Clock Recovery Offset 2
rf22_write(0x22, 0x51); // Clock Recovery Offset 1
rf22_write(0x23, 0xEC); // Clock Recovery Offset 0
rf22_write(0x24, 0x10); // Clock Recovery Timing Loop
Gain 1
rf22_write(0x25, 0x58); // Clock Recovery Timing Loop
Gain 0
rf22_write(0x2A, 0x1C);
rf22_write(0x2C, 0x28);
rf22_write(0x2D, 0x7D); // RSSI Threashold: -120dB
rf22_write(0x2E, 0x2A);
rf22_write(0x30, 0xAC); // data access: RX/TX packet
handling, enable crc: CCIT
rf22_write(0x32, 0x80); // header check enable
rf22_write(0x33, 0x06); // 2 word synchronisation
rf22_write(0x34, 0x08); // preamble length: 16 nibbles,
= 64bits
rf22_write(0x35, 0x22); // preamble detection control: 6
nibbles = 24bits
rf22_write(0x36, 0xE9); // sync word 3
rf22_write(0x37, 0xCA); // sync word 2
rf22_write(0x38, 0xE9); // sync word 1
rf22_write(0x39, 0xCA); // sync word 0
/* rf22_write(0x3a, 'h'); // transmit header 3
rf22_write(0x3b, 'o'); // transmit header 2
rf22_write(0x3c, 'p'); // transmit header 1
rf22_write(0x3d, 'e'); // transmit header 0
rf22_write(0x3e, 0x3d); // packet length
rf22_write(0x3f, 'h'); // check header 3
rf22_write(0x40, 'o'); // check header 2
rf22_write(0x41, 'p'); // check header 1
rf22_write(0x42, 'e'); // check header 0
rf22_write(0x43, 0xff); // header enable mask 3
rf22_write(0x44, 0xff); // header enable mask 2
rf22_write(0x45, 0xff); // header enable mask 1
rf22_write(0x46, 0xff); // header enable mask 0
*/
rf22_write(0x58, 0x80);
rf22_write(0x69, 0x60); // AGC on
rf22_write(0x6a, 0x0b); // agc override 2
rf22_write(0x6d, 0x0F); // tx power: +17dBm
rf22_write(0x6E,0x51); // set baud high
rf22_write(0x6F,0xEC); // set baud low
rf22_write(0x70, 0x2D); // modulation control
rf22_write(0x71, 0x22); // modulation control 2: FIFO
mode, OOK //0x21 / 0x00
rf22_write(0x72, 0x20); // frequency deviation: 45kHz
rf22_write(0x73, 0x00); // offset: 0
rf22_write(0x74, 0x00); // offset: 0
rf22_write(0x79, 0x0); // frequency hopping off
rf22_write(0x7a, 0x0); // frequency hopping off
#ifdef BAND_868
rf22_write(0x75, 0x73); // 860-880MHz range
#else
rf22_write(0x75, 0x53); // 430-440MHz range
#endif
rf22_write(0x76, 0x67);
rf22_write(0x77, 0xC0);
rf22_write(0x7C, 0x09);
rf22_write(0x7E, 0x38);
Die empfangenen Pakete sollen per RS232 im Hex-Format ausgegeben werden,
leider sehe ich nix. Den nIRQ-Pin habe ich lt. Radig-Schaltplan mit PD2
verbunden.
Hat jemand dergleichen schon mal gemacht und kennt die richtige
Init-Sequenz für das RFM-Modul? Die Werte habe ich der Excel-Tabelle
entnommen, die Daten für HomeMatic diversen Foren-Beiträgen sowie den
Config-Bytes der culfw.
Schönen Sonntag,
Sebastian
Hallo, ich bin ein bisschen weiter gekommen: der RFM22 mag es nicht, wenn er die SPI-Daten der Programmierung "mitliest". Dadurch gerät er durcheinander und ist hinterher auch durch einen Software-Reset nicht mehr einzufangen, ich muss das STK500 nach jedem Flashvorgang aus- und wieder einschalten und das ISP-Kabel abziehen, um vernünftig mit dem RFM22 "reden" zu können. Mit den Parametern 868,3 MHz, 20kHz Deviation, 4 Preamble-Bytes, 4 Sync-Bytes (E9 CA E9 CA), kein CRC, kein Manchester, kein Whitening empfange ich schon mal Daten, wenn mein Sender funkt. Allerdings sind diese Daten nicht im Ansatz mit dem überein zu bringen, was ein parallel mitlaufender HM-CFG-USB ausgibt. Den XOR-Code aus der culfw habe ich bereits implementiert, was aber nichts bringt. Außerdem ist schon das Längen-Byte, welches von der XOR-Geschichte ausgenommen ist, "falsch". Nach meinem Verständnis haben nur Manchester-Kodierung und Data-Whitening Einfluss auf die Daten. Manchester wird dabei auch auf Preamble und Sync-Word angewendet. Da ich beim RFM eingestellt habe, dass 4 Sync-Words überprüft werden müssen und ohne korrekt erkanntes Sync-Word der FIFO-Puffer überhaupt nicht gefüllt wird, scheidet Manchester aus. Testweises Aktivieren von Whitening bringt mich auch nicht weiter, die Daten sehen zwar dann "anders" aus, sind aber ebenfalls nicht korrekt. An welchen Stellschrauben könnte ich noch drehen? Sebastian
Sebastian Voitzsch schrieb: > Hallo, > > ich bin ein bisschen weiter gekommen: der RFM22 mag es nicht, wenn er > die SPI-Daten der Programmierung "mitliest". Dadurch gerät er > durcheinander und ist hinterher auch durch einen Software-Reset nicht > mehr einzufangen, ich muss das STK500 nach jedem Flashvorgang aus- und > wieder einschalten und das ISP-Kabel abziehen, um vernünftig mit dem > RFM22 "reden" zu können. Ein Pullup an CS bewirkt bei solchen Phänomenen meist wahre Wunder. Grüße Oliver
Hat das Problem wer lösen können? Ich versuche es schon länger und ich bekomme auch keine plausiblen daten!
Hallo Ulli, ja, das Problem konnte ich lösen: die Data-Whitening- und CRC-Routinen der Chips sind nicht kompatibel, sodass man beides "zu Fuß" erledigen muss. Ich hänge mal meinen Code an, mit dem ich erfolgreich per RFM22b Homematic-Daten empfangen und senden kann. Leider ist das Projekt bei mir mangels Zeit eingeschlafen. Der Code sollte auf einem Tiny24 laufen und einen Homematic-Schaltaktor mit einem Kanal nachbilden. Die Belegung müsstest Du aus den Kommentaren im Code ersehen können. Die CRC- und Data-Whitening-Routinen befinden sich in rf22.c (get_next_key und calc_crc). Aus irgendeinem Grund habe ich mich damals dagegen entschieden, das Homematic-Encoding auch von "rf22_sendpacket" bzw. "rf22_getpacket" erledigen zu lassen - aber frag' mich nicht mehr, warum... Grüße, Sebastian PS: Wenn Du ein funktionierendes HM-Device realisierst, halt' uns auf dem Laufenden!
Besten Dank das hilft ungemein. Ich hatte inzwischen schon rausgefunden das das data whtening anders ist und konnte Daten empfangen. Nur senden ging nicht und jetzt weiß ich das es vermutlich am fehlenden CRC liegt!! Besten dank für den code vorerst! Schau ich mir heute abend an. Grüße ulli
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.