Forum: Mikrocontroller und Digitale Elektronik nrf24l01+ löscht Empfangsspeicher nicht


von Matze (Gast)


Lesenswert?

Hi Leute !

Laut Datenblatt sollte der nrf24l01+ den RX FIFO automatisch löschen, 
nachdem dieser ausgelesen wurde. Leider funktioniert das bei mir nicht. 
Ich kann den Speicher so oft hintereinander auslesen, wie ich will, ich 
erhalte dabei immer den ursprünglichen Empfangswert zurück. Auch ein 
manuelles Löschen des RX FIFO mittels FLUSH_RX bringt nichts, der 
Speicher bleibt erhalten. Und jetzt wird's noch merkwürdiger. Sowohl das 
Status-Register, als auch der FIFO-Status sagen: RX FIFO Empty. Da 
sollte also eigentlich in der Tat nichts mehr zum Auslesen drin sein.

Wieso erhalte ich dann aber auch beim wiederholten Auslesen immer wieder 
einen Wert?

Gruß,
Matze

von uart (Gast)


Lesenswert?

>RX FIFO Empty

Warum willst du auslesen, wenn der Status auf empty steht?

Welchen Wert erwartest du bei "gelöschtem" Speicher?
0x00 oder 0xff oder 0x80 oder was?
Ist das dann besser als der alte Wert?

von Matze (Gast)


Lesenswert?

Also ich experimentiere hier gerade nur etwas mit zwei nrf24l01+ herum, 
um mich mit den Modulen vertraut zu machen, also erst mal ohne konkrete 
Anwendung. Und dabei ist mir eben aufgefallen, daß der Empfänger den 
Empfangsspeicher (RX FIFO) eben nicht löscht, nachdem ich diesen mit dem 
ATTiny44A ausgelesen habe. Sowohl das Status-Register (RX_P_NO), als 
auch das FIFO-Register (RX_EMPTY) "behaupten" aber: RX FIFO empty. Und 
wie gesagt, ein manuelles Löschen (FLUSH_RX) ändert auch nichts daran, 
daß ich den angeblich leeren Empfangsspeicher wiederholt auslesen kann, 
und immer wieder den vom Sender einmalig übertragenen Wert 
zurückbekomme.

Und welchen Wert erwarte ich beim Auslesen eines leeren Speichers? 
Natürlich NULL, was sonst? Genau den Wert bekomme ich ja auch, wenn ich 
den Empfangsspeicher direkt nach dem Einschalten und Initialisieren des 
nrf24l01+ auslese, also quasi wenn noch keine Übertragung durch den 
Sender erfolgt und der Speicher dementsprechend definitiv noch leer ist.

Also irgendwas haut hier irgendwie nicht hin !?

Gruß,
Matze

von Ulrich F. (Gast)


Lesenswert?

Matze schrieb:
> Also irgendwas haut hier irgendwie nicht hin !?

Ja, dein Blickwinkel hat einen Knick.



Wie kommt man auf eine solche absurde Idee, leere Puffer auszulesen?

Und noch absurder:
Wie kommt man auf die Idee, dass der Baustein da Nullen rein schreibt?
Warum sollte er das denn tun?

Was steht dazu im Datenblatt?
Auf das im Datenblatt definierte Verhalten sollte man sich verlassen 
können!

von Matze (Gast)


Lesenswert?

Immer schön ruhig, Brauner! Kein Grund sich aufzuregen.

" ... Wie kommt man auf eine solche absurde Idee, leere Puffer 
auszulesen? ..."

Ich sagte doch bereits: Ich experimentiere halt ein bißchen rum, da 
kommt man dann auch mal auf solche Absurditäten.

Nee, aber mal ernsthaft: Im Empfänger-µC (ATTiny44A) hatte ich einen 
Loop installiert, der alle 20 s den Empfangsspeicher des nrf24l01+ 
ausliest und anzeigt. Dann habe ich den Sender einmalig einen Wert 
senden lassen und wieder ausgeschaltet. Der Wert wurde mir dann am 
Empfänger auch korrekt angezeigt. Nun sollte der nrf24l01+, nachdem der 
µC den Empfangsspeicher ausgelesen hat, diesen automatisch löschen. 
Demnach hätte ich nach weiteren 20 s, also beim nächsten Auslesen, nicht 
mehr den gesendeten Wert in der Anzeige sehen müssen, sondern 0. Und ja, 
wenn ich den leeren RX FIFO auslese, bekomme ich, wie bereits erwähnt, 
tatsächlich 0 zurück. Was auch sonst? Wenn nichts drin steht, steht 
nichts drin. Ich verstehe hier Deine Frage nicht. Aber egal, jedenfalls 
erhalte ich keine 0, sondern nach wie vor den Ausgangswert, so als würde 
der RX FIFO eben nicht vom nrf24l01+ nach dem ersten Auslesen gelöscht 
worden sein.

Gruß,
Matze

von Ulrich F. (Gast)


Lesenswert?

Ich rege mich ja nicht auf....
Versuche ja nur dir einen Schuss aus der Blickwinkelkanone zu verpassen.
Denn dein Blickwinkel benötigt eine Korrektur.
(ist mir offensichtlich nicht gelungen)



Hmmm.....

Dann versuche ich es mal anders:
Das Problem an deinem Vorgehen ist, dass du den Baustein nicht fragst ob 
er was empfangen hat. Ob da gültige Daten drin stehen.
Irgendwie musst du von dem Pferd runter .....

