1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "global.h"
|
4 | #include "rf02.h"
|
5 |
|
6 | #include <util/delay.h>
|
7 |
|
8 | #define SDI_PORT PORTB
|
9 | #define SDI_DDR DDRB
|
10 | #define SDI_PIN PINB
|
11 |
|
12 | #define SCK_PORT PORTB
|
13 | #define SCK_DDR DDRB
|
14 | #define SCK_PIN PINB
|
15 |
|
16 | #define CS_PORT PORTB
|
17 | #define CS_DDR DDRB
|
18 | #define CS_PIN PINB
|
19 |
|
20 | #define IRQ_PORT PORTD
|
21 | #define IRQ_DDR DDRD
|
22 | #define IRQ_PIN PIND
|
23 |
|
24 | #define FSK_PORT PORTB
|
25 | #define FSK_DDR DDRB
|
26 | #define FSK_PIN PINB
|
27 |
|
28 | #define SDI 5 // SDI, -> RF02
|
29 | #define SCK 7 // SCK, -> RF02
|
30 | #define CS 4 // nSEL, -> RF02
|
31 | #define FSK 3 // FSK, -> RF02
|
32 | #define IRQ 2 // nIRQ, <- RF02
|
33 |
|
34 | // FSK: Pullup oder Pulldown
|
35 |
|
36 | void rf02_trans(unsigned short wert)
|
37 | { unsigned char i;
|
38 |
|
39 | cbi(CS_PORT, CS);
|
40 | for (i=0; i<16; i++)
|
41 | { if (wert&32768)
|
42 | sbi(SDI_PORT, SDI);
|
43 | else
|
44 | cbi(SDI_PORT, SDI);
|
45 | sbi(SCK_PORT, SCK);
|
46 | wert<<=1;
|
47 | _delay_us(0.3);
|
48 | cbi(SCK_PORT, SCK);
|
49 | }
|
50 | sbi(CS_PORT, CS);
|
51 | }
|
52 |
|
53 | void rf02_init(void)
|
54 | {
|
55 | CS_DDR |= (1<<CS);
|
56 | CS_PORT |= (1<<CS);
|
57 | SDI_DDR |= (1<<SDI);
|
58 | SCK_DDR |= (1<<SCK);
|
59 | FSK_DDR |= (1<<FSK);
|
60 | FSK_PORT &= ~(1<<FSK);
|
61 |
|
62 | for (unsigned char i=0; i<15; i++)
|
63 | _delay_ms(10); // wait until POR done
|
64 | rf02_trans(0xC0E0); // power settings
|
65 | rf02_trans(0x8F80);
|
66 | rf02_trans(0xC2A0); // enable tx sync bit, disable low bat detector
|
67 | }
|
68 |
|
69 | void rf02_setmodfreq(unsigned char bandwidth)
|
70 | {
|
71 | rf02_trans(0x8F80|(bandwidth&7));
|
72 | }
|
73 |
|
74 | void rf02_setfreq(unsigned short freq)
|
75 | { if (freq<96) // 430,2400MHz
|
76 | freq=96;
|
77 | else if (freq>3903) // 439,7575MHz
|
78 | freq=3903;
|
79 | rf02_trans(0xA000|freq);
|
80 | }
|
81 |
|
82 | void rf02_setpower(unsigned char power)
|
83 | {
|
84 | rf02_trans(0xB000|((power&7)<<8));
|
85 | }
|
86 |
|
87 | void rf02_setbaud(unsigned short baud)
|
88 | {
|
89 | if (baud<1345)
|
90 | baud=1345;
|
91 | if (baud<19000)
|
92 | rf02_trans(0xD240); // 25% PLL current
|
93 | else if (baud<37000)
|
94 | rf02_trans(0xD2C0); // 33% PLL current
|
95 | else
|
96 | rf02_trans(0xD200); // 50% PLL current
|
97 | rf02_trans(0xC800|((344828UL/baud)-1)); // Baudrate= 344827,59/(R+1)
|
98 | }
|
99 |
|
100 | void rf02_txdata(unsigned char *data, unsigned char number)
|
101 | { unsigned char i,wert;
|
102 | wert=0xC6;
|
103 | cbi(CS_PORT, CS);
|
104 | for (i=0; i<8; i++)
|
105 | {
|
106 | if (wert&128)
|
107 | sbi(SDI_PORT, SDI);
|
108 | else
|
109 | cbi(SDI_PORT, SDI);
|
110 | sbi(SCK_PORT, SCK);
|
111 | wert<<=1;
|
112 | _delay_us(0.2);
|
113 | cbi(SCK_PORT, SCK);
|
114 |
|
115 | }
|
116 | rf02_shiftout(0xAA);
|
117 | rf02_shiftout(0xAA);
|
118 | rf02_shiftout(0xAA);
|
119 | rf02_shiftout(0x2D);
|
120 | rf02_shiftout(0xD4);
|
121 | for (i=0; i<number; i++)
|
122 | rf02_shiftout(*data++);
|
123 | sbi(CS_PORT, CS);
|
124 | while(IRQ_PIN&(1<<IRQ)); // wait until transfer done
|
125 | rf02_trans(0xC464); // TX off after 10us
|
126 | }
|
127 |
|
128 | void rf02_shiftout(unsigned char wert)
|
129 | { unsigned char j;
|
130 | for (j=0; j<8; j++)
|
131 | {
|
132 | while(IRQ_PIN&(1<<IRQ));
|
133 | while(!(IRQ_PIN&(1<<IRQ)));
|
134 | if (wert&128)
|
135 | sbi(SDI_PORT, SDI);
|
136 | else
|
137 | cbi(SDI_PORT, SDI);
|
138 | wert<<=1;
|
139 | }
|
140 | }
|