/*********************************************** draft version v 0.1, experimental** code based on the code of "benedikt k."* this was an avr project from the site: http://www.mikrocontroller.net/topic/65984#541030*** code should be matched with RF01** up to now no transmission between the RF12 modules and Jeelabs.com RF12 lib** this code has worked: transmitting using atmega168 and atmega328 in combination with RF01s and RF02s** arduino 18** five march, contrechoc.com, 2010, june***********************************************/#include <avr/io.h>#include <avr/interrupt.h>#include <stdlib.h>#include <avr/pgmspace.h>#include <avr/eeprom.h>#include <string.h>#include "rf02.h"#include <util/delay.h>#define F_CPU 16000000UL#define RF_PORT PORTB#define RF_DDR DDRB#define RF_PIN PINB#define LED_PORT PORTD#define LED_DDR DDRD#define LED_PIN PIND#define LED0 4 -- PD4#define LED1 2 -- PD2#define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8#define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9#define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10#define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12//------------------// FSK: Pullupto VCC#ifndef cbi#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))#endif#ifndef sbi#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))#endif#ifndef cLED0#define cLED0() (LED_PORT &= ~(1<<LED0))#endif#ifndef sLED0#define sLED0() (LED_PORT |= (1<<LED0) )#endif#ifndef cLED1#define cLED1() (LED_PORT &= ~(1<<LED1))#endif#ifndef sLED1#define sLED1() (LED_PORT |= (1<<LED1) )#endifunsigned char test[32]=" 55555 \n";void rf02_changeText( unsigned char* ptr, uint8_t number){if (number> 32)number = 32;memcpy( test, ptr, number);}void rf02_prepAll434(){rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)rf02_setfreq(RF02FREQ(434)); // 433,92MHzrf02_setpower(1); // -12dBm Ausgangangsleistungrf02_setmodfreq(3); // 120kHz Frequenzshiftrf02_setbaud(19200); // 19200 Baud}//void rf02_prepAll(unsigned short freq, uint8_t setPower,uint8_t modFreq,unsigned short baudRate){rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)rf02_setfreq( RF02FREQ(freq) ); // Sende/Empfangsfrequenz auf 433,92MHz einstellenif ( setPower < 0 ) setPower = 0;if ( setPower > 4 ) setPower = 4;rf02_setpower(setPower); // -12dBm Ausgangangsleistungif ( modFreq < 0 ) modFreq = 0;if ( modFreq > 8 ) modFreq = 8;rf02_setmodfreq(modFreq); // 120kHz Frequenzshiftrf02_setbaud(baudRate); // 19200 Baud}//void rf02_sendData(){rf02_txdata( test, sizeof test);}void rf02_trans(unsigned short value){ uint8_t i;cbi(RF_PORT, CS);for (i=0; i<16; i++){ if (value&0x8000) //0x8000sbi(RF_PORT, SDI);elsecbi(RF_PORT, SDI);sbi(RF_PORT, SCK);value<<=1;_delay_us(0.3);cbi(RF_PORT, SCK);}sbi(RF_PORT, CS);}void rf02_init(void){RF_PORT=(1<<CS);RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);for (unsigned char i=0; i<15; i++)_delay_ms(10); // wait until POR donerf02_trans(0xC0E0); // power settingsrf02_trans(0x8A75);// fsk in rfm02 = afc in rf12// rf02_trans(0x80C7);rf02_trans(0xC2A0); // enable tx sync bit, disable low bat detector//LED_DDR= 0xFF;}void rf02_setmodfreq(uint8_t bandwidth){rf02_trans(0x8F80|(bandwidth&7));//rf02_trans(0x8F70);}void rf02_setfreq(unsigned short freq){ if (freq<96) // 430,2400MHzfreq=96;else if (freq>3903) // 439,7575MHzfreq=3903;rf02_trans(0xA000|freq);//rf02_trans(0xA640); //= 434 MHz}void rf02_setpower(uint8_t power){rf02_trans(0xB000|((power&7)<<8));}void rf02_setbaud(unsigned short baud){if (baud<1345)baud=1345;if (baud<19000)rf02_trans(0xD240); // 25% PLL currentelse if (baud<37000)rf02_trans(0xD2C0); // 33% PLL currentelserf02_trans(0xD200); // 50% PLL current//rf02_trans(0xC800|((344828UL/baud)-1)); // Baudrate= 344827,59/(R+1)rf02_trans(0xC806);}void rf02_txdata( unsigned char * data, uint8_t number){uint8_t i,value;value=0xC6; //1100 0110cbi(RF_PORT, CS); //nSelfor (i=0; i<8; i++){ if (value&0x80) //1000 0000 = 80sbi(RF_PORT, SDI);elsecbi(RF_PORT, SDI);sbi(RF_PORT, SCK);value<<=1;_delay_us(0.2);cbi(RF_PORT, SCK);}rf02_shiftout(0xAA);//10101010rf02_shiftout(0xAA);rf02_shiftout(0xAA);rf02_shiftout(0x2D);//00101101rf02_shiftout(0xD4);//11010100// no checkbit, in experimenting some letters were transmitted wrong!for (i=0; i<number; i++)rf02_shiftout(*data++);sbi(RF_PORT, CS);while(RF_PIN&(1<<IRQ)); // wait until transfer donerf02_trans(0xC464); // TX off after 10us}void rf02_shiftout(unsigned char value){ uint8_t j;for (j=0; j<8; j++){ while(RF_PIN&(1<<IRQ));while(!(RF_PIN&(1<<IRQ)));if (value&128) //100101000sbi(RF_PORT, SDI);elsecbi(RF_PORT, SDI);value<<=1;}}