rf02.c


1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "global.h"
4
#include "rf02.h"
5
6
#include <util/delay.h>
7
8
#define SDI_PORT  PORTB
9
#define SDI_DDR    DDRB
10
#define SDI_PIN    PINB
11
12
#define SCK_PORT  PORTB
13
#define SCK_DDR    DDRB
14
#define SCK_PIN    PINB
15
16
#define CS_PORT    PORTD
17
#define CS_DDR    DDRD
18
#define CS_PIN    PIND
19
20
#define IRQ_PORT  PORTD
21
#define IRQ_DDR    DDRD
22
#define IRQ_PIN    PIND
23
24
#define FSK_PORT  PORTD
25
#define FSK_DDR    DDRD
26
#define FSK_PIN    PIND
27
28
#define SDI    3  // SDI,  -> RF02
29
#define SCK    5  // SCK,  -> RF02
30
#define CS    2  // nSEL, -> RF02
31
#define FSK    7  // FSK,   -> RF02
32
#define IRQ    2  // nIRQ, <- RF02
33
34
// FSK: Pullup oder Pulldown
35
36
void rf02_trans(unsigned short wert)
37
{  unsigned char i;
38
39
  cbi(CS_PORT, CS);
40
  for (i=0; i<16; i++)
41
  {  if (wert&32768)
42
      sbi(SDI_PORT, SDI);
43
    else
44
      cbi(SDI_PORT, SDI);
45
    sbi(SCK_PORT, SCK);
46
    wert<<=1;
47
    _delay_us(0.3);
48
    cbi(SCK_PORT, SCK);
49
  }
50
  sbi(CS_PORT, CS);
51
}
52
53
void rf02_init(void)
54
{
55
  CS_PORT |= (1<<CS);
56
  SDI_DDR |= (1<<SDI);
57
  SCK_DDR |= (1<<SCK);
58
  CS_DDR |= (1<<CS);
59
  FSK_DDR |= (1<<FSK);
60
  FSK_PORT |= (1<<FSK);
61
62
  for (unsigned char i=0; i<15; i++)
63
    _delay_ms(10);      // wait until POR done
64
  rf02_trans(0xC0E0);      // power settings
65
  rf02_trans(0x8F80);
66
  rf02_trans(0xC2A0);      // enable tx sync bit, disable low bat detector
67
}
68
69
void rf02_setmodfreq(unsigned char bandwidth)
70
{
71
  rf02_trans(0x8F80|(bandwidth&7));
72
}
73
74
void rf02_setfreq(unsigned short freq)
75
{  if (freq<96)        // 430,2400MHz
76
    freq=96;
77
  else if (freq>3903)      // 439,7575MHz
78
    freq=3903;
79
  rf02_trans(0xA000|freq);
80
}
81
82
void rf02_setpower(unsigned char power)
83
{
84
  rf02_trans(0xB000|((power&7)<<8));
85
}
86
87
void rf02_setbaud(unsigned short baud)
88
{
89
  if (baud<1345)
90
    baud=1345;
91
  if (baud<19000)
92
    rf02_trans(0xD240);    // 25% PLL current
93
  else if (baud<37000)
94
    rf02_trans(0xD2C0);    // 33% PLL current
95
  else
96
    rf02_trans(0xD200);    // 50% PLL current
97
  rf02_trans(0xC800|((344828UL/baud)-1));  // Baudrate= 344827,59/(R+1)
98
}
99
100
void rf02_txdata(unsigned char *data, unsigned char number)
101
{  unsigned char i,wert;
102
  wert=0xC6;
103
  cbi(CS_PORT, CS);
104
  for (i=0; i<8; i++)
105
  {  
106
    if (wert&128)
107
    {
108
      sbi(SDI_PORT, SDI);
109
    }
110
    else
111
    {
112
      cbi(SDI_PORT, SDI);
113
      sbi(SCK_PORT, SCK);
114
      wert<<=1;
115
      _delay_us(0.2);
116
      cbi(SCK_PORT, SCK);
117
    }
118
  }
119
    rf02_shiftout(0xAA);
120
    rf02_shiftout(0xAA);
121
    rf02_shiftout(0xAA);
122
    rf02_shiftout(0x2D);
123
    rf02_shiftout(0xD4);
124
  for (i=0; i<number; i++)
125
  {
126
    rf02_shiftout(*data++);
127
  }
128
  sbi(CS_PORT, CS);
129
  while(IRQ_PIN&(1<<IRQ));    // wait until transfer done
130
  rf02_trans(0xC464);      // TX off after 10us
131
}
132
133
void rf02_shiftout(unsigned char wert)
134
{  unsigned char j;
135
  for (j=0; j<8; j++)
136
  {  
137
    while(IRQ_PIN&(1<<IRQ));
138
    while(!(IRQ_PIN&(1<<IRQ)));
139
    if (wert&128)
140
        sbi(SDI_PORT, SDI);
141
      else
142
        cbi(SDI_PORT, SDI);
143
        wert<<=1;
144
    }
145
}