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