Simple SPI Interaktion mit dem rfm69 Modul

Gast #4024084
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
Gast #4025628
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
#4027359
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.
Gast #4027555
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?
#4028918
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 ?
Angehängte Dateien:
Gast #4029129
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.
Gast #4029222
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.
#4029238
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
Gast #4031089
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.
Angehängte Dateien:
#4031208
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?
Gast #4031424
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.
#4031577
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.
#4032238
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?
#4032468
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 ;-).
Gast #4034717
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.
Gast #4055342
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren