RFM12: Kein Empfang

Gast #4521318
Lesenswert?

Hallo,
ich versuche gerade zwei 433MHz-RFM12 miteinander in einer Richtung 
kommunizieren zu lassen, leider bisher erfolglos.
Das eine Modul hängt an einem ATMEGA32 (TX) und das andere an einem 
STM32 (RX).
Ich verwende bei beiden SPI-Interrupts und den IRQ-Pin des RFMs, welcher 
über einem externen Interrupt-Pin der Controller auf negative Flanke 
abgefragt wird.

Status lässt sich bei beiden Modulen über SPI auslesen.
Senden geht bei beiden Modulen (hab ein Messgerät für 433 MHz, da sieht 
man dass Leistung gesendet wird).

Ich konfigurier beide Module wie folgt (ist bei beiden identisch):
1
// initialisiere RFM12:
2
spi_transmission(0xC000);    // 000 00000
3
spi_transmission(0x80D7);    // 1101 0111
4
spi_transmission(0xA620);    // 433,92 MHz => 1568 = 0x620
5
spi_transmission(0xC623);    // 0 0100011
6
spi_transmission(0x9080);    // 000 1000 0000
7
spi_transmission(0xC2AB);    // 1010 1011
8
spi_transmission(0xCA81);    // 1000 0001
9
spi_transmission(0xC4F7);    // 1111 0111
10
spi_transmission(0x9850);    // 0 | Frequenzhub: 0101 | 0 | Leistung: 000
11
spi_transmission(0xE000);    // 0 0000 0000 0000
12
spi_transmission(0xC800);    // 0000 000 0
13

14
spi_transmission(0x8219);    // 0001 1001
15

16
spi_transmission(0xB8AA);    // setzt register-underrun-IRQ zurueck
17
spi_transmission(0x0000);    // reset IRQ
18

19
rfm12_DirectionWrite = 0;
20
rfm12_tx_BusyFlag = 0;

Empfänger tu ich mit der Funktion
1
void rfm12_tx_off_rx_on(void)
2
{
3
  spi_transmission(0x82C9);    // 1100 1001
4
  rfm12_DirectionWrite = 0;
5
  rfm12_rx_ByteCounter = 0;
6
}
einschalten. Der Sender wird mit:
1
void rfm12_tx_on_rx_off(void)
2
{
3
  spi_transmission(0x8239);    // 0011 1001
4
  rfm12_DirectionWrite = 1;
5
  rfm12_tx_ByteCounter = 0;
6
  rfm12_write_rx_buffer_en = 0;
7
  rfm12_tx_FinishFlag = 0;
8
}
eingeschaltet.


Während das TX-Modul alle 100 ms immer:
0xAA, 0xAA, 0x2D, 0xD4, 0x01, 0x02, 0x03, 0xAA
sendet, müsste ja eigentlich der IRQ-Pin am RX-RFM im Laufe des Empfangs 
auf Low gehen, tut er aber nicht.

Hat jemand Ideen, wo hier das Problem liegt?
Hab beim Sender alle SPI-Pakete bereits auf dem Oszi überprüft, kommt 
alles richtig an.
Falls ihr mehr Daten braucht, einfach Bescheid sagen ;)

Schonmal Vielen Dank für Antworten!
#4521646
Lesenswert?

Hallo,
1
void RFM12_ISR(void)
2
{
3
  static uint8_t daten[32];
4
  static uint8_t checksum = 0;
5
  static uint8_t bytecount = 0;
6
  uint8_t i, sensor_nr, byte;
7

8
  digitalWrite(RFM12_SCK, LOW);                 // CLK auf L
9
  digitalWrite(RFM12_SDI, LOW);                 // DATA auf L
10
  digitalWrite(RFM12_CS, LOW);                  // CS auf L
11

12
  byte = 0xB0;                                  // Receive FIFO
13

14
  for (i = 0; i < 8; i++)                       // Kommando senden
15
  {
16
    if (byte & 0x80)
17
    {
18
      digitalWrite(RFM12_SDI, HIGH);            // DATA auf H
19
    }
20
    else
21
    {
22
      digitalWrite(RFM12_SDI, LOW);             // DATA auf L
23
    }
24
    digitalWrite(RFM12_SCK, HIGH);              // Clock auf H
25
    byte = (byte << 1);                         // nächstes Bit nach oben
26
    digitalWrite(RFM12_SCK, LOW);               // Clock auf L
27
  }
28

29
  byte = 0;
30

31
  for (char j = 0; j < 8; j++)
32
  {
33
    byte = (byte << 1);                         // eins höher schieben
34
    if (digitalRead(RFM12_SDO) == 1)            // Bit 1?
35
    {
36
      byte = (byte | 0x01);                     // ja
37
    }
38
    digitalWrite(RFM12_SCK, HIGH);  // CLK auf H
39
    digitalWrite(RFM12_SCK, LOW);   // CLK auf L
40
  }
41
  digitalWrite(RFM12_CS, HIGH);     // CS auf H
42

43
  daten[bytecount] = byte;                      // Daten speichern
44
  bytecount++;
45
  checksum ^= byte;                             // XOR-Prüfsumme
46

47
  if (bytecount == PAKET_LEN)                   // fertig?
48
  {
49
    RFM12_send_cmd(0xCA81);                     // set FIFO mode
50
    RFM12_send_cmd(0xCA83);                     // enable FIFO
51

52
    if (checksum == 0)                          // Checksumme ok?
53
    {
54
      sensor_nr = (daten[0] & 0x0F) - 1;        // jetzt ab 0
55
      if (sensor_nr < SENSOR_ANZ)               // im gültigen Beeich?
56
      {
57
        daten[bytecount - 1] = 1;               // 1 ins letzte Byte (Checksumme) für neue Daten
58
        memcpy((void *) sensor[sensor_nr], (void const *) daten, PAKET_LEN);
59
      }
60
    }
61
    checksum = 0;
62
    bytecount = 0;
63
  }
64
}
65

