Forum: Mikrocontroller und Digitale Elektronik NRF24L01 (SPI Problem) sendet nur Status


von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich versuche hier ein NRF24L01+ mit einem ESP8266 ans laufen zu 
bekommen.
Dafür verwende ich die Arduino IDE (weils halt schneller geht).

Ich verwende befalls die RF24 Library.

Mein aktueller Code ist sehr rudimentär:
1
 if(radio.isChipConnected() == true)
2
    {
3
      Serial.println("Radio connected");
4
    }
5
    else
6
    {
7
      Serial.println("Radio not connected");
8
    }
9
    delay(1000);

Ich bekomme dauernd ein "Radio not connected".

Habe mal die SPI Leitungen direkt auf dem Modul angeschaut.
Sind also wirklick leitungen am Modul angelötet!

isChipConnected sieht so aus:
1
bool RF24::isChipConnected()
2
{
3
  uint8_t setup = read_register(SETUP_AW);
4
  if(setup >= 1 && setup <= 3)
5
  {
6
    return true;
7
  }
8
9
  return false;
10
}


Wie ihr sehen könnt, antwortet das Modul grundsätzlich schon.
Jedoch nur mit dem Statusbyte welches ja immer parallel zum command 
gesendet wird. Dannach kommt nichts mehr.
Es sendet immer 1C zurück. Beim Mikro kommt auch 1C an (habe ich 
geprüft!).

Im Anhang auch noch die definition des Status registers laut Datenblatt, 
sowie "1C" eingetragen.

Die Module sind von Aliexpress. Glaube jedoch noch nicht daran, dass 
diese Defekt sein sollen.

Hat eventuell jemand eine Idee, wo ich noch suchen könnte?
Danke!

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Ich habe mal noch versuchsweise das Timing etwas eindeutiger gemacht 
(Daten anliegend vor steigendem Clock)

Leider ohne änderung.

von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Hat eventuell jemand eine Idee, wo ich noch suchen könnte?

Du hast mit ziemlicher Sicherheit Probleme bei der Stromversorgung
bzw der Spannungs-Entkopplung.

Zeige deinen Aufbau und den Schaltplan. Sonst kommen wir hier
nicht weiter.

von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Ich verwende befalls die RF24 Library.

Die Gretchenfrage ist: benutz du das Arduino Framwork oder
nutzt du nur den Compiler.

Holger K. schrieb:
> uint8_t setup = read_register(SETUP_AW);

... deuted darauf hin dass du keine Klassen-Programmierung
verwendest und daher auch nicht die Arduino-Lib. (?)

Holger K. schrieb:
> Mein aktueller Code ist sehr rudimentär:

... aber unvollständig. Damit kann man sich kein Bild machen
was du da treibst, und auch keine Fehler suchen/finden.
Dokumentiere sauber was du tust.

Ich suche mir jedenfalls nicht den Kram aus dem Internet
zusammen.

von Holger K. (holgerkraehe)


Lesenswert?

Frickelfritze schrieb:
> Die Gretchenfrage ist: benutz du das Arduino Framwork oder
> nutzt du nur den Compiler.

Ich benutze das Arduino Framework für die IOs.

Frickelfritze schrieb:
> ... deuted darauf hin dass du keine Klassen-Programmierung
> verwendest und daher auch nicht die Arduino-Lib. (?)

Nunja nicht ganz. Ich verwende für erste Test eben nur diese eine 
Funktion der RF24 Library.

Frickelfritze schrieb:
> ... aber unvollständig. Damit kann man sich kein Bild machen
> was du da treibst, und auch keine Fehler suchen/finden.
> Dokumentiere sauber was du tust.
>
> Ich suche mir jedenfalls nicht den Kram aus dem Internet
> zusammen.

Versteh ich.

Was ich genau mache ist:

Ich initialisiere die IOs, und lese vom Register 03 (SETUP_WR), dies im 
Sekundentakt. Mehr macht mein Programm nicht. Der Logicanalyzer zeigt 
seht deutlich, was geschieht.

