RFM12B Transceiver an ATmega8

OP #1510477
Lesenswert?

Guten Tag,
ich versuche hier verzweifelt seit tagen einen string bzw. ein byte mit 
einem rfm12b zu senden bzw. empfangen.

Verkablung:

1 SDO -> MISO
2 NIRQ -> frei
3 FSK/DATA/NFFS -> VCC 3,3V
4 DCLK/CFIL/FFIT -> frei
5 CLK -> frei
6 NRES -> frei
7 GND -> GND
8 ANT -> Antenne 7,5cm
9 VCC -> VCC 3,3V
10 GND -> GND
11 NINT/VDI -> frei
12 SDI -> MOSI
13 SCK -> SCK
14 NSEL -> SS

Ist die Verdrahtung so korrekt?
Fragen:
-NRES kann freigelassen werden?

So nun zu der Software:
Sender:
1
#include "rfm12b.h"
2
#include <inttypes.h>
3
#ifndef F_CPU
4
#define F_CPU 1000000L
5
#endif
6
#include <util/delay.h>
7
#define SCL_CLOCK  100000L
8

9

10
int main()
11
{
12
  int i;
13
  uint8_t data[]="test";
14

15
  DDRB=0xff;
16
  DDRD=0xff;
17
  DDRC = 0xff;
18

19
  for (i=0;i<4;i++)
20
  {
21
    PORTB = ( 1<<PB1 );
22
    _delay_ms(500);
23
    PORTB = !(1<<PB1);
24
    _delay_ms(500);
25
  }
26

27
  SPCR = (1<<SPE)|(1<<MSTR);
28
  SPSR = (1<<SPI2X);
29

30
  RFM12B_init_hard();
31
  RFM12B_init_soft();
32

33
  while(1)
34
  {
35
    RFM12B_transmit(data,5);
36
    _delay_ms(500);
37
  
38
  }
39
}

Hier gibt es glaub ich keine Probleme (stromaufnahme in 500ms abständen 
auf Netzteilanzeige).

Nun der Empfänger:
1
#include "rfm12b.h"
2
#ifndef F_CPU
3
#define F_CPU 1000000L
4
#endif
5
#include <util/delay.h>
6
#define SCL_CLOCK  100000L
7

8
int main()
9
{
10
  int i;
11
  uint8_t data[5];
12
  DDRB=0xff; 
13
  DDRD=0xff;   
14
        DDRC=0xff;
15

16
  for (i=0;i<4;i++)
17
  {
18
    PORTB = (1<<PB1);
19
    _delay_ms(500);
20
    PORTB = !(1<<PB1);
21
    _delay_ms(500);
22
  }
23

24

25
  SPCR = (1<<SPE)|(1<<MSTR);
26
  SPSR = (1<<SPI2X);
27
    
28
  RFM12B_init_hard();
29
  RFM12B_init_soft();
30

31
  while(1)
32
  {
33
    RFM12B_receive(data,5);
34
    if (data[0]=='t')
35
    PORTD=(1<<PD0);
36
    else
37
    PORTD=!(1<<PD0);
38
    _delay_ms(500);
39
  } 
40
}

Fragen:
- code vom prinzip überhaupt richtig?
- if(data[0]=='t') kann das gehen?

kann mir wer helfen?
bitte keine links auf andere threads im forum, die hab ich schon durch 
;P

