Hallo,
ich hatte mit meinen RFM12B ähnliche Probleme, mit so ziemlich jeder
Bibliothek. Irgendwann habe ich den Code dann so geschrieben:
vielleicht hilft's dir...
-------schnipp-----------
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 8000000UL
#include <util/delay.h>
// RFM12B Sender auf Basis ATtiny45
// RFM12B interface angepasst auf ATtiny45
#define SCK 2 // PB2
#define SDO 0 // PB0 MOSI
#define SDI 1 // PB1
#define CS 3 // PB3 ..
#define NIRQ 4 // PortB INT0
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while (PINB&(1<<NIRQ))
#define LED 5 // PortD 6
#define LED_OFF() PORTB &= ~(1<<LED)
#define LED_ON() PORTB |= (1<<LED)
#define nop() _asm__ __volatile_ ("nop" ::)
void portInit()
{
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK) | (1 <<LED);
}
unsigned int writeCmd(unsigned int cmd)
{
unsigned char i;
unsigned int recv;
recv = 0;
LO(CS);
LO(SCK);
for (i=0; i<16; i++)
{
if (cmd & 0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if (PINB & (1<<SDO)) recv |= 0x0001;
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit()
{
writeCmd(0x80E7); // EL, EF, 868 MHz, 12 pF
writeCmd(0x8238); // 8239- Transmit !
writeCmd(0xA640); // freq select
writeCmd(0xC647); // 4800 baud
writeCmd(0x94A4); // 94A0- : VDI, Fast, 0dBm, -103dBm
writeCmd(0xC2AC); // AL, !ml, DIG, DQD4
writeCmd(0xCA81); // FIFO8, SYNC, !ff, DR (FIFO level=8)
//writeCmd(0xCED4); // Sync=2DD4
writeCmd(0xC483); // @PWR, NO RSTRIC, !st, !fi, OE, EN
writeCmd(0x9850); // !mp, 90Khz, MAX OUT
//writeCmd(0xCC17); // !OB!, !OB0, LPX, !ddy, DDIT, BWO
writeCmd(0xE000); // not used
writeCmd(0xC800); // not used
writeCmd(0xC090); // c040- 1,66 MHz, 2.2V
}
void rfSend(unsigned char data)
{
unsigned int cmd;
unsigned char i;
cmd = 0xB800 + data;
LO(CS);
LO(SCK);
for (i=0; i<16; i++)
{
if (cmd & 0x8000) HI(SDI); else LO(SDI);
HI(SCK);
nop();
LO(SCK);
cmd<<=1;
}
// warten bis SDO=1 wird, erst dann ist das
// TX Register fürs nächste Byte bereit
while ( (PINB & (1<<SDO)) == 0)
{
nop();
}
HI(CS);
}
int main()
{
unsigned char base;
volatile unsigned int i,k;
char txMsg[18];
int adval;
base = 00;
// das hier scheint zum stabilen Betrieb nötig zu sein..
asm("cli");
for (i=0; i<1000; i++) for (k=0; k<100; k++);
portInit();
rfInit();
for (i=0; i<1000; i++) for (k=0; k<100; k++);
// damit etwas halbvoll sinnvolles passiert, versenden
// wir eine Textnachricht die den internen Temperatursensor
// des ATtiny enthält
ADMUX=0x8F; // int 1.1 V ref,
ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADATE | 0<<ADPS2 | 1<<ADPS1 |
1<<ADPS0;;
ADCSRB = 0;
while (1)
{
LED_ON();
// 0123456789abcdef
// ii.aaaa.abcd0123
adval = ADCW;
sprintf(txMsg, "%02x.%04d°.abcd012",
base, adval );
writeCmd(0x0000);
rfSend(0xAA);
rfSend(0xAA);
rfSend(0xAA);
rfSend(0x2D);
rfSend(0xD4);
for (i=0; i<16; i++) rfSend(txMsg[i]);
rfSend(0xAA);
rfSend(0xAA);
rfSend(0xAA);
LED_OFF();
// ca 10 sec Pause
for (i=0; i<1000; i++) for (k=0; k<123; k++);
// irgendso ein Zähler...
base++;
}
}
-------schnapp-----------