Meiner Meinung nach, müsste das Modul immer den Registerinhalt 
zurückliefern. Warum auch nicht?

Die Speisung ist inzwischen noch mit 4.7uF MLCC zusätzlich gestützt.

von Holger K. (holgerkraehe)


Lesenswert?

Habe neue erkentnisse.

Das erste Kommando, welches ich nach einem Powerup sende, wird korrekt 
beantwortet. Das Modul sendet mir den gewünschten registerinhalt.

Dann mache ich CS -> High und dann wieder Low.

Ab nun bekomme ich nur noch 0.

Das Statusregister war beim ersten Kommando 0x0E.
Bei jedem weiteren dann wieder immer 0x1C.

1C bedeutet, dass MAX_RT gesetzt ist.
"Maximum number of TX Transmit interrupt".

Muss dieses Bit gelöscht werden?

von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Was ich genau mache ist:

So habe ich mir das vorgestellt mit der genauen Vorgehensweise.

Holger K. schrieb:
> Die Speisung ist inzwischen noch mit 4.7uF MLCC zusätzlich gestützt.

So habe ich mir das vorgestellt mit genauem "Aufbau und Schaltplan".

Holger K. schrieb:
> eine
> Funktion der RF24 Library.

Das versteht eben kein Schwein. Ist es jetz die Klasse aus
Arduino, oder ist das die "objekt-lose" Library.

Ein Mischmasch aus eigenen Libs ohne Klasse und Arduino
Framework führt unvermeidlich in den Dschungel ....

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

So, anbei mein .ino
Ohne irgendwelche Abhängigkeiten etc.


Ich habe mir nun eine "Testumgebung" eingerichtet.
Mit diesem .ino kann ich nun einzelne Befehle per konsole senden.

Das Verhalten ist identisch.


Sorry, ich habe das schema vergessen.
Das Modul wird, entgegen dem Schema, mit 3.3V aus einem LDO versorgt.

: Bearbeitet durch User
von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> So, anbei mein .ino
> Ohne irgendwelche Abhängigkeiten etc.

Du redest Mist.

Holger K. schrieb:
> Ich verwende befalls die RF24 Library.

Na wo isse denn?

Holger K. schrieb:
> So, anbei mein .ino

Mit so einem Kauderwelsch wirst du noch in 2 Jahren daran
herumdoktern. Du bedienst weder CS noch CE, und ob deine
Kauderwelsch-spi_transfer-Routine so funktioniert will
ich mir gar nicht weiter anschauen.

Jedenfalls gibt es hier weit und breit keine RF24 Library.

Letzter heisser Tipp: das Datenblatt mal richtig lesen und
auch verstehen, nicht nur ein Kommando für's Register.

Ich bin dann mal weg.

von Holger K. (holgerkraehe)


Lesenswert?

Hier mal ein Beispiel.

Ich starte mein Board neu (Speisung trennen, verbinden)
Nun gebe ich die kommandos in meine Konsole ein:

Man sieht, das ich zu Beginn, beim aller ersten Kommando,
Ein Status 0x0E vom Modul bekomme.
Danach sendet mir das Modul den Inhalt des Register 0A (RX_ADDR_P0) zu.
Dieser ist nach einem Reset: 0xE7E7E7E7E7
Scheint also ganz gut zu passen.

Wenn ich nun anch 5 Bytes die kommunikation mit CS = High beende, und 
kurz darauf ein neues Kommando einleite mit CS = Low und erneut 0A 
auslesen möchte, so sehe ich, dass der Status nun 0x1C ist und ich 
bekomme vom modul nur noch 0x00 zurück. Egal welches Register ich 
abfrage.

Dieses Verhalten konnte ich auch mit den Logicanalyzer verifizieren.
Es handelt sich also wohl kaum um ein Softwareproblem.
1
  -Received: CSH
2
  -Next Command...
