Forum: Mikrocontroller und Digitale Elektronik RFM01, RFM02 - Frage


von wasp (Gast)


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):
1
void main()
2
{   
3
   delay_ms(1000);         // wait until POR done
4
   RF1_Init();
5
   while (1)
6
   {  
7
      LED=0; 
8
      rf01_rxdata(data, 32);   
9
      LED=1;
10
   delay_ms(100);
11
   }
12
}
13
//-----------------------------------------------------------
14
void RF1_Init( void )
15
{
16
   nSEL=1;
17
   SDI=1;
18
   SCK=0;
19
   LED=0;
20
21
   WriteCMD(0xC2E0);         //RFM01 - LB Det./Clock Div. Command
22
      //Vlb = 2.2 V
23
      //Clock output = 10 MHz
24
25
   WriteCMD(0xC42B);     //RFM01 - Datafilter Command
26
      //al : Clock recovery auto lock = 0
27
      //ml : Clock recovery lock control = 0
28
      //Filter type = Digital
29
      //DQD threshold = 3
30
31
   WriteCMD(0xCE88);           //RFM01 - FIFO Command
32
      //ff : FIFO fill = 0
33
      //fe : Enable 16 Bit FIFO = 0
34
      //FIFO fill start condition = VDI & Sync. Word
35
      //FIFO IT level = 8
36
37
   WriteCMD(0xC6F7);     //RFM01 - AFC Command
38
      //AFC automatic mode = Offset always
39
      //st : Strobe edge = 0
40
      //fi : Fine mode = 1
41
      //oe : Offset register enable = 1
42
      //en : Calculate offset = 1
43
      //Range limit = +3fres to -4fres
44
      //Max. Deviation = +15kHz to -20kHz
45
46
   WriteCMD(0xE000);     //RFM01 - Wake-Up Timer Command
47
      //T wakeup = 0 ms
48
49
   WriteCMD(0xCC00);     //RFM01 - Low Duty-Cycle Command
50
      //en : Enable low duty-cycle = 0
51
      //Duty-cycle = N/A
52
53
   WriteCMD(0xA620);     //RFM01 - Frequency Command
54
      //Set center frequency to 867.84 MHz
55
56
   WriteCMD(0x9178);     //RFM01 - Configuration Command
57
      //eb : Enable low battery detector = 0
58
      //et : Enable wake-up timer = 0
59
      //ex : Enable crystal osc. during sleep = 1
60
      //dc : Disable clock output = 0
61
      //Select 868 MHz band
62
      //Select 12 pF crystal load capacitor
63
      //Receiver bandwidth = 200 kHz
64
65
   WriteCMD(0xC811);     //RFM01 - Datarate Command
66
      //Set datarate to 19.15708 kbps
67
}
68
//---------------------------------------------------------
69
void rf01_rxdata(uchar *data, uchar number)
70
{   uchar i,j,c;
71
72
   WriteCMD(0xC0D9);     //RFM01 - Receiver Setting Command
73
      //en : Enable receiver ch. / crystal osc. = 1
74
      //VDI output = Always on
75
      //LNA gain = -6 dB
76
      //RSSI threshold = -79 dBm
77
78
   WriteCMD(0xCE89);              //RFM01 - FIFO Command
79
      //ff : FIFO fill = 0
80
      //fe : Enable 16 Bit FIFO = 1
81
      //FIFO fill start condition = VDI & Sync. Word
82
      //FIFO IT level = 8
83
84
   WriteCMD(0xCE8B);              //RFM01 - FIFO Command
85
      //ff : FIFO fill = 1
86
      //fe : Enable 16 Bit FIFO = 1
87
      //FIFO fill start condition = VDI & Sync. Word
88
      //FIFO IT level = 8
89
90
   SDI=0; 
91
               
92
   for (i=0; i<number; i++)
93
   {   nSEL=0;     
94
      while (!SDO);    
95
      for (j=0; j<16; j++)  
96
      {   SCK=1;     
97
         #asm NOP #endasm
98
         SCK=0;     
99
      }
100
      c=0;
101
      for (j=0; j<8; j++)
102
      {   c<<=1;
103
         if(SDO)       
104
          c|=1;
105
         SCK=1;         
106
         #asm NOP #endasm    
107
         SCK=0;   
108
      }
109
      *data++=c;
110
      nSEL=1;        
111
   }
112
   WriteCMD(0xC0D8);      // RX off
113
}