66
//------------------------------------------------------------------
67

68
void RFM12_init(void)
69
{
70
  pinMode(RFM12_CS, OUTPUT);
71
  digitalWrite(RFM12_CS, HIGH);
72

73
  pinMode(RFM12_SDI, OUTPUT);
74
  digitalWrite(RFM12_SDI, LOW);
75

76
  pinMode(RFM12_SCK, OUTPUT);
77
  digitalWrite(RFM12_SCK, LOW);
78

79
  pinMode(RFM12_SDO, INPUT);
80
  pinMode(RFM12_IRQ, INPUT_PULLUP);
81

82
  delay(200);
83

84
  RFM12_send_cmd(0x0000);  // Status read
85

86
  RFM12_send_cmd(0xC080);  // CLK-Frequenz / Batterie-Level
87
  RFM12_send_cmd(0x80D7);  // FIFO ein, TX-Regisrer ein, 433MHZ-Band, C = 12pF
88
  RFM12_send_cmd(0xC2AB);  // Clock Recovery Auto, Filter digital, DQD-Thresold 3
89
  RFM12_send_cmd(0xCA81);  // FIFO-Level 8 Bit, Sync Pattern ein, High senity Reset aus
90
  RFM12_send_cmd(0xE000);  // WakeUp aus
91
  RFM12_send_cmd(0xC800);  // Low Duty Cycle aus
92
  RFM12_send_cmd(0xC4F3);  // AFC immer, +7,5 / -10kHz, Add Freq-Offset zur PLL, Berechne Freq. Offset aus AFC                      // Status read
93
  RFM12_send_cmd(0xA620);  // Frequenz 433,92MHz  // Status read
94
  RFM12_send_cmd(0x948C);  // VDI Output, VDI Fast, Bandbreite 200kHz, LBA-Gain -6dB, RSSI-Thresold -79dB
95
  RFM12_send_cmd(0xC610);  // Baudrate 19200 ->> stimmt nicht...
96
  RFM12_send_cmd(0x8281);  // Empfänger ein
97

98
  attachInterrupt(RFM12_IRQ, RFM12_ISR, FALLING);
99

100
  RFM12_send_cmd(0xCA81);  // set FIFO mode
101
  RFM12_send_cmd(0xCA83);  // enable FIFO
102
}

das ist die Init und ISR meines Sensorempfängers mit Software-SPI.
Die Parameter werden Dir nicht allzuviel nutzen, ich empfange damit 
Pakete mit 24 Byte ASCII von meinen Sensoren.
Die Baudrate ist whol bei knapp 22000, ist erst nach Jahren aufgefallen, 
da ich überall den gleichen Wert benutzt habe...

FIFO-Level muß gesetzt sein, zum Empfangsstart muß FIFO-Mode mit FIFO 
disable und anschließen enable geschickt werden.

Das muß in der ISR auch gemacht werden, nachdem ein Datenpaket empfangen 
wurde.

Gruß aus Berlin
Michael
Gast #4521682
Lesenswert?

Also beim STM hab ich das mit der SPI und RFM12 nicht geschaft etwas zu 
Empfangen.
Senden hab ich geschaft aber beim Emphang ging nichts.

Habs nun so gelöst mit ner Soft spi und das geht wunderbar.
mfg
Gast #4522025
Lesenswert?

Danke für die Antworten!
Werde den Code bei Gelegenheit durcharbeiten :)

Michael U. schrieb:
> FIFO-Level muß gesetzt sein, zum Empfangsstart muß FIFO-Mode mit FIFO
> disable und anschließen enable geschickt werden.

Gibts da einen bestimmten Grund warum man zuerst FIFO disablen und 
anschließend enablen muss?

stm32iger schrieb:
> Also beim STM hab ich das mit der SPI und RFM12 nicht geschaft etwas zu
> Empfangen.
> Senden hab ich geschaft aber beim Emphang ging nichts.
>
> Habs nun so gelöst mit ner Soft spi und das geht wunderbar.
> mfg

Michael U. schrieb:
> Hallo,
>
> witzigerweise habe ich damals die RFM-Module am AVR in Assembler auch
> nicht mit Hardware-SPI in Gang bekommen, deshalb der Soft-SPI. Die
> Routine dann irgendwann nach C getragen und inzwischen läuft obige
> prinzipiell unverändert auf einem ESP8266...
>
> Gruß aus Berlin
> Michael

Weiß jemand warum das mit der eingebauten SPI-Hardware nicht geht?
Wäre interessant zu wissen ;)

Viele Grüße

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