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))
|