Forum: Mikrocontroller und Digitale Elektronik Simple SPI Interaktion mit dem rfm69 Modul


von marabou (Gast)


Lesenswert?

Hi,

ich bin hier langsam am verzweifeln.
Ich versuche eine einfache Kommunikation mit dem rfm69 Funkmodul per spi 
hinzubekommen.
Hier ist der Code um den es geht (ohne UART Teil) [1].
Schreiben geht, lesen manchmal. Oft bleibt der µC beim Lesen hängen.
Ab und zu wird etwas ausgelesen und dann auch ab und zu der richtige 
Wert.
Leider aber oft auch ein falscher Wert.

Kann mir jemand bitte sagen woran das liegen kann?
Frequenz ist richtig gesetzt.

[1] http://pastebin.com/RSGr9wWx

von holger (Gast)


Lesenswert?

while(!(SPDR & (1<<SPIF)));

Wenn man da SPCR eingibt könnte es klappen;)

von marabou (Gast)


Lesenswert?

Moin,

jo auch schon bemerkt, die Nach war zu lang gestern :D.

Jetzt klappt das auslesen, aber er gibt immer 255 zurück. Egal was ich 
rein schreibe.

von marabou (Gast)


Lesenswert?

Ok ich brauch glaub ich mal generell Hilfe beim Typ umwandeln...

Ich hab da also diese beiden Funktionen welche Daten mittels UART 
übertragen [1].
Funktioniert auch!

Dann ist da die SPI Funktion welche so aussieht [2].

spi_transfer gibt ja einen Wert vom Typ unsigned int zurück.
Das ist doch richtig, weil SPDR auch von diesem Typ ist?!

Reicht es dann einfach mittel itoa den Wert umzuwandeln?
Ich habe das Gefühl die Zielvariable läuft über, es kommt bei jeder 
Abfrage 255 raus.

Wie würdet ihr den Rückgabewert von spi_transfer an die UART Funktion 
senden?


[1] http://pastebin.com/svyn1ppD
[2] http://pastebin.com/VizP7jmt

von Felix P. (fixxl)


Lesenswert?

1. Zu wissen, welcher Controller verwendet wird, wäre hilfreich.
2. In deinen Quellcodes fehlen mir die include-Direktiven. Was ist alles 
eingebunden?
3. Wo ist die UART-Initialisierung?

von marabou (Gast)


Lesenswert?

Hier ist der gesammte code [1].
µC ist der mega16.

http://pastebin.com/DByRTBQw

von Rainer B. (katastrophenheinz)


Lesenswert?

Hi,

- was ist mit dem NSS-Eingang vom RFM69 ? Ist der auf 0?
- was passiert, wenn du den RFM69 zunächst mal abklemmt und MISO mit 
MOSI am mega16 verbindest? Kommt dann der rausgesendete Wert zurück?

von Rainer B. (katastrophenheinz)


Lesenswert?

marabou schrieb:
> spi_transfer gibt ja einen Wert vom Typ unsigned int zurück.
> Das ist doch richtig, weil SPDR auch von diesem Typ ist?!
nein, Rückgabetyp ist uint8_t
>Reicht es dann einfach mittel itoa den Wert umzuwandeln?
ja
>Ich habe das Gefühl die Zielvariable läuft über, es kommt bei jeder
>Abfrage 255 raus.
Ich habe eher das Gefühl, der rfm69 antwortet einfach nicht z.B. weil 
NSS nicht 0 ist oder weil du ein unsinniges Register ansprichst.

von marabou (Gast)


Lesenswert?

Moin,

also das Register was ich anspreche ist schon richtig: 0x2F. Steht auch 
so in diversen anderen Libs.

NSS ist an PD7, sieht für mich richtig aus.

Das mit Miso direkt an Mosi ohne was dazwischen klingt interessant.
Muss ich dann den SS Pin am µC entsprechend dem NSS schalten?

von holger (Gast)


Lesenswert?

>Das mit Miso direkt an Mosi ohne was dazwischen klingt interessant.
>Muss ich dann den SS Pin am µC entsprechend dem NSS schalten?

Nein.

von Rainer B. (katastrophenheinz)


Angehängte Dateien:

Lesenswert?

Hmm. Ich hab deinen Code mal genommen, für mega644p angepasst und mit 
einem RFM69 getestet. Bei mir funktioniert's. Der einzige Unterschied zu 
deinem Code ist der, dass ich als SS-Pin den dafür vorgesehenen PB4 
verwendet und weiteren Debug-Output eingebaut habe. Und da über SPI und 
nicht über JTAG programmiere: Entweder RFM69 ( bei der Programmierung ) 
bzw. SPI-Connector ( beim Rennen ) abziehen. Code und Output im Anhang.