Da ist meine code (abgekürzt) für RFM02:
1
void main()
2
{
3
   delay_ms(1000);         // wait until POR done
4
   RF2_Init();
5
   
6
   while (1)
7
   {
8
    LED=0;
9
            rf02_txdata(test,32);
10
   LED=1;   
11
            delay_ms(1000); 
12
   }
13
}
14
//-------------------------------------------
15
void RF2_Init( void )
16
{
17
   WriteCMD(0xC0E0);   //RFM02 - Power Management Command
18
         //a1 : Automatic control Bit1 = 1
19
         //a0 : Automatic control Bit0 = 1
20
         //ex : Enable crystal oscillator = 1
21
         //es : Enable synthesizer = 0
22
         //ea : Enable power amplifier = 0
23
         //eb : Enable low battery detector = 0
24
         //et : Enable wake-up timer = 0
25
         //dc : Disable clock output = 0
26
27
   WriteCMD(0xC2A0);   //RFM02 - LB Det./TX Sync. Command
28
         //Vlb = 2.2 V
29
         //dwc : Disable wake-up timer calibration = 1
30
         //ebs : Enable TX bit synchronization = 1
31
   
32
   WriteCMD(0xA620);   //RFM02 - Frequency Command
33
         //Set center frequency to 867.84 MHz
34
35
   WriteCMD(0xB400);   //RFM02 - Power Setting Command
36
         //Set output power to -12 dB
37
38
   WriteCMD(0x9787);   //RFM02 - Configuration Command
39
         //Select 868 MHz band
40
         //Select 12.5 pF crystal load capacitor
41
         //10 MHz clock output
42
         //df(fsk) = 240 kHz
43
         //ms : FSK sign = 0
44
45
   WriteCMD(0xD2C0);   //RFM02 - PLL Command
46
         //Set PLL current to 33%
47
48
   WriteCMD(0xC811);   //RFM02 - Datarate Command
49
         //Set datarate to 19.15708 kbps
50
}
51
//------------------------------------------------------------
52
void rf02_txdata(uchar *data, uchar number)
53
{   uchar i,wert;
54
   wert=0xC6;
55
   nSEL=0;         
56
   for (i=0; i<8; i++)
57
   {   if (wert&128)
58
         SDI=1;     
59
      else
60
         SDI=0;       
61
      SCK=1;         
62
      wert<<=1;
63
      delay_us(1);    
64
      SCK=0;      
65
   }
66
      rf02_shiftout(0xAA);
67
      rf02_shiftout(0xAA);
68
      rf02_shiftout(0xAA);
69
      rf02_shiftout(0x2D);
70
      rf02_shiftout(0xD4);
71
   #asm NOP NOP #endasm
72
   for (i=0; i<number; i++)
73
      rf02_shiftout(*data++);
74
   nSEL=1; 
75
   while(nIRQ); 
76
   WriteCMD(0xC464);   //RFM02 - Sleep Command
77
         //Sleep after 64h (100dec) periods of the clock output    
78
}
79
80
void rf02_shiftout(uchar wert)
81
{   unsigned char j;
82
   for (j=0; j<8; j++)
83
   {   while(nIRQ);   
84
       while(!nIRQ);  
85
      if (wert&128)
86
          SDI=1;   
87
       else
88
          SDI=0;  
89
       wert<<=1;
90
    }
91
}
Ich werde glücklich, wenn jemand mir sagt, wo der Fehler ist

Danke im Voraus

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.