Und auf das andere drauf:
Baustein fragen, "Hast du Daten?"
Wenn ja, lesen, wenn nein, dann nein.
Glaube dem Register.
Arbeite logisch.

> Nun sollte der nrf24l01+, nachdem der
> µC den Empfangsspeicher ausgelesen hat,
> diesen automatisch löschen.
Wer sagt das?
Das Datenblatt nicht!


Tipp:
Träume dir keine Nullen irgendwo hin, wo keiner welche rein macht.
Ein Irrweg.

von Lars R. (lrs)


Lesenswert?

Wenn Du auf der Festplatte eine Datei löschst, so wird im Normalfall die 
Datei nicht mit Nullen überschrieben. Es wird lediglich der Eintrag im 
Verzeichnis gelöscht, der besagt, dass die Datei existiert. Der Grund 
ist, dass ein Überschreiben der Datei mit Nullen nur unnötig 
(Rechen)-Zeit und Datendurchsatz kostet und sonst keinen Nutzen hat (Vom 
Aspekt der sicheren Löschung aus security-Gründen einmal abgesehen).
Deshalb geht auch das Verschieben großer Dateien auf der selben 
Partition sehr schnell. Der Dateiinhalt wird nicht gelesen, mit Nullen 
überschrieben und an anderer Stelle erneut geschrieben. Vielmehr werden 
lediglich die Einträge im Verzeichnis geändert, die auf den Dateiinhalt 
verweisen.

Nach dem Einschalten, bei der Initialisierung, kann eventuell jedes 
FIFO-Element den Wert "Null" besitzen. Aber es verursacht merklichen 
Aufwand, jedes Fifo-Element mit 0 zu überschreiben, ohne das hieraus ein 
Nutzen entsteht. Vielmehr benutzt man einen Zähler, der beim Schreiben 
auf die FIFO inkrementiert und beim Lesen aus der FIFO dekrementiert 
wird. Ist dieser Zähler NULL, so gilt die FIFO als leer. <- Vereinfachte 
Darstellung

Häufig ist die FIFO als Ringspeicher konzeptioniert. Demnach könnten 
beim Lesen aus einer FIFO sogar mehrere Bytes wiederholt ausgelesen 
werden, die bereits ausgelesen wurden. Falls dies der Fall ist, so wurde 
bei der Implementiertierung der FIFO die Inkrementierung des Lesezeigers 
bei leerer FIFO nicht unterbunden. Dann (und auch sonst) ist es am 
besten, keinesfalls aus der FIFO zu lesen, wenn der FIFO-Zähler auf NULL 
steht, also das FIFO_IST_LEER-Status gesetzt ist.

Lars

von Andrea Bergs grösster Fan (Gast)


Lesenswert?

Matze schrieb:
> Wieso erhalte ich dann aber auch beim wiederholten Auslesen immer wieder
> einen Wert?
Erst liest man das Statusflag -> "Bimmel, neues Paket da bitte abholen"
dann liest man den Puffer aus und sonst gar nicht. Wenn mn das doch 
macht steht irgenwas drinn, was genau ist nicht spezifiziert und 
garantiert.

Lies das Datenblatt.

von Matze (Gast)


Lesenswert?

OK Leute, danke für Eure Erläuterungen. Und ich sehe es ein, daß es 
offensichtlich unlogisch ist, darauf zu bestehen, daß der RX FIFO nach 
dem Auslesen gelöscht wird, auch wenn es tatsächlich

@  Ulrich F.

" ... Wer sagt das? Das Datenblatt nicht! ... "

so im Datenblatt steht:

Command name: R_RX_PAYLOAD

Read RX-payload: 1 – 32 bytes. A read operation
always starts at byte 0. PAYLOAD IS DELETED FROM
FIFO AFTER IT IS READ. Used in RX mode.

Aber wie gesagt, es spielt ja nicht wirklich eine Rolle. Ich hab's jetzt 
so gemacht, daß bei Empfangseingang das Empfängermodul einen IRQ 
auslöst, der den Tiny weckt, und dann wird durch diesen der RX FIFO 
ausgelesen.

Funktioniert, und gut ist ;-) ....

Gruß,
Matze

von GGast (Gast)


Lesenswert?

Matze schrieb:
> PAYLOAD IS DELETED FROM
> FIFO AFTER IT IS READ

Das heißt nicht, dass der Speicher gelöscht wird. Der Eintrag wird nur 
als "gelesen" markiert - was du ja auch gemerkt hast, die Flags sind 
dann entsprechend.

von Matze (Gast)


Lesenswert?

Genau so wird es dann wohl gemeint sein. Jetzt weiß ich ja Bescheid :-).

Gruß,
Matze

von Ulrich F. (Gast)


Lesenswert?

Matze schrieb:
> Read RX-payload: 1 – 32 bytes. A read operation
> always starts at byte 0. PAYLOAD IS DELETED FROM
> FIFO AFTER IT IS READ. Used in RX mode.
Ja, ja , ja ...
Vielleicht etwas unglücklich formuliert....
Aber mit solchen Ideen rechtet ein Entwickler auch nicht.
Dafür sind die zu Betriebsblind.


> Funktioniert, und gut ist ;-)
Nicht nur das, du hast eine schöne Variante gewählt.

von Matze (Gast)


Lesenswert?

;-) :-) ;-)

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.