Ich habe einen Atmega88 mit einem RFM98 Chip per SPI verbunden. Die Beschaltung müsste funktionieren, da ich die gesetzten Bits wieder auslesen und vergleichen kann. Derzeit arbeite ich gerade daran, dass das Modul sendet. Was mir offensichtlich noch nicht gelungen ist. Ich bin mir nicht sicher, ob rfm98_init() richtig umgesetzt worden ist. Wenn ich das FIFO auslesen möchte erhalte ich immer den Wert 0x00. (Egal mit was ich es vorher gefüttert habe. (usart_write_char(rfm98_read(0x00));) Die StatusRegister sind auch immer alle auf 0x00 gesetzt. usart_write_char(rfm98_read(0x3e)); usart_write_char(rfm98_read(0x3f)); Kann mir jemand erklären, was ich falsch mache?
1 | void rfm98_init(void) |
2 | {
|
3 | //SPI master init
|
4 | DDRB = (1<<SDO) | (1<<SCK) | (1<<CS) | (1<<RESET); // Set MOSI and SCK output |
5 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0); |
6 | SPSR|=(1<<SPI2X); |
7 | |
8 | //Reset rfm
|
9 | PORTB &= ~ (1<<RESET); |
10 | _delay_ms(1); |
11 | PORTB |= (1<<RESET); |
12 | _delay_ms(5); |
13 | |
14 | //set sleep mode for setting
|
15 | rfm98_write(0x01, 0x00); |
16 | // Wait for setup mode
|
17 | _delay_ms(100); |
18 | if(rfm98_read(0x01) != 0x00) { |
19 | usart_write_str("!sleep: "); |
20 | usart_write_char(rfm98_read(0x01)); |
21 | usart_write_char(0x10); |
22 | }
|
23 | |
24 | //RegOpMode (0x01) set mode FSTx
|
25 | rfm98_write(0x01, 0x40); // FSK, high freq mod, FSTx mode |
26 | // Wait for setup mode
|
27 | _delay_ms(100); |
28 | if(rfm98_read(0x01) != 0x40) { |
29 | usart_write_str("!FSTx: "); |
30 | usart_write_char(rfm98_read(0x01)); |
31 | usart_write_char(0x50); |
32 | }
|
33 | |
34 | //set BitRate: RegBitrateMsb and RegBitrateLsb
|
35 | rfm98_write(0x02, 0x01); |
36 | rfm98_write(0x03, 0x16); |
37 | |
38 | //RegSyncConfig
|
39 | rfm98_write(0x27,0x18); |
40 | |
41 | //RegFrfLsb | set frequence | Frf = Fstep x Frf(23;0) | Fstep = Fxosc/2^19
|
42 | uint32_t frf = (434.5 * 1000000.0) / FSTEP; |
43 | rfm98_write(0x06, (frf >> 16) & 0xff); |
44 | rfm98_write(0x07, (frf >> 8) & 0xff); |
45 | rfm98_write(0x08, frf & 0xff); |
46 | }
|
1 | void rfm98_sendpacket(unsigned char *data, unsigned char size) |
2 | {
|
3 | unsigned char i; |
4 | |
5 | if (size>64) size=64; |
6 | |
7 | // clear RegFifo
|
8 | rfm98_write(0x00, 0x00); // clear Fifo |
9 | |
10 | //RegPacketConf1
|
11 | rfm98_write(0x30, 0x00); |
12 | //RegPacketConf2
|
13 | rfm98_write(0x31, 0x02); |
14 | //RegPayloadLength
|
15 | rfm98_write(0x32, size); |
16 | |
17 | //RegFifoThresh (TxStartCondition)
|
18 | rfm98_write(0x35, 0x01); |
19 | if(rfm98_read(0x35) != 0x01) { |
20 | usart_write_str("!TxStCond: "); |
21 | usart_write_char(rfm98_read(0x35)); |
22 | usart_write_char(0x01); |
23 | }
|
24 | |
25 | //till here working!
|
26 | |
27 | //RegOpMode (0x01) set mode Tx
|
28 | rfm98_write(0x01, 0x60); |
29 | // Wait for setup mode
|
30 | _delay_ms(100); |
31 | if(rfm98_read(0x01) != 0x60) { |
32 | usart_write_str("!Tx: "); |
33 | usart_write_char(rfm98_read(0x01)); |
34 | usart_write_char(0x60); |
35 | }
|
36 | |
37 | for (i = 0; i<size; i++) |
38 | {
|
39 | rfm98_write(0x00, *data++); //fifo |
40 | //usart_write_char(rfm98_read(0x00));
|
41 | }
|
42 | |
43 | usart_write_char(rfm98_read(0x3e)); |
44 | usart_write_char(rfm98_read(0x3f)); |
45 | |
46 | |
47 | }
|