3
  -Received: CSL
4
  -Next Command...
5
  -Received: 0A
6
SPI_Transfer...
7
Value: E
8
  -Next Command...
9
  -Received: FF
10
SPI_Transfer...
11
Value: E7
12
  -Next Command...
13
  -Received: FF
14
SPI_Transfer...
15
Value: E7
16
  -Next Command...
17
  -Received: FF
18
SPI_Transfer...
19
Value: E7
20
  -Next Command...
21
  -Received: FF
22
SPI_Transfer...
23
Value: E7
24
  -Next Command...
25
  -Received: FF
26
SPI_Transfer...
27
Value: E7
28
  -Next Command...
29
  -Received: CSH
30
  -Next Command...
31
  -Received: CSL
32
  -Next Command...
33
  -Received: 0A
34
SPI_Transfer...
35
Value: 1C
36
  -Next Command...
37
  -Received: FF
38
SPI_Transfer...
39
Value: 0
40
  -Next Command...
41
  -Received: FF
42
SPI_Transfer...
43
Value: 0
44
  -Next Command...
45
  -Received: FF
46
SPI_Transfer...
47
Value: 0
48
  -Next Command...

von bla (Gast)


Lesenswert?

Was sagt denn der Logikanalysator bei den weiteren SPI-Transfers?

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

bla schrieb:
> Was sagt denn der Logikanalysator bei den weiteren SPI-Transfers?

Anbei die beiden Screenshots.
Pulse2.png ist der erste Befehl nach dem power up.

pulse3.png ist der darauffolgende mit einer Pause von einigen Sekunden.
Dazwischen findet keinerlei kommunikation statt.

Hier noch die Konsolenausgabe:
1
  -Received: AUT
2
NRF SPI TX: 0x0A
3
--- SPI_Transfer ---
4
NRF SPI RX: 0xE
5
Now send 5 times 0xFF
6
--- SPI_Transfer ---
7
NRF SPI RX: 0xE7
8
--- SPI_Transfer ---
9
NRF SPI RX: 0xE7
10
--- SPI_Transfer ---
11
NRF SPI RX: 0xE7
12
--- SPI_Transfer ---
13
NRF SPI RX: 0xE7
14
--- SPI_Transfer ---
15
NRF SPI RX: 0xE7
16
  -Next Command...
17
  -Received: AUT
18
NRF SPI TX: 0x0A
19
--- SPI_Transfer ---
20
NRF SPI RX: 0x1C
21
Now send 5 times 0xFF
22
--- SPI_Transfer ---
23
NRF SPI RX: 0x0
24
--- SPI_Transfer ---
25
NRF SPI RX: 0x0
26
--- SPI_Transfer ---
27
NRF SPI RX: 0x0
28
--- SPI_Transfer ---
29
NRF SPI RX: 0x0
30
--- SPI_Transfer ---
31
NRF SPI RX: 0x0
32
  -Next Command...

Ich habe zudem noch die Spannugspegel geprüft.
Wenn CS high ist, liegen am CS-Pin des Moduls, saubere 3.3V an (3.27V)
Das selbe gilt für low. (~0.08V)

: Bearbeitet durch User
von Holger K. (holgerkraehe)


Lesenswert?

Guten Morgen zusammen.

Ich versuche mal einen push...


Danke

von bla (Gast)


Lesenswert?

Naja, ferndiagnostisch ist da nicht mehr viel zu sagen. Wenn der erste 
Transmit geht aber alle anderen nicht, scheint die Verkabelung zu 
stimmen. Zu schnell sendest du mit ca. 500Hz auch nicht. Und abgeblockt 
hast du ja schon.

Ich hatte neulich ein ähnliches Problem, da waren CE und CSN vertauscht. 
Das könnte erklären warum die erste Transaktion funktioniert, aber alle 
anderen nicht mehr. das erklärt aber nicht warum das Statusregister 
immer gesendet wird.

