Forum: Mikrocontroller und Digitale Elektronik Fragen zum Senden mit RFM70


von Laserbrenner (Gast)


Lesenswert?

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

von xfr (Gast)


Lesenswert?

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.

von xfr (Gast)


Lesenswert?

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.

von xfr (Gast)


Lesenswert?

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.

von Laserbrenner (Gast)


Lesenswert?

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

von Laserbrenner (Gast)


Lesenswert?

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

von xfr (Gast)


Lesenswert?

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).

von Laserbrenner (Gast)


Lesenswert?

Super Danke,
so geht es.

nochmal danke

gruß
Matthias

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.