mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM01, RFM02 - Frage


Autor: wasp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Sorry wenn mein Deutsch nicht ganz gut ist, aber nur in dem Forum habe 
ich viel Info über RF01, -02, 12 von Hoperf gefunden. Und nur hier sind 
die Leute, die kennen mit diesen Dingen wirklich gut aus.
Zuerst vielen Dank an Benedikt für seine Beispielcode für RF01 und RF02.
Mit seine Hilfe mein Sender RFM02 (868 MHz) mit PIC16F676 (nur für 
Test-Zwecke) jetzt funktioniert (hoffe ich). Mindestens RF02 lässt sich 
einstellen, taktet an nIRQ-pin und PIC schickt richtige Daten raus (das 
kann ich mit Oszi sehen). Und auserdem mit FM-Radio  höre ich Impulse 
wenn RF02 sendet.
Aber
RF01 macht mir Probleme. Der bleibt immer in der
rf01_rxdata(...) – Routine
auf der Stelle
while (!SDO);
hängen. Wenn ich Status-Register auslese, dann klar warum es so ist. Nur 
“FIFO is empty” und “Toggling in each AFC cycle” sind 1, alle andere 
sind 0. Und egal ist, ob Sender läuft oder nicht.
Ich habe hier gelesen: „Man muss mit den Gain- und AFC-Bits eine ganze 
Weile spielen“, und genug gespielt habe, aber trotzdem – kein Ergebnis. 
Gibt es wahrscheinlich eine Methode – was muss man zuerst, was danach 
ändern? Und wie hängen solche Parameter wie Gain-, AFC-Bits, Bandbreite, 
PLL,  fDeviation...  zusammen?

Da ist meine code (abgekürzt) für RFM01 (compiler CCS PCWH):
void main()
{   
   delay_ms(1000);         // wait until POR done
   RF1_Init();
   while (1)
   {  
      LED=0; 
      rf01_rxdata(data, 32);   
      LED=1;
   delay_ms(100);
   }
}
//-----------------------------------------------------------
void RF1_Init( void )
{
   nSEL=1;
   SDI=1;
   SCK=0;
   LED=0;

   WriteCMD(0xC2E0);         //RFM01 - LB Det./Clock Div. Command
      //Vlb = 2.2 V
      //Clock output = 10 MHz

   WriteCMD(0xC42B);     //RFM01 - Datafilter Command
      //al : Clock recovery auto lock = 0
      //ml : Clock recovery lock control = 0
      //Filter type = Digital
      //DQD threshold = 3

   WriteCMD(0xCE88);           //RFM01 - FIFO Command
      //ff : FIFO fill = 0
      //fe : Enable 16 Bit FIFO = 0
      //FIFO fill start condition = VDI & Sync. Word
      //FIFO IT level = 8

   WriteCMD(0xC6F7);     //RFM01 - AFC Command
      //AFC automatic mode = Offset always
      //st : Strobe edge = 0
      //fi : Fine mode = 1
      //oe : Offset register enable = 1
      //en : Calculate offset = 1
      //Range limit = +3fres to -4fres
      //Max. Deviation = +15kHz to -20kHz

   WriteCMD(0xE000);     //RFM01 - Wake-Up Timer Command
      //T wakeup = 0 ms

   WriteCMD(0xCC00);     //RFM01 - Low Duty-Cycle Command
      //en : Enable low duty-cycle = 0
      //Duty-cycle = N/A

   WriteCMD(0xA620);     //RFM01 - Frequency Command
      //Set center frequency to 867.84 MHz

   WriteCMD(0x9178);     //RFM01 - Configuration Command
      //eb : Enable low battery detector = 0
      //et : Enable wake-up timer = 0
      //ex : Enable crystal osc. during sleep = 1
      //dc : Disable clock output = 0
      //Select 868 MHz band
      //Select 12 pF crystal load capacitor
      //Receiver bandwidth = 200 kHz

   WriteCMD(0xC811);     //RFM01 - Datarate Command
      //Set datarate to 19.15708 kbps
}
//---------------------------------------------------------
void rf01_rxdata(uchar *data, uchar number)
{   uchar i,j,c;

   WriteCMD(0xC0D9);     //RFM01 - Receiver Setting Command
      //en : Enable receiver ch. / crystal osc. = 1
      //VDI output = Always on
      //LNA gain = -6 dB
      //RSSI threshold = -79 dBm

   WriteCMD(0xCE89);              //RFM01 - FIFO Command
      //ff : FIFO fill = 0
      //fe : Enable 16 Bit FIFO = 1
      //FIFO fill start condition = VDI & Sync. Word
      //FIFO IT level = 8

   WriteCMD(0xCE8B);              //RFM01 - FIFO Command
      //ff : FIFO fill = 1
      //fe : Enable 16 Bit FIFO = 1
      //FIFO fill start condition = VDI & Sync. Word
      //FIFO IT level = 8

   SDI=0; 
               
   for (i=0; i<number; i++)
   {   nSEL=0;     
      while (!SDO);    
      for (j=0; j<16; j++)  
      {   SCK=1;     
         #asm NOP #endasm
         SCK=0;     
      }
      c=0;
      for (j=0; j<8; j++)
      {   c<<=1;
         if(SDO)       
          c|=1;
         SCK=1;         
         #asm NOP #endasm    
         SCK=0;   
      }
      *data++=c;
      nSEL=1;        
   }
   WriteCMD(0xC0D8);      // RX off
}

