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