Forum: Projekte & Code RFM01 und RFM02


von Marc K. (dergruenekobold)


Angehängte Dateien:

Lesenswert?

Also wie gewünscht stelle ich meine Erkenntnisse mit den Modulen RFM01 
und RFM02 zur Verfügung. Die Beschaltung ist den Beiden Bildern "Sender" 
und "Empfänger" zu entnehmen.

Zum C-Code:
Sender:

Zur Initialisierung werden folgende Befehle per SPI zum Modul gesendet:
------------------------------------------------------------------------ 
---
// Funkmodul Initialisieren
void RFM02_INIT(void)
  {
  spi_init(0xCC,0x00);  // Statur Register Read Command
  spi_init(0x8B,0x81);  // Configuration Setting Command
  spi_init(0xA6,0x40);  // Frequency Setting Command
  spi_init(0xC8,0x23);  // Data Rate Command
  spi_init(0xD0,0x40);  // Halbe Datenrate
  spi_init(0xC2,0x20);  // Low Battery Detector / TX Bit Sync
  spi_init(0xC0,0x01);  // Power Management Command
  }
------------------------------------------------------------------------ 
---
Es stehen immer 2x8Bit in der klammer, da der verwendete µC nur einen 
SPI Puffer von 8 Bit hat. Dies wird ersichtlich durch die Prozedur 
"spi_init".
------------------------------------------------------------------------ 
---
// Prozedur um SPI Init zu schreiben
void spi_init(unsigned char txdata, unsigned char txdata2)
{
    unsigned char rxdata;

  LATCbits.LATC6=0;          // Chipselect auf "0"
  Delay10TCYx(1);
  rxdata = SSPBUF;           // Puffer und BF Bit wird gelöscht
  SSPBUF = txdata;           // Puffer wird mit Daten geladen
  while(!SSPSTATbits.BF) {}  // Warten bis Übertragung komplett
  rxdata = SSPBUF;
  SSPBUF = txdata2;
  while(!SSPSTATbits.BF) {}
  rxdata = SSPBUF;
  Delay10TCYx(1);
  LATCbits.LATC6=1;          // Chipselect auf "1"
}
------------------------------------------------------------------------ 
---
Zum senden von daten werden folgende Befehle zum Modul gesendet:
------------------------------------------------------------------------ 
---
if(Rot)
{
spi_init(0xC0,0x39);  // Start der Datenübertragung
send(0xAA);           // Preambel
send(0xAA);           // Preambel
send(0xAA);           // Preambel
send(0x2D);           // Syncwort
send(0xD4);           // Syncwort

send(0xFF);           // Datenbyte
send(0x00);           // Datenbyte

send(0xAA);           // Schlusswort
Delay10TCYx(20);      // kurze Pause
spi_init(0xC0,0x01);  // Datenübertragung beenden
}
------------------------------------------------------------------------ 
---
Bei mir werden diese Befehle jedesmal gesendet, wenn die Taste "Rot" 
gedrückt wird. Es werden nur 2x8 Bit übertragen. Jedoch können belibig 
viele Daten übertragen werden. Zu beachten ist nur, dass der Empfänger 
einen Puffer von 16 Bit hat, sodass die Daten schnell genug abgehölt 
werden müssen.

Die "send" Routine sieht folgendermassen aus:
------------------------------------------------------------------------ 
---
// Prozedur um Daten über FSK zu senden
void send(char data)
  {
  int i;
  for (i=0; i<8; i++)
    {
    while (!NIRQ) {};
    while (NIRQ) {};
    if(data&0x80) {FSK=1;}
    else {FSK=0;}
    data=data<<1;
    }
  }
------------------------------------------------------------------------ 
---
Hierbei wird zunächst gewartet, bis NIRQ auf "1" geht. Danach wird so 
lange gewartet, bis NIRQ wieder auf "0" geht um das erste Datenbit an 
FSK anzulegen. Dies wird widerholt, bis das Byte komplett ist.


Kommen wir nun zum Empfänger:

Der Empfänger wird wie folgt Initialisiert:
------------------------------------------------------------------------ 
---
// Funkmodul initialisieren
void RFM01_INIT(void)
  {
  spi_init(0x00,0x00);
  spi_init(0x89,0x8A);  // 134kHz
  spi_init(0xA6,0x40);  // 434 MHz
  spi_init(0xC8,0x47);  // 4,8kbps
  spi_init(0xC6,0x9B);  // AFC setting
  spi_init(0xC4,0x2A);  // Clock recovery manual control,
                        // Digital filter, DQD=4
  spi_init(0xCE,0xF4);  // use FIFO
  spi_init(0xCE,0xF7);
  spi_init(0xC0,0x81);
  }
------------------------------------------------------------------------ 
---
Hierbei wird das Empfängermodul so eingestellt, dass es na 8 empfangenen 
Bits den NIRQ Pin auf low zieht. Die "spi_init" Routine ist die selbe 
wie beim Sender.

Auslesen der Daten:
------------------------------------------------------------------------ 
---
while (!NIRQ)
       {
       read();
       spi_init(0xCE, 0xF4);  // FIFO sync word
       spi_init(0xCE, 0xF7);  // FIFO fill und enable
       }
------------------------------------------------------------------------ 
---
Sobald NIRQ auf "0" geht stehen Daten bereit die abgeholt werden können. 
Dies geschieht über die "read" Prozedur.
------------------------------------------------------------------------ 
---
// Daten von RF-Modul einlesen (8Bit)
void read(void)
{
data=0;
LATBbits.LATB6=0;         // SCK RF-Empfänger
PORTBbits.RB4=0;          // SDI RF-Empfänger
LATCbits.LATC6=0;         // Chip Select RF-Empfänger

for(i=0;i<16;i++)         // skip status bits
  {
  LATBbits.LATB6=1;       // SCK RF-Empfänger
  Delay1TCY();            // Pause 1 µC Zyclus
  Delay1TCY();            // Pause 1 µC Zyclus
  LATBbits.LATB6=0;       // SCK RF-Empfänger
  Delay1TCY();            // Pause 1 µC Zyclus
  }

for(i=0;i<8;i++)          // read fifo data byte
  {
  data=data<<1;
  if(PORTBbits.RB4)       // Speichern der Daten in "data"
    {
    data|=1;
    }
  LATBbits.LATB6=1;       // SCK RF-Empfänger
  Delay1TCY();            // Pause 1 µC Zyclus
  Delay1TCY();            // Pause 1 µC Zyclus
  LATBbits.LATB6=0;       // SCK RF-Empfänger
  Delay1TCY();            // Pause 1 µC Zyclus
  Delay1TCY();            // Pause 1 µC Zyclus
  }
LATCbits.LATC6=1;         // SCK RF-Empfänger
}
------------------------------------------------------------------------ 
---
Danach ist das empfangene Byte in "data" gespeichert.

Ich hoffe das hilft um die Module in Betrieb zu nehmen.
Viel Erfolg!

: Verschoben durch User
von Marc K. (dergruenekobold)


Lesenswert?

Mir ist gerade noch ein Fehler im Bild "Sender" aufgefallen. "NIRQ" ist 
mit Pin 13 und "FSK" mit Pin 12 des µC verbunden.

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.