1 | #include <avr/io.h>
|
2 | #include <stdlib.h>
|
3 | #include <avr/interrupt.h>
|
4 | #define F_CPU 10000000UL
|
5 | #include <util/delay.h>
|
6 | #define RF_PORT PORTB
|
7 | #define RF_DDR DDRB
|
8 | #define RF_PIN PINB
|
9 | |
10 | #define DDR_IN 0
|
11 | #define DDR_OUT 1
|
12 | |
13 | #define PORT_SEL PORTB
|
14 | #define PIN_SEL PINB
|
15 | #define DDR_SEL DDRB
|
16 | |
17 | #define PORT_SDI PORTB
|
18 | #define PIN_SDI PINB
|
19 | #define DDR_SDI DDRB
|
20 | |
21 | #define PORT_SCK PORTB
|
22 | #define PIN_SCK PINB
|
23 | #define DDR_SCK DDRB
|
24 | |
25 | #define PORT_NIRQ PORTB
|
26 | #define PIN_NIRQ PINB
|
27 | #define DDR_NIRQ DDRB
|
28 | |
29 | #define SCK 7 // SCK, -> RF02
|
30 | #define NIRQ 6 // nIRQ, -> RF02
|
31 | #define SDI 5 // SDI, -> RF02
|
32 | #define SEL 4 // nSEL, -> RF02
|
33 | #define DATA 3 // FSK, -> RF02
|
34 | |
35 | |
36 | #define SEL_OUTPUT() DDR_SEL |= (1<<SEL)
|
37 | #define HI_SEL() PORT_SEL |= (1<<SEL)
|
38 | #define LOW_SEL() PORT_SEL &=~(1<<SEL)
|
39 | |
40 | #define SDI_OUTPUT() DDR_SDI |= (1<<SDI)
|
41 | #define HI_SDI() PORT_SDI |= (1<<SDI)
|
42 | #define LOW_SDI() PORT_SDI &=~(1<<SDI)
|
43 | |
44 | #define NIRQ_INPUT() DDR_NIRQ &=~(1<<NIRQ)
|
45 | #define NIRQ_HI() PIN_NIRQ&(1<<NIRQ)
|
46 | |
47 | #define SCK_OUTPUT() DDR_SCK |=(1<<SCK)
|
48 | #define HI_SCK() PORT_SCK |=(1<<SCK)
|
49 | #define LOW_SCK() PORT_SCK &=~(1<<SCK)
|
50 | |
51 | |
52 | unsigned int RFXX_WRT_CMD( unsigned int aCmd) { // to send commands
|
53 | |
54 | unsigned char i;
|
55 | unsigned int temp;
|
56 | |
57 | LOW_SCK(); // reset bit SCK
|
58 | LOW_SEL(); // reset bit SEL
|
59 | for(i=0;i<16;i++)
|
60 | {
|
61 | temp<<=1; // temp=temp<<1;
|
62 | if(NIRQ_HI()) {
|
63 | temp|=0x0001; // temp is a 16-bit integer
|
64 | }
|
65 | LOW_SCK(); // reset bit SCK
|
66 | if(aCmd&0x8000) { // if((aCmd&0x8000)==0x8000)
|
67 | HI_SDI(); // set bit SDI
|
68 | }
|
69 | else {
|
70 | LOW_SDI();// reset bit SDI
|
71 | }
|
72 | HI_SCK(); // set bit SCK to shift data from SDI pin to RFM
|
73 | aCmd<<=1; // aCmd=aCmd<<1
|
74 | }
|
75 | LOW_SCK(); // reset bit SCK
|
76 | HI_SEL(); // set bit SEL
|
77 | return(temp);
|
78 | }
|
79 | |
80 | |
81 | void RF02B_SEND(unsigned char aByte) { // send a byte
|
82 | |
83 | unsigned char i;
|
84 | |
85 | for(i=0;i<8;i++)
|
86 | {
|
87 | while(NIRQ_HI()); // polling nIRQ
|
88 | while(!(NIRQ_HI()));
|
89 | if(aByte&0x80)
|
90 | {
|
91 | PORTB|=(1<<DATA); // set bit(FSK): request data input
|
92 | }
|
93 | else {
|
94 | PORTB&=~(1<<DATA); // reset bit(FSK): request data input
|
95 | }
|
96 | aByte<<=1; // aByte=aByte<<1
|
97 | }
|
98 | }
|
99 | |
100 | |
101 | void RFXX_PORT_INIT(void) { // initialise all neccesary ports
|
102 | HI_SEL(); // set bit SEL
|
103 | HI_SDI(); // set bit SDI
|
104 | LOW_SCK(); // reset bit SCK
|
105 | SEL_OUTPUT(); // set port SEL as output
|
106 | SDI_OUTPUT(); // set port SDI as output
|
107 | NIRQ_INPUT(); // set port SDO as input
|
108 | SCK_OUTPUT(); // set port SCK as output
|
109 | }
|
110 | |
111 | |
112 | void Send (unsigned int byte) {
|
113 | |
114 | unsigned int i, j, ChkSum;
|
115 | |
116 | ChkSum=0;
|
117 | RF02B_SEND(0xAA); // PREAMBLE
|
118 | RF02B_SEND(0xAA); // PREAMBLE
|
119 | RF02B_SEND(0xAA); // PREAMBLE
|
120 | RF02B_SEND(0x54); // Sync byte
|
121 | RF02B_SEND(byte); // Data0
|
122 | ChkSum+=byte;
|
123 | RF02B_SEND(byte); // Data1
|
124 | ChkSum+=byte;
|
125 | RF02B_SEND(byte); // Data2
|
126 | ChkSum+=byte;
|
127 | RF02B_SEND(byte); // Data3
|
128 | ChkSum+=byte;
|
129 | RF02B_SEND(byte); // Data4
|
130 | ChkSum+=byte;
|
131 | RF02B_SEND(byte); // Data5
|
132 | ChkSum+=byte;
|
133 | RF02B_SEND(byte); // Data6
|
134 | ChkSum+=byte;
|
135 | RF02B_SEND(byte); // Data7
|
136 | ChkSum+=byte;
|
137 | RF02B_SEND(ChkSum);// Data8
|
138 | RF02B_SEND(0xAA); // dummy byte
|
139 | |
140 | RFXX_WRT_CMD(0xC401); // (8) TX off
|
141 | |
142 | for(i=0;i<5000;i++)
|
143 | for(j=0;j<123;j++);
|
144 | }
|
145 | |
146 | void main(void) {
|
147 | |
148 | RFXX_PORT_INIT(); // initialise all neccesary ports
|
149 | |
150 | RFXX_WRT_CMD(0xCC00); // read internal status register content
|
151 | |
152 | RFXX_WRT_CMD(0x9731); // (2)
|
153 | // b1=1,d1=1,d0=1,x1=1,x0=1,m0=1
|
154 | // CLK freq 10MHz
|
155 | // Band 868MHz
|
156 | // 10pF
|
157 | // 60kHz deviation
|
158 | |
159 | RFXX_WRT_CMD(0xC031); // (3)
|
160 | // ex=1,es=1,dc=1
|
161 | // enable crystal oscillator
|
162 | // enable synthesizer
|
163 | // disable CLK pin
|
164 | // POWER AMPLIFY aanzetten?
|
165 | |
166 | RFXX_WRT_CMD(0xA640); // (4) 868MHz ( 860MHz + 6MHz )
|
167 | |
168 | RFXX_WRT_CMD(0xC823); // (5) 4.8kbps 0xC823 << nog delen door 2 (0xD040)
|
169 | // r6=1,r2=1,r1=1,r0=1
|
170 | |
171 | RFXX_WRT_CMD(0xB000); // (6) no relative power output
|
172 | |
173 | RFXX_WRT_CMD(0xC220); // (7) ebs=1
|
174 | // enable TX sync
|
175 |
|
176 | RFXX_WRT_CMD(0xC464); // (8) TX off after 10us (0xC464)
|
177 | |
178 | PORTB|=(1<<DATA); // set bit FSK
|
179 | DDRB|=(1<DATA); // set port FSK as output
|
180 | |
181 | |
182 | while(1) {
|
183 | for( int i=0;i<=50;i++)
|
184 | Send(0x0F);
|
185 | for( int i=0;i<=50;i++)
|
186 | Send(0xF0);
|
187 | }
|
188 | }
|