Forum: Mikrocontroller und Digitale Elektronik NRF24L01 SPI immer Selber wert gelesen


von Florian R. (fxlxo)


Lesenswert?

Hallo zusammen,

ich mache seit 2 Tagen mit dem NRF24L01 Tutorial rum und komme nicht 
weiter.
Es scheitert schon beim SPI Zugriff.

ich verwende:
-Atmel Studio
-Entwicklungsboard: MK2
-ATmega8A
-Uart_terminal zum debuggen
-Code genau der aus dem Tutorial(TX) abgeändert zum register lesen mit 
der routine

Wenn ich alle Register von Adresse 0-20 lesen will bekomme ich für alle 
den selben Wert zurück. Lustig ist wenn ich zum Beispiel bei 1 oder 2 
beginne zu lesen, bekomme ich einen anderen Wert zurück aber dennoch für 
alle Register den selben Wert.

Noch sende ich nichts mit dem Funkmodul.
Provisorisch habe ich 3 Dioden von 5V auf 3V in Reihe(gemessen!).
Sollte aber doch nichts machen wenn ich nur SPI Zugriffe machen will.

Folgendes habe ich schon probiert:

-SPI_Clock_frequenz hoch runter geschraubt -> Immer noch das selbe 
Problem
-Hardware 100x überprüft-> Stimmt!
-Anderes Modul probiert-> selbes Problem
-Mit Absicht eins kaputt gemacht(5V Vcc) -> ja dann geht gar nix mehr :)
-2 Dioden in Reihe -> Vcc bei ~3.6V , gleiches Problem(ja ich kauf mir 
bald       Low drop U-Regler)

Meine Fragen ?

Warum bekomme ich nur den selben Wert für alle Register?
ist der Code funktionstüchtig aus dem Tutorial, hat den schon einer 
verwendet?
Für mich sieht das so aus als würde der CSN-Pin probleme machen. Ist 
dieser nicht über den ganzen Lesebefehl über low, vergisst das Modul den 
Lesebefehl und gibt mit jedem neuen Befehl nur das Statusregister 
zurück.
Da ich nur ein Spielzeug Oszi(DSO 112) habe kann ich das kaum prüfen.

Was kann ich tun um weitere Fehlerquellen auszuschließen?

Danke im voraus!

von Frickelfritze (Gast)


Lesenswert?

Florian R. schrieb:
> Was kann ich tun um weitere Fehlerquellen auszuschließen?

Die Verschaltung des Moduls mit deinem Controller zeigen.

Ein Problem stellt die 3.3V Versorgung dar. Die Gretchenfrage
(neben der SPI Verschaltung des Moduls) ist die nach der Pegel-
konvertierung des MISO SIgnals von 3.3 auf 5V.

Wie hast du das gelöst? Oder läuft dein ATmega8A mit 3.3V?

von W.A. (Gast)


Lesenswert?

Florian R. schrieb:
> Da ich nur ein Spielzeug Oszi(DSO 112) habe kann ich das kaum prüfen.

Dann investiere mal in einen kleinen Logikanalysator - würde dich keine 
7€ kosten.

von Florian R. (fxlxo)


Angehängte Dateien:

Lesenswert?

genau so wie auf dem bild(aus dem tutorial)


atmega auf 5v

nrf24l01 auf 3.3V

ist die SPI vom NRF24L01 nicht 5V tolernat?

Danke der Antwort

von Frickelfritze (Gast)


Lesenswert?

Florian R. schrieb:
> ist die SPI vom NRF24L01 nicht 5V tolernat?

Du hast meine Frage nicht verstanden.

Frickelfritze schrieb:
> Pegelkonvertierung des MISO SIgnals von 3.3 auf 5V.
-------------------------^^^^-----------------------

Ein 3.3V-High muss nicht als 5V-High erkannt werden.

von Frickelfritze (Gast)


Lesenswert?

Florian R. schrieb:
> genau so wie auf dem bild(aus dem tutorial)

Hast du eben nicht. Denn dort gibt es nur eine Spannung und
die heisst Vcc. Bei dir gibt es aber zwei Spannungen. Klar?

