Hi,
ich versuche eine Funkverbindung über 2 RFM70-Module zu realisieren. Das
Modul ist wie folgt an einem ATMega8 angeschlossen.
RFM70 ATMega8
CE -----> PB1
CSN ----> PB2 (SS)
SCK ----> PB5 (SCK)
MOSI ---> PB3 (MOSI)
MISO ---> PB4 (MISO)
IRQ ----> PD2 (INT0)
Das ganze gibt es 2x und wurde von mir auf Platinen geäzt. Den
Schaltplan und das Board-Layout für EAGLE habe ich mit angehängt.
Ich habe mit Hilfe des kompletten Datenblatts und des Beispielcodes von
Pollin ein Programm für den ATMega8 geschrieben. Das Programm ist soweit
das ich alle SPI-Funktionen implementiert habe. Also Register
lesen/schreiben und die Initialierierung. Theoretisch sollte es
funktionieren.
Nun zum Problem:
Egal was ich für ein Byte über MOSI an das Modul sende es kommt immer
ein Status-Byte mit den default Werten (0x0E) über MISO zurück. D.h. das
RFM70-Modul reagiert einfach nicht auf Befehle. Das Problem besteht auf
beiden Platinen. Im Anhang befinden sich 2 Bilder die ich mit einem
DSO203 aufgenommen habe. Auf CH1 befindet sich das SCK-Signal. Auf dem
ersten Bild ist CH2 das MOSI-Signal und auf dem zweiten das MISO-Signal.
Zu sehen ist auf den Bildern der folgende Befehl:
1 | rfm70_write_reg(STATUS,0x0F);
|
b0 im StatusRegister soll gesetzt werden.
(Nachtrag: Der Befehl ist unsinnig da b0 nur lesbar ist! Trotzdem sollte
aber bei einem Schreibbefehl das zweite Byte vom RFM70 nur aus Nullen
bestehen)
Initialisierung des SPI vom ATMega8
1 | //set MOSI and SCK as output
|
2 | DDRB |= (1<<3) | (1<<5);
|
3 | //activate MPU.SPI as MASTER with fclk/128
|
4 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
|
Der Code zum senden und empfangen:
1 | //read/write data over SPI
|
2 | char rfm70_rw(unsigned char data)
|
3 | {
|
4 | CSN_LOW();
|
5 | SPDR=data; //activates SCK and shift $data over MOSI
|
6 | while(!(SPSR & (1<<SPIF))); //wait until trasmission completed
|
7 | CSN_HIGH();
|
8 | return SPDR; //return reveived databyte
|
9 | }
|
10 |
|
11 | void rfm70_write_reg(char reg, char value)
|
12 | {
|
13 | rfm70_stat=rfm70_rw(W_REGISTER|reg); //writecmd + reg
|
14 | rfm70_rw(value); //value
|
15 | }
|
16 |
|
17 | void rfm70_write_buf(char reg, unsigned char *pBuf, char length)
|
18 | {
|
19 | char i;
|
20 | rfm70_stat=rfm70_rw(W_REGISTER|reg);
|
21 | for(i=0;i<length;i++)
|
22 | rfm70_rw(*pBuf++);
|
23 | }
|
24 |
|
25 | char rfm70_read_reg(char reg)
|
26 | {
|
27 | char value;
|
28 | rfm70_stat=rfm70_rw(R_REGISTER|reg); //readcmd + reg
|
29 | value=rfm70_rw(0x00); //read value
|
30 | return value;
|
31 | }
|
32 |
|
33 | char rfm70_read_buff(char reg, unsigned char *pBuf, char length)
|
34 | {
|
35 | char i;
|
36 | rfm70_stat=rfm70_rw(R_REGISTER|reg);
|
37 | for(i=0;i<length;i++)
|
38 | pBuf[i]=rfm70_rw(0x00);
|
39 | }
|
Ich weiß nicht wo der Fehler zu finden sein könnte und erhoffe mir hier
ein paar ideen. :-)
Danke schonmal &
beste Grüße
Fred
P.S.:
Gibt das RFM70-Modul nur bei CSN=0 ein definiertes Signal auf den MISO
Kanal? Hin und wieder lässt sich nach einer Übertragung ein langsames
ansteigen der Spannung von 0V auf 3V3 beobachten! Oder ist das ein
defekt?