Forum: Mikrocontroller und Digitale Elektronik RFM70 am SPI sendet nur Status-Register


von fred (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

Hallo,

ich sitze hier gerade mit dem RFM70 und einem Raspberry. Ich habe genau 
das gleiche Problem mit dem MISO.

Ich habe schon (auch manuell) alle möglichen Ansteuerungsversuche 
unternommen.

Hast du den Fehler bei dir weggekriegt?

Gruß,

Stefan

von fred (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

nein leider noch nicht. Mein Projekt lag auch die letzte Zeit auf Eis. 
Hatte auch noch diverse Versuche unternommen welches aber alles nichts 
am Problem verändert hat. Ich habe nur die Vermutung das bei der 
Initialisierung irgendwas schiefläuft. Da sind die Informationen zum 
RFM70 aus Datenblatt und diversen Programbeispielen auch recht 
verwirrend.
Ich denke in den nächsten Wochen werde ich mich weiter damit befassen 
können!

Ich weiß jetzt nicht ob es hilfreich ist oder nicht, aber ich hänge mal 
den kompletten Code meines Projekt an.

Dein Projekt mit dem RaspberryPi hört sich auch interessant an. Habe 
auch noch 2 von den Teilen hier :)

Grüße,
Fred

von Toralf W. (willi)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe Euch mal ein Projekt von mir angehangen. Da wird in einem 
mega8/88/168/328 der Port C eingelesen und ca. 3x je Sekunde an einen 
zweiten AVR übertragen und dort wieder ausgegeben. Die Beschaltung steht 
am Anfang der main.c Der RFM wird allerdings nur mit 3 Byte adressiert, 
kann man aber wieder auf 5 Byte ändern, Datenrate ist auf 1MBit 
eingestellt. Die Initialisierung läuft mit einem RFM70 und auch dem 
neuen RFM73. Die RFM Funktionen sind vom Arduino Projekt abgeleitet.

Eventuell hilft es Euch weiter.

von Gumulka (Gast)


Lesenswert?

Hallo fred,

du darfst den CSN zwischen der übertragung von zwei bytes nicht auf high 
setzen.

richtig wäre also folgender Code:
1
//read/write data over SPI
2
char rfm70_rw(unsigned char data)
3
{
4
  SPDR=data;              //activates SCK and shift $data over MOSI
5
  while(!(SPSR & (1<<SPIF)));  //wait until trasmission completed
6
  return SPDR;            //return reveived databyte
7
}
8
9
void rfm70_write_reg(char reg, char value)
10
{
11
  CSN_LOW();
12
  rfm70_stat=rfm70_rw(W_REGISTER|reg);  //writecmd + reg
13
  rfm70_rw(value);                //value
14
  CSN_HIGH();
15
}
16
17
void rfm70_write_buf(char reg, unsigned char *pBuf, char length)
18
{
19
  char i;
20
  CSN_LOW();
21
  rfm70_stat=rfm70_rw(W_REGISTER|reg);
22
  for(i=0;i<length;i++)
23
    rfm70_rw(*pBuf++);
24
  CSN_HIGH();
25
}
26
27
char rfm70_read_reg(char reg)
28
{
29
  char value;
30
  CSN_LOW();
31
  rfm70_stat=rfm70_rw(R_REGISTER|reg);  //readcmd + reg
32
  value=rfm70_rw(0x00);            //read value
33
  CSN_HIGH();
34
  return value;
35
}
36
37
char rfm70_read_buff(char reg, unsigned char *pBuf, char length)
38
{
39
  char i;
40
  CSN_LOW();
41
  rfm70_stat=rfm70_rw(R_REGISTER|reg);
42
  for(i=0;i<length;i++)
43
    pBuf[i]=rfm70_rw(0x00);
44
  CSN_HIGH();
45
}

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hey Gumulka,

vielen dank das war der gesuchte Fehler :-)

Hab den Code direkt geändert und siehe da.. das 2te Byte besteht nur aus 
Nullen, so wie es sein sollte!

In dem Screenshot:
CH1 -> MOSI
CH2 -> MISO

Grüße
Fred

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.