von Einer K. (Gast)


Lesenswert?

Frickelfritze schrieb:
> Ein 3.3V-High muss nicht als 5V-High erkannt werden.

Meine Arduinos tun das!
Aber ein ATMega8 ist nicht dabei....

Ansonsten:
SS, also PB2 muss als Output definiert werden.
Oder, wenn Input, dann per Pullup auf High gezogen werden.

Ein Kondensator von min. 10µF an den 3,3V des Moduls ist bei meinen NRF 
zwingend nötig.

Florian R. schrieb:
> Für mich sieht das so aus als würde der CSN-Pin probleme machen. Ist
> dieser nicht über den ganzen Lesebefehl über low, vergisst das Modul den
> Lesebefehl und gibt mit jedem neuen Befehl nur das Statusregister
> zurück.
CSN muss bis zum Ende der Kommunikation Low bleiben.

von Florian R. (fxlxo)


Lesenswert?

ja die bei mir gibts keine pegelanpassung...

also brauch ich eine wenn es 2 Vccs gibt?
Dann heißt also 5V tolerant, dass durch 5V an den SPi pins das nrf nicht 
kaputt geht, aber die SPI funktion nicht gegeben sein muss?

das hätte mir mal jemand sagen müssen.

ok...

hab nen max232n daheim ... krieg ich damit die pegelwandlung hin auf die 
schnell, oder endet das im Datanblatt studieren?

von Frickelfritze (Gast)


Lesenswert?

U. F. schrieb:
> Meine Arduinos tun das!

Ist aber nicht garantiert, wenn sie mit 5V betrieben werden.

Du kannst einen Autoreifen der bis 170km/h spezifiziert
ist auch mit 200km/h fahren. Hält aber nicht garantiert.

von Frickelfritze (Gast)


Lesenswert?

Florian R. schrieb:
> hab nen max232n daheim ... krieg ich damit die pegelwandlung hin auf die
> schnell

So garantiert nicht.

Ich will auf diesem Pegelthema nicht herumreiten, aber das ist eine
potentielle Fehlerquelle und es ist - wie schon erwähnt - so nicht
garantiert dass es funktioniert.

Eine saubere Lösung ist auf der MISO Leitung ein Gatter 74HCT125,
betrieben mit 5V, zwischenzuschalten. Das erkennt ein 3.3V-High
eindeutig richtig und gibt am Ausgang dafür 5V-High aus. Das
"T" ist das Wichtige im HCT125.

von Florian R. (fxlxo)


Angehängte Dateien:

Lesenswert?

ok....



also der pegel passt schon.
hab wieder das interessante Verhalten mit den lesezugriffen auf den nrf.

anscheinend macht der es probleme wenn man mehrere bytes auf einmal 
auslesen will.
Wenn ich die Werte einzeln auslese kommen unterschiedliche werte 
raus(juhu), am stück immer der selbe.

ich pack mal den code mit hier rein und ein Bild vom Terminal.

von Florian R. (fxlxo)


Lesenswert?

Noch ne blöde Frage...

hier im Forum setze ich bei diesem Beitrag unten das Häckchen "Thread 
beobachten", sehe diesen aber dann nicht wenn ich auf meine 
Beobachtungsliste gehe. Ich bekomme lediglich eine Email.

Danke

von Frickelfritze (Gast)


Angehängte Dateien:

Lesenswert?

1
wl_module_read_register (0, registerwerte, 21);
2
USART_PC_message("\n\nWerte am Stueck auslesen\n", itoabuffer);
3
for (uint8_t a=0; a<21; a++)
4
{
5
  USART_PC_message("RegADR", itoabuffer);
6
  USART_PC_message_with_uint_8("", itoabuffer, a, 10);
7
  USART_PC_message("\t", itoabuffer);
8
  USART_PC_message_with_uint_8("", itoabuffer, registerwerte[a], 2);
9
  USART_PC_message("\n", itoabuffer);
10
}

Vielleicht solltest du nochmal das Lesen von Datenblättern üben ....

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.