Betreibst du beide ( ATmega16 (5V) und RFM69 (3V3) ) innerhalb der 
spezifizierten Versorgungsspannung ?

von Sascha W. (sascha-w)


Lesenswert?

@marabou

hast du den SS-Pin als Ausgang definiert? Im SPI-Master-Mode muss der 
Pin ein Ausgang sein, da sich mit entsprechendem Pegel oder offenem Pin 
die Betriebsart wieder in Slave-Mode ändert.

Sascha

von marabou (Gast)


Lesenswert?

@Sascha nein hatte ich nicht.
Hab jetzt den code von Rainer, danke schon mal, ausprobiert.
Ausgabe:

-----Begin------

Out: af In: 00
Out: 55 In: 00
Out: 2f In: 00
Out: 00 In: 00
Register 0x2f=00


Hab die Stellen für meinen µC natürlich angepasst.
Keine Ahnung was falsch ist. Hab 2 Funkmodule getestet.

Für den µC hab ich stabile 5V und für das Funkmodul 3.3V (gemessen).

Hab auch schon die Kontakte am Modul bis zum Ende der Leitung getestet 
da ist auch alles OK.

von marabou (Gast)


Lesenswert?

Hm Ok,

MISO und MOSI vom µC verbunden zeigt mir das richtige an. Das scheint 
also zu gehen.
Was kann denn dann am Funkmodul falsch sein?
Ich hab nur 3.3V, beide GND und eben die SPI Pins verbunden. (Ja, auch 
den SS Pin). Programmiergerät ist abgezogen.

von Rainer B. (katastrophenheinz)


Lesenswert?

Wenn permanent und reproduzierbar über die MISO-Leitung 0 reinkommt, 
dann zieht die jmd permanent auf 0.
Hast du die Schaltung zur Hand? Speziell die Level-Shifter-Mimik zw. 3,3 
und 5V, die du verwendest.

Was sagt der Output, wenn du MISO und MOSI miteinander verbindest, 
einmal auf der 5V-Seite und dann nochmal auf der 3V3-Seite. Das sollte 
rauskommen, in beiden Fällen:

Out: af In: af
Out: 55 In: 55
Out: 2f In: 2f
Out: 00 In: 00
Register 0x2f=00

