Forum: Mikrocontroller und Digitale Elektronik RFM12: Kein Empfang


von mh (Gast)


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!

von mh (Gast)


Lesenswert?

Habs nun geschafft, dass nun zumindest Müll ankommt ;)

Hab folgendes geändert:
1
spi_transmission(0xCA83);    // 1000 0011
Man muss also "ff" (fifo fill) noch zusätzlich einschalten.

von Michael U. (amiga)


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

: Bearbeitet durch User
von stm32iger (Gast)


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

von Michael U. (amiga)


Lesenswert?

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

von mh (Gast)


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

von Michael U. (amiga)


Lesenswert?

Hallo,

weil es der Hersteller so will, siehe Datenblatt usw. ;-)

Gruß aus Berlin
Michael

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.