Hallo,
ich habe da mal ein eine Frage bezuglich der SPI-Commands, mir ist der
unterschied/nutzen dieser drei Commands nicht ganz klar, vielleicht
könnt ihr licht in die Sache bringen?
CMD: W_TX_PAYLOAD_NO ACK
bedeutet doch:
Schreibe zu sendene Daten in Tx-Sendespeicher (FIFO), OHNE eine ACK
(Empfangsbestätigung)anforderung vom Empfänger.
CMD: W_TX_PAYLOAD
bedeutet doch:
Schreibe zu sendene Daten in Tx-Sendespeicher (FIFO) und hänge eine ACK
(Empfangsbestätigung)anforderung vom Empfänger an.
CMD: W_ACK_PAYLOAD
bedeutet doch:
Schreibe zu sendene Daten für eine ACK-Antwort, die versendet wird wenn
ein Datenpacket mit ACK-Bestätigung empfangen wird, zusätzlich kann die
Sende-PIPE mit ausgewählt werden.
Habe ich die Sache soweit richtig verstanden?
Denn dauerbesuchern hier ist sicher aufgefallen das ich diesen Post
schon bei den Funkern gepostet habe, da aber die letzten Fragen auch
schon nicht mehr beantwortet worden sind und der Post auch schon
ziemlich lang ist habe ich mich entschieden hier noch einmal zu fragen,
also bitte nicht böse sein :)
gruß
Matthias
Der Befehl W_ACK_PAYLOAD ist dafür da, eine ACK-Nachricht zu
verschicken. Das brauchst Du, wenn Du Auto-ACK deaktiviert hast und
selbst entscheidest, ob Du ein Paket bestätigen willst oder nicht.
Die Pipe, die Du angibst, ist nicht die Sende-Pipe (davon gibt es ja nur
eine), sondern die Pipe, auf der das Paket reinkam, dessen Empfang Du
bestätigen willst. Zusätzlich zum ACK (also der Information "Ich habe
das Paket erhalten, du brauchst es nicht nochmal probieren") kannst Du
halt auch gleich noch andere Daten mitsenden.
xfr schrieb:> Der Befehl W_ACK_PAYLOAD ist dafür da, eine ACK-Nachricht zu> verschicken. Das brauchst Du, wenn Du Auto-ACK deaktiviert hast und> selbst entscheidest, ob Du ein Paket bestätigen willst oder nicht.
Habe gerade nochmal ins Datenblatt reingeschaut. Bin mir jetzt doch
nicht so sicher, ob das stimmt. In der Beschreibung des Befehls steht ja
"Maximum three ACK packet payloads can be pending". Das würde eher für
Deine Erklärung sprechen, dass man damit nur die Payload eines
ACK-Pakets setzen kann (sofern es eine haben soll), aber nicht das
eigentliche Senden des ACK-Pakets anstößt.
Hab den Befehl bisher noch nicht genutzt, daher sorry, falls ich
Blödsinn erzählt habe. Werde es bei Gelegenheit mal ausprobieren.
Ich habe es gerade ausprobiert. Es schon so, wie ich es zuerst gesagt
habe:
Mit W_ACK_PAYLOAD sendet man selber ein ACK-Paket, das auch noch Payload
enthält. Wenn man beim Empfänger Auto-ACK deaktiviert und beim Sender
aktiviert, kann der Empfänger manuell entscheiden, ob er ein empfangenes
Paket bestätigen möchte oder nicht. Das ACK-Paket muss allerdings
mindestens ein Byte Payload enthalten, ein leeres Paket senden geht
anscheinend nicht.
Das ACK-Paket mit Payload wird wie ein normales Paket empfangen, man
kann es allerdings nicht nochmal ACKen. Es entsteht also keine
Endlosschleife, wenn man jedes empfangene Paket manuell bestätigt.
Super danke erstmal für die erklärung, bin gerade dabei es zu versuchen
ein eigenes ACK sendenzulassen, aber irgendwas haut noch nicht hin
gruß
Matthias
Hallo xfr,
kannst du mir noch mal ein wenig helfen zum Thema W_ACK_PAYLOAD?
Ich bekomme einfach kein eigenes ACK am Sender :(
wie muss der Empfänger richtig eingestellt werden?
muss EN_AA=0 auto ACK aus?
Über W_ACK_Payload ein ACK packet schreiben, vor empfang von sender oder
nach empfang des senders?
wie muss der Sender richtig eingestellt werden?
muss EN_AA=0 auto ACK aus? oder kann hier die ACK automatik
eingeschaltet bleiben?
Senden über W_TX_PAYLOAD (also mit ACK anforderung), oder?
wäre dir dankbar wenn du meine versuchsketten etwas abkürzen könntest.
gruß
Matthias
Bei mir hat es so funktioniert:
- Die FEATURE-Befehle mit ACTIVATE aktivieren.
- Im FEATURE-Register EN_DPL, EN_ACK_PAY und EN_DYN_ACK setzen (bei
Sender und Empfänger).
- Beim Sender EN_AA auf Pipe 0 einschalten.
- Beim Empfänger EN_AA auf der Empfangspipe ausschalten.
- Beim Sender mit W_TX_PAYLOAD senden.
- Beim Empfänger warten, bis ein Paket eintrifft (RX FIFO not empty).
- Paket lesen.
- Mit W_ACK_PAYLOAD das ACK-Paket (mind. 1 Byte Payload) senden. Dabei
die Pipe angeben, auf der Paket reinkam (RX_P_NO im STATUS-Register).