Der nächste Schritt wäre jetzt Komponenten tauschen bis es geht und 
dadurch isolieren ob und wo der Fehler in Hardware liegt. Z.B. Test mit 
nem anderen Mikrocontroller, oder organisiere dir Module von denen man 
weiß dass sie funktionieren. Itead hat z.B. angeblich echte nRFs von 
Nordic.

von Holger K. (holgerkraehe)


Lesenswert?

bla schrieb:
> Naja, ferndiagnostisch ist da nicht mehr viel zu sagen. Wenn der
> erste
> Transmit geht aber alle anderen nicht, scheint die Verkabelung zu
> stimmen. Zu schnell sendest du mit ca. 500Hz auch nicht. Und abgeblockt
> hast du ja schon.
>
> Ich hatte neulich ein ähnliches Problem, da waren CE und CSN vertauscht.
> Das könnte erklären warum die erste Transaktion funktioniert, aber alle
> anderen nicht mehr. das erklärt aber nicht warum das Statusregister
> immer gesendet wird.
>
> Der nächste Schritt wäre jetzt Komponenten tauschen bis es geht und
> dadurch isolieren ob und wo der Fehler in Hardware liegt. Z.B. Test mit
> nem anderen Mikrocontroller, oder organisiere dir Module von denen man
> weiß dass sie funktionieren. Itead hat z.B. angeblich echte nRFs von
> Nordic.

Vielen Dank für deine Antwort.
Ich könnte mir auch einfach einen einzelnen nRF24 Chip bestellen, und 
diesen auf dem Modul austauschen.

An die vertauschte CE / CS Leitung habe ich heute auch noch gedacht.
Kam dann aber auch zum schluss, dass dies dann nicht das Statusregister 
erklären würde. Dieses (habe ich geprüft) kommt nämlich wirklich nicht, 
wenn CS High ist. Macht ja auch sinn.

von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Ich versuche mal einen push...

Deine Schaltung und dein Aufbau sind ja perfekt (ja du bist
ein unbestrittener Meister deines Fachs), daher brauchst du
uns die ja nicht zu zeigen.

von Holger K. (holgerkraehe)


Lesenswert?

Frickelfritze schrieb:
> Holger K. schrieb:
>> Ich versuche mal einen push...
>
> Deine Schaltung und dein Aufbau sind ja perfekt (ja du bist
> ein unbestrittener Meister deines Fachs), daher brauchst du
> uns die ja nicht zu zeigen.

Das Problem ist, dass das letzte Schema überhaupt nicht mehr mit dem 
jetzigen Aufbau übereinstimmt.

Den Aufbau kann ich schon zeigen. Kann erst am Abend ein Foto machen.
Meine Annahme war, dass wenn ich die Signale am Modul betrachte, dies 
grundsätzlich die höchste Aussagekraft hat.

Ich liefere heute Abend gerne noch Fotos des Aufbaus nach.

Bin aber weiterhin froh über jeden Kommentar zum Thema, wenn er denn 
konstruktiv ist.

: Bearbeitet durch User
von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Bin aber weiterhin froh über jeden Kommentar zum Thema, wenn er denn
> konstruktiv ist.

Wenn du das hier

Beitrag "Re: NRF24L01 (SPI Problem) sendet nur Status"

als Schaltplan bezeichnest .... dann gute Nacht.

Zu einem Schaltplan gehört übrigens auch ein Netzteil,
also das Teil wo die Energie herkommt.

Wenn du das als nicht konstruktiv betrachtest dann lasse
es dir von jemand anders erklären.

"konstruktiv" von dir wäre es auf Fehler die du gepostet
hast einzugehen, wie z.B. der erste Sourcecode der keine
Betätigung des Chip Selects beinhaltet. Wir wissen also
immer noch nicht genau mit welchem Code die Symptome
aufgetreten sind.