von marabou (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist mal die Verkabelung.
Ich konnte auf die Schnelle kein Partfile für das Funkmodul finden daher 
nur ein Kasten.
Ich verwende je einen Spannungsregler für 5V und für 3.3V.

Eigentlich alles recht simpel.

Was meinst du mit

>einmal auf der 5V-Seite und dann nochmal auf der 3V3-Seite

Ich hab doch nur eine µC Seite.

von marabou (Gast)


Lesenswert?

Ah shit vergessen. Ich hab die Kondensatoren an den Spannungsreglern 
nicht eingezeichnet. Und die Titelbezeichnung der Parts stimmt nicht 
100%. Sollte aber keine Rolle spielen.

von Felix P. (fixxl)


Lesenswert?

marabou schrieb:
> Ah shit vergessen. Ich hab die Kondensatoren an den Spannungsreglern
> nicht eingezeichnet. Und die Titelbezeichnung der Parts stimmt nicht
> 100%. Sollte aber keine Rolle spielen.

Wenn das Schaltbild tatsächlich so umgesetzt ist, dann stimmt noch mehr 
nicht.

SCK ist fest auf GND gezogen? Der 5V-Controller ist ohne jeglichen 
Pegelwandler bzw. ohne strombegrenzende Widerstände mit dem 
3,3V-Funkmodul verbunden? Das ist nicht dein Ernst, oder?

von marabou (Gast)


Lesenswert?

Hm das sieht im Schaltplan anders aus als im Bild, SCK ist natürlich 
nicht auf GND, die Leitung geht nur da oben lang. Sorry für die 
Missverständnisse.
Widerstände hab ich auch nicht drin... Ich werde heute Abend mal ein 
neues, vollständiges Bild hochladen.

von Felix P. (fixxl)


Lesenswert?

marabou schrieb:
> Widerstände hab ich auch nicht drin...

Das heißt, die Ausgänge vom Mikrocontroller sind direkt mit den 
Eingängen des Funkmoduls verbunden und umgekehrt?

Dann hättest du folgende Szenarien:
Die Ausgänge des Mikrocontrollers liegen, wenn sie gesetzt sind, auf 5 
V, das Funkmodul verträgt an seinen Eingängen aber maximal seine eigene 
Versorgungsspannung von 3,3 V. Somit baust du hier einen niederohmigen 
Kurzschluss zwischen 5 V und 3,3 V und Schäden an mindestens einem der 
beiden Bauteile wären die Folge. Widerstände in den Leitungen würden 
zumindest den Strom begrenzen, ein echter Pegelwandler wäre natürlich 
die Premiumlösung.

Die Ausgänge des Funkmoduls liegen, wenn sie gesetzt sind auf maximal 
3,3 V, da der Hersteller aber im Datenblatt nur 90% der 
Versorgungsspannung garantiert, können es auch mal weniger als 3 V sein, 
was weniger 60% der Versorgungsspannung des Mikrocontrollers entspricht. 
Unterhalb dieser 60% ist nicht mehr garantiert, dass der Controller den 
Pegel als 1 erkennt. Kaputt wird in dieser Richtung nichts gehen, 
womöglich wird es aber nicht funktionieren.

von Rainer B. (katastrophenheinz)


Lesenswert?

... um diese Fehlerquellen auszuschließen, würde ich zumindest MOSI und 
SCK mit einem Spannungsteiler aus zwei Widerständen auf 3,3V zum RFM69 
hin anpassen (obwohl ich glaube, dass der 5V-tolerant ist)  und MISO mit 
Pegelwandler zum mega hin auf 5V-Level bringen.

Beispielschaltungen hier:
http://www.mikrocontroller.net/articles/Pegelwandler

von Felix P. (fixxl)


Lesenswert?

Rainer B. schrieb:
> ... um diese Fehlerquellen auszuschließen, würde ich zumindest MOSI und
> SCK mit einem Spannungsteiler aus zwei Widerständen auf 3,3V zum RFM69
> hin anpassen (obwohl ich glaube, dass der 5V-tolerant ist)  und MISO mit
> Pegelwandler zum mega hin auf 5V-Level bringen.
>
> Beispielschaltungen hier:
> http://www.mikrocontroller.net/articles/Pegelwandler

Es ist nirgends vermerkt, dass das RFM69 5V-tolerant ist. Worauf stützt 
sich dein Glaube?

von Rainer B. (katastrophenheinz)


Lesenswert?

Stützt sich aufs Manual, hier ist im Abschnitt "Digital Inputs" kein 
max. Wert für Vih angegeben.

Aber Versuch macht klug: Betreibt man das RFM69 so, wie der TO das oben 
angegeben hat, kommt genau der oben beschriebene Müll raus. In einer 
3,3V-Umgebung funktionierts dann wieder normal. D.h. aus elektrischer 
Sicht ist's 5V-tolerant aus funktionaler Sicht eher nicht ;-).

von marabou (Gast)


Lesenswert?

Also vielen Dank für eure Hilfe.
Pegelwandler habe ich nicht hier, aber bestellt.
Mir ist aber aufgefallen, dass ich noch einen atmega16L habe.
Der funktioniert mit 3.3V. Ausgetauscht, neu verkabelt und es geht 
tatsächlich...
Logisch ist es allerdings habe ich darüber gar nicht nachgedacht weil 
das Funkmodul in anderen Schaltungen immer direkt am µC war. Das waren 
aber alles Arduinos welche mit 3.3V arbeiten.

Also nochmal Danke und ich teste jetzt weiter.

von marabou (Gast)


Lesenswert?

Hallo,

die letzten Wochen war wenig Zeit zum testen aber nun hab ich folgenden 
Stand:

Die Register werden richtig geschrieben und gelesen aber es kommt 
trotzdem keine Datenübertragung zustande. Auf richtige Node und Netzwerk 
ID etc. habe ich geachtet. Hab das ganze auch noch mal an je einem 
raspberry ausprobiert (mit anderer Lib) und da geht es genau so wenig.
Mir fehlt da jetzt ein bisschen der Ansatz zum Debuggen.
Ich kann ja schlecht in die Bauteile reinschauen.

Hat jemand einen Tipp wie ich rausfinden kann was nun schon wieder 
klemmt?

von Rainer B. (katastrophenheinz)


Lesenswert?

Nur mal so ins Blaue, ohne deinen Code zu kennen:
a) Code posten
b) Antennenlänge passt ?
c) Empfänger-Bandbreite hochsetzen
d) mit RSSI-Threshold experimentieren und RSSI auf DIOx legen oder aus 
Statusregister auslesen, um festzustellen, ob überhaupt was ankommt.

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.