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
>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?
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
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!
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
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.
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
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.
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
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.
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.