/*********************************************** 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 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#define FSK 3 // FSK, <- RF02 Atmega PB3 Arduino ???//------------------// 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))#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_prepAll(){RF_PORT=(1<<CS);RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);sbi(RF_PORT, FSK);for (unsigned char i=0; i<15; i++) _delay_ms(10); // wait until POR donerf02_trans(0xCC00); //*//// rf02_trans(0x8B61); //*//rf02_trans(0x8000|0x1000|0x70|0x02); //*//rf02_trans(0xA000|0x640); //*//// rf02_trans(0xA640); ///= 434 MHz// rf02_trans(0xD2C0); // 33% PLL current// rf02_trans(0xC823); // 9600 Bdrf02_trans(0xD040); // RATE/2rf02_trans(0xC811); // 19200 => 9600 Bdrf02_trans(0xC0E0); // power settingsrf02_trans(0xC220); //0xC2A0// rf02_trans(0xB100);// rf02_trans(0x8F83);//!!!// rf02_trans(0xC001);}void rf02_sendData(){//!!! rf02_txdata( test, sizeof test);rf02_txdata( test, 23);}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_txdata( unsigned char * data, uint8_t number){uint8_t i,value;value=0xC6; //1100 0110cbi(RF_PORT, CS); //nSel//!!!!// rf02_trans(0xC039); // TX startfor (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//rf02_trans(0xC001); // TX close_delay_ms(10);}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) //100101000{sbi(RF_PORT, SDI);}else{cbi(RF_PORT, SDI);}value<<=1;}}