Da ist meine code (abgekürzt) für RFM02:
void main()
{
   delay_ms(1000);         // wait until POR done
   RF2_Init();
   
   while (1)
   {
    LED=0;
            rf02_txdata(test,32);
   LED=1;   
            delay_ms(1000); 
   }
}
//-------------------------------------------
void RF2_Init( void )
{
   WriteCMD(0xC0E0);   //RFM02 - Power Management Command
         //a1 : Automatic control Bit1 = 1
         //a0 : Automatic control Bit0 = 1
         //ex : Enable crystal oscillator = 1
         //es : Enable synthesizer = 0
         //ea : Enable power amplifier = 0
         //eb : Enable low battery detector = 0
         //et : Enable wake-up timer = 0
         //dc : Disable clock output = 0

   WriteCMD(0xC2A0);   //RFM02 - LB Det./TX Sync. Command
         //Vlb = 2.2 V
         //dwc : Disable wake-up timer calibration = 1
         //ebs : Enable TX bit synchronization = 1
   
   WriteCMD(0xA620);   //RFM02 - Frequency Command
         //Set center frequency to 867.84 MHz

   WriteCMD(0xB400);   //RFM02 - Power Setting Command
         //Set output power to -12 dB

   WriteCMD(0x9787);   //RFM02 - Configuration Command
         //Select 868 MHz band
         //Select 12.5 pF crystal load capacitor
         //10 MHz clock output
         //df(fsk) = 240 kHz
         //ms : FSK sign = 0

   WriteCMD(0xD2C0);   //RFM02 - PLL Command
         //Set PLL current to 33%

   WriteCMD(0xC811);   //RFM02 - Datarate Command
         //Set datarate to 19.15708 kbps
}
//------------------------------------------------------------
void rf02_txdata(uchar *data, uchar number)
{   uchar i,wert;
   wert=0xC6;
   nSEL=0;         
   for (i=0; i<8; i++)
   {   if (wert&128)
         SDI=1;     
      else
         SDI=0;       
      SCK=1;         
      wert<<=1;
      delay_us(1);    
      SCK=0;      
   }
      rf02_shiftout(0xAA);
      rf02_shiftout(0xAA);
      rf02_shiftout(0xAA);
      rf02_shiftout(0x2D);
      rf02_shiftout(0xD4);
   #asm NOP NOP #endasm
   for (i=0; i<number; i++)
      rf02_shiftout(*data++);
   nSEL=1; 
   while(nIRQ); 
   WriteCMD(0xC464);   //RFM02 - Sleep Command
         //Sleep after 64h (100dec) periods of the clock output    
}

void rf02_shiftout(uchar wert)
{   unsigned char j;
   for (j=0; j<8; j++)
   {   while(nIRQ);   
       while(!nIRQ);  
      if (wert&128)
          SDI=1;   
       else
          SDI=0;  
       wert<<=1;
    }
}
Ich werde glücklich, wenn jemand mir sagt, wo der Fehler ist

Danke im Voraus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.