Rev Author Line No. Line
2112 kakl 1 /*********************************************
2 *
2126 kakl 3 * RFM02 simple library
4 *
2129 kakl 5 * $HeadURL: file:///data/svnData/MLAB/Designs/duckweed_collector/SW/library/RF02/RF02.cpp $
2128 kakl 6 * $Id: RF02.cpp 2129 2011-08-18 18:40:43Z kakl $
2112 kakl 7 *
2126 kakl 8 * code based on the code of "benedikt k." and "contrechoc"
2112 kakl 9 *
2126 kakl 10 * arduino 22
2112 kakl 11 *
12 *********************************************/
13  
14  
15 #include <avr/io.h>
16 #include <avr/interrupt.h>
17 #include <stdlib.h>
18 #include <avr/pgmspace.h>
19 #include <avr/eeprom.h>
20  
21 #include <string.h>
22  
23 #include "rf02.h"
24 #include <util/delay.h>
25  
26 #define F_CPU 16000000UL
27  
28 #define RF_PORT PORTB
29 #define RF_DDR DDRB
30 #define RF_PIN PINB
31  
32 #define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8
33 #define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9
34 #define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10
35 #define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12
36 //------------------// FSK: Pullupto VCC
37  
38 #ifndef cbi
39 #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
40 #endif
41 #ifndef sbi
42 #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
43 #endif
44  
45  
46 unsigned char test[32]=" 55555 \n";
47  
2125 kakl 48 void rf02_changeText( unsigned char* ptr, uint8_t number)
49 {
2112 kakl 50  
51 if (number> 32)number = 32;
52 memcpy( test, ptr, number);
53  
54 }
55  
2125 kakl 56 void rf02_prepAll()
57 {
58 RF_PORT=(1<<CS);
59 RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
2112 kakl 60  
2125 kakl 61 sbi(RF_PORT, FSK);
2112 kakl 62  
63  
2125 kakl 64 for (unsigned char i=0; i<15; i++) _delay_ms(10); // wait until POR done
2112 kakl 65  
66  
2125 kakl 67 rf02_trans(0xCC00); //*//
2112 kakl 68  
2125 kakl 69 // rf02_trans(0x8B61); //*//
70 rf02_trans(0x8000|0x1000|0x70|0x02); //*//
71 rf02_trans(0xA000|0x640); //*//
72 // rf02_trans(0xA640); ///= 434 MHz
2112 kakl 73  
2125 kakl 74 // rf02_trans(0xD2C0); // 33% PLL current
75 // rf02_trans(0xC823); // 9600 Bd
76 rf02_trans(0xD040); // RATE/2
77 rf02_trans(0xC811); // 19200 => 9600 Bd
2112 kakl 78  
2125 kakl 79 rf02_trans(0xC0E0); // power settings
80  
81 rf02_trans(0xC220); //0xC2A0
82 // rf02_trans(0xB100);
83 // rf02_trans(0x8F83);
84 //!!!
85 // rf02_trans(0xC001);
86  
87  
2112 kakl 88 }
89  
2125 kakl 90 void rf02_sendData()
91 {
2112 kakl 92  
2125 kakl 93 //!!! rf02_txdata( test, sizeof test);
94 rf02_txdata( test, 23);
95 }
2112 kakl 96  
97 void rf02_trans(unsigned short value)
2125 kakl 98 {
99 uint8_t i;
2112 kakl 100  
101 cbi(RF_PORT, CS);
102  
103 for (i=0; i<16; i++)
104 { if (value&0x8000) //0x8000
105 sbi(RF_PORT, SDI);
106 else
107 cbi(RF_PORT, SDI);
108  
109 sbi(RF_PORT, SCK);
110 value<<=1;
111 _delay_us(0.3);
112 cbi(RF_PORT, SCK);
113 }
114 sbi(RF_PORT, CS);
115 }
116  
117  
118 void rf02_txdata( unsigned char * data, uint8_t number)
119 {
120 uint8_t i,value;
121 value=0xC6; //1100 0110
122 cbi(RF_PORT, CS); //nSel
123  
2125 kakl 124 //!!!!
125 // rf02_trans(0xC039); // TX start
126  
127  
2112 kakl 128 for (i=0; i<8; i++)
129 { if (value&0x80) //1000 0000 = 80
130 sbi(RF_PORT, SDI);
131 else
132 cbi(RF_PORT, SDI);
133  
134 sbi(RF_PORT, SCK);
135 value<<=1;
136 _delay_us(0.2);
137 cbi(RF_PORT, SCK);
138 }
139  
140 rf02_shiftout(0xAA);//10101010
141 rf02_shiftout(0xAA);
142 rf02_shiftout(0xAA);
143 rf02_shiftout(0x2D);//00101101
144 rf02_shiftout(0xD4);//11010100
145  
146 // no checkbit, in experimenting some letters were transmitted wrong!
147  
148 for (i=0; i<number; i++)
149 rf02_shiftout(*data++);
150  
151 sbi(RF_PORT, CS);
152 while(RF_PIN&(1<<IRQ)); // wait until transfer done
153 rf02_trans(0xC464); // TX off after 10us
2125 kakl 154 //rf02_trans(0xC001); // TX close
155 _delay_ms(10);
2112 kakl 156 }
157  
158 void rf02_shiftout(unsigned char value)
159 { uint8_t j;
160 for (j=0; j<8; j++)
161 { while(RF_PIN&(1<<IRQ));
162 while(!(RF_PIN&(1<<IRQ)));
163  
164 if (value&128) //100101000
2125 kakl 165 {
166 sbi(RF_PORT, SDI);
167 }
2112 kakl 168 else
2125 kakl 169 {
2112 kakl 170 cbi(RF_PORT, SDI);
2125 kakl 171 }
2112 kakl 172 value<<=1;
173 }
174 }
175