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.
Genau so wird es dann wohl gemeint sein. Jetzt weiß ich ja Bescheid :-). Gruß, Matze
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.