"konstruktiv" von dir wäre es auch, alles in einem Guss zu
repräsentieren, also (kompletter, authentischer) Schaltplan,
Aufbau und aktueller Code bei dem du die entsprechenden
Symptome festgestellt hast. Von dem was du bisher gezeigt
hast kann man keine vernünftige Analyse betreiben.

Wenn du das vorangegangene Posting Chaos mal bereinigt
bzw klargestellt hast dann geht vielleicht was weiter.

von Holger K. (holgerkraehe)


Lesenswert?

Frickelfritze schrieb:
> Wenn du das vorangegangene Posting Chaos mal bereinigt
> bzw klargestellt hast dann geht vielleicht was weiter.

Die Timingdiagramme des Logikanalysators sprechen für sich.
Was spielt der zugrundeliegende Code für eine Rolle?
Das entscheidenste sind die Signale beim Modul. Diese sind klar und 
deutlich dargestellt.

von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Die Timingdiagramme des Logikanalysators sprechen für sich.

Das wiederum zeigt deine Naivität bzw Unerfahrenheit.
Ein Logikanalysator zeigt keine analogen Signale, auch wenn
in beiden Worten "log" vorkommt. Der hilft nur was wenn man
sich seiner Schaltungstechnik absolut sicher ist. Ich sage
mal für dich dass du das nicht bist. Vermutlich wirst du
nicht einmal wissen was du mit analoger Messtechnik machen
bzw erreichen könntest.

Dein Aufbau ist wohl nicht herzeigbar sonst hätten wir ihn
schon längst gesehen.

Aber mach nur weiter so, irgendwie wurschtelst du dich schon
durch.

von Schart (Gast)


Lesenswert?

Frickelfritze schrieb:
> Holger K. schrieb:
>> Die Timingdiagramme des Logikanalysators sprechen für sich.
>
> Das wiederum zeigt deine Naivität bzw Unerfahrenheit.
> Ein Logikanalysator zeigt keine analogen Signale, auch wenn
> in beiden Worten "log" vorkommt. Der hilft nur was wenn man
> sich seiner Schaltungstechnik absolut sicher ist. Ich sage
> mal für dich dass du das nicht bist. Vermutlich wirst du
> nicht einmal wissen was du mit analoger Messtechnik machen
> bzw erreichen könntest.
>
> Dein Aufbau ist wohl nicht herzeigbar sonst hätten wir ihn
> schon längst gesehen.
>
> Aber mach nur weiter so, irgendwie wurschtelst du dich schon
> durch.

>>> Ich bin dann mal weg.

Das nenne ich inkonsequent.

von Frickelfritze (Gast)


Lesenswert?

Schart schrieb:
> Das nenne ich inkonsequent.

Das gebe ich zu.

Bin keiner vom Typ "was kümmert mich mein Geschwätz von gestern".

Aber der Mist der hier abläuft hat mich provoziert ....

von Holger K. (holgerkraehe)


Lesenswert?

Frickelfritze schrieb:
> Dein Aufbau ist wohl nicht herzeigbar sonst hätten wir ihn
> schon längst gesehen.

Das liegt eher daran, dass ich noch nicht die Zeit gefunden habe für ein 
Bild.

Frickelfritze schrieb:
> Aber der Mist der hier abläuft hat mich provoziert ....

Ich bin dir sehr dankbar für deine Posts.
Denn damit hälst du meinen Thread regelmässig an erster Stelle.

von Frickelfritze (Gast)


Lesenswert?

Holger K. schrieb:
> Denn damit hälst du meinen Thread regelmässig an erster Stelle.

Ja das ist wohl dein Erfolgskonzept: möglichst viel Chaos
und Mist erzeugen, dazu vielleicht noch ein paar Postulate
dass den Fachleuten hier im Forum die Haare zu Berge stehen.

Sehr empfehlenswert!

von Christian S. (roehrenvorheizer)


Lesenswert?


von Holger K. (holgerkraehe)


Lesenswert?

Problem ist gelöst.

Man sollte die Polarität des Clocks mit dem Datenblatt vergleichen!

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.