achja die rfm12b.h bzw. die zugehörige rf12b.c noch:
1
#include "rfm12b.h"
2
// send and receive a 16bit-word via spi
3
uint16_t RFM12B_spi(uint16_t cmd)
4
{
5
 uint8_t i;
6
 uint16_t recv = 0;
7
 // start communication
8
 RFM12B_SCK_LOW();
9
 RFM12B_SS_LOW();
10
 // read 16 bits
11
 for(i=0; i<16; i++)
12
 {
13
 // send bit
14
 if(cmd & 0x8000)
15
 RFM12B_MOSI_HIGH();
16
 else
17
 RFM12B_MOSI_LOW();
18
 // clock
19
 RFM12B_SCK_HIGH();
20
 recv<<=1;
21
 // receive bit
22
 if(RFM12B_MISO_HIGH())
23
 {
24
 recv|=0x0001;
25
 }
26
 // clock
27
 RFM12B_SCK_LOW();
28
 cmd<<=1;
29
 }
30
 // end communication
31
 RFM12B_SS_HIGH();
32
 return recv;
33
}
34
// initialize hardware (atmel) (CHECKED)
35
void RFM12B_init_hard()
36
{
37
 // set default values
38
 RFM12B_SS_HIGH();
39
 RFM12B_MOSI_HIGH();
40
 RFM12B_SCK_LOW();
41
 // init ports
42
 RFM12B_SCK_INIT();
43
 RFM12B_MOSI_INIT();
44
 RFM12B_MISO_INIT();
45
 RFM12B_SS_INIT();
46
}
47
// initialize software (rfm12b) (CHECKED)
48
void RFM12B_init_soft()
49
{
50
 RFM12B_spi(0x80D7);//EL,EF,433band,12.0pF
51
 RFM12B_spi(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
52
/*  RFM12B_spi(0xA640);//434MHz*/
53
 RFM12B_spi(0xA74E);//869,35 MHz
54
 RFM12B_spi(0xC647);//4.8kbps
55
 RFM12B_spi(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
56
 RFM12B_spi(0xC2AC);//AL,!ml,DIG,DQD4
57
 RFM12B_spi(0xCA81);//FIFO8,SYNC,!ff,DR
58
 RFM12B_spi(0xCED4);//SYNC=2DD4;
59
 RFM12B_spi(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
60
/*  RFM12B_spi(0x9850);//!mp,90kHz,MAX OUT*/
61
 RFM12B_spi(0x9820);//!mp,45kHz,MAX OUT*/
62
 RFM12B_spi(0xCC77);//OB1,OB0, LPX,!ddy,DDIT,BW0
63
 RFM12B_spi(0xE000);//NOT USE
64
 RFM12B_spi(0xC800);//NOT USE
65
 RFM12B_spi(0xC040);//1.66MHz,2.2V
66
}
67
// send a byte (CHECKED)
68
//   uint8_t  data  data to send
69
void RFM12B_put(uint8_t data)
70
{
71
 RFM12B_WAIT_RGIT();
72
 RFM12B_spi(0xB800 + data);
73
}
74
// receive a byte (CHECKED)
75
uint8_t RFM12B_get()
76
{
77
 RFM12B_WAIT_FFIT();
78
 return RFM12B_spi(0xB000) & 0x00FF;
79
}
80
// transmit multiple bytes (CHECKED)
81
//   uint8_t  data[]  data to transmit
82
//   uint8_t  length  length of the data to transmit
83
void RFM12B_transmit(uint8_t data[], uint8_t length)
84
{
85
 uint8_t i;
86
 // enable TX
87
 RFM12B_spi(0x8238);
88
 RFM12B_put(0xAA);
89
 RFM12B_put(0xAA);
90
 RFM12B_put(0xAA);
91
 RFM12B_put(0x2D);
92
 RFM12B_put(0xD4);
93
 for(i = 0; i < length; i++)
94
 {
95
 RFM12B_put(data[i]);
96
 }
97
 RFM12B_WAIT_RGIT();
98
 // disable TX
99
 RFM12B_spi(0x8208);
100
}
101
// receive multiple bytes (CHECKED)
102
//   uint8_t  data[]  buffer for received data
103
//   uint8_t  length  length of data to receive
104
void RFM12B_receive(uint8_t *data, uint8_t length)
105
{
106
 uint8_t i;
107
 // enable RX
108
 RFM12B_spi(0x82C8);
109
 // set FIFO mode
110
 RFM12B_spi(0xCA81);
111
 // enable FIFO
112
 RFM12B_spi(0xCA83);
113
 for(i = 0; i < length; i++)
114
 {
115
 data[i] = RFM12B_get();
116
 }
117
 RFM12B_WAIT_FFIT();
118
 // disable RX
119
 RFM12B_spi(0x8208);
120
}

config.h
1
// _I = INPUT PORT
2
// _O = OUTPUT PORT
3
// _P = PORT INDEX
4
// _D = DATA DIRECTION REGISTER
5
// SPI SCK (clock, output)#define  RFM12B_SCK_I  PINB
6
#define  RFM12B_SCK_O  PORTB
7
#define  RFM12B_SCK_P  5
8
#define  RFM12B_SCK_D  DDRB
9
#define  RFM12B_SCK_INIT()  RFM12B_SCK_D |=  (1<<(RFM12B_SCK_P))
10
#define  RFM12B_SCK_LOW()   RFM12B_SCK_O &= ~(1<<(RFM12B_SCK_P))
11
#define  RFM12B_SCK_HIGH()  RFM12B_SCK_O |=  (1<<(RFM12B_SCK_P))
12
// SPI MISO / SDO (master in slave out, input)
13
#define  RFM12B_MISO_I  PINB
14
#define  RFM12B_MISO_O  PORTB
15
#define  RFM12B_MISO_P  4
16
#define  RFM12B_MISO_D  DDRB
17
#define  RFM12B_MISO_INIT()  RFM12B_MISO_D &= ~(1<<(RFM12B_MISO_P))
18
#define  RFM12B_MISO_LOW()   ~(RFM12B_MISO_HIGH())
19
#define  RFM12B_MISO_HIGH()  RFM12B_MISO_I & (1<<(RFM12B_MISO_P))
20
// SPI MOSI / SDI (master out slave in, output)
21
#define  RFM12B_MOSI_I  PINB
22
#define  RFM12B_MOSI_O  PORTB
23
#define  RFM12B_MOSI_P  3
24
#define  RFM12B_MOSI_D  DDRB
25
#define  RFM12B_MOSI_INIT()  RFM12B_MOSI_D |=  (1<<(RFM12B_MOSI_P))
26
#define  RFM12B_MOSI_LOW()   RFM12B_MOSI_O &= ~(1<<(RFM12B_MOSI_P))
27
#define  RFM12B_MOSI_HIGH()  RFM12B_MOSI_O |=  (1<<(RFM12B_MOSI_P))
28
// SPI SS / CS (slave select, output)
29
#define  RFM12B_SS_I  PINB
30
#define  RFM12B_SS_O  PORTB
31
#define  RFM12B_SS_P  2
32
#define  RFM12B_SS_D  DDRB
33
#define  RFM12B_SS_INIT()  RFM12B_SS_D |=  (1<<(RFM12B_SS_P))
34
#define  RFM12B_SS_LOW()   RFM12B_SS_O &= ~(1<<(RFM12B_SS_P))
35
#define  RFM12B_SS_HIGH()  RFM12B_SS_O |=  (1<<(RFM12B_SS_P))

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren