Hallo!
Für einen Datalogger brauche ich 2 MB Platz. Deshalb muss ich wohl einen
Flash IC einplanen. Z.B. sind die W25xxxx von Winbond anscheinend
verbreitet. Nun habe ich aber gelesen, dass man Flash nur schreiben
kann, nachdem eine Seite gelöscht wurde. Allerdings können die Winbond
nur minimal 4kB auf einmal löschen. Jetzt bin ich verwirrt... wenn ich
also irgendwann mal ein Byte ändern will, muss ich dann tatsächlich erst
4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern?
Dazu bräuchte ich ja einen ziemlich fetten AVR, der mindestens 5 kB SRAM
hat, nämlich 4 kB für die Page zum temporären Speichern + 1 kB für sich
selbst. Das kanns ja nicht sein. Gibts da einen Trick?
Jan schrieb:> Jetzt bin ich verwirrt... wenn ich> also irgendwann mal ein Byte ändern will, muss ich dann tatsächlich erst> 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern?
Ja.
> Das kanns ja nicht sein. Gibts da einen Trick?
Flash mit kleinerer Page Größe? EEPROM?
Jan schrieb:> muss ich dann tatsächlich erst> 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern?
Ja, so ist das.
Jan schrieb:> Das kanns ja nicht sein. Gibts da einen Trick?
Oft funktioniert das setzen eines Bits auf 0 auch ohne das Löschen einer
Page. Nur für das setzen auf 1, muss die ganze Page gelöscht (also alle
Bits der Page auf 1) werden.
Muss man denn wirklich bei einem Datenlogger einzelne Bytes ändern?
Kann man da nicht die Page löschen und neu aufnehmen?
Konfiguration, die auf Byte-level verändert werden sollte, sollte am
Besten in den EEPROM.
Und sonst sollte man beim Flash auch wear-leveling berücksichtigen.
Um dein Problem zu lösen könnte man die Daten auch erstmal in eine
andere Sektion im Flash kopieren und dann beim Kopieren einzelne Bytes
verändern.
Jan schrieb:> Nun habe ich aber gelesen, dass man Flash nur schreiben> kann, nachdem eine Seite gelöscht wurde. Allerdings können die Winbond> nur minimal 4kB auf einmal löschen. Jetzt bin ich verwirrt... wenn ich> also irgendwann mal ein Byte ändern will, muss ich dann tatsächlich erst> 4 kB einlesen, die Page löschen und dann die ganzen 4 kB neu speichern?
Ja, so ist das halt bei Flash.
> Dazu bräuchte ich ja einen ziemlich fetten AVR, der mindestens 5 kB SRAM> hat, nämlich 4 kB für die Page zum temporären Speichern + 1 kB für sich> selbst. Das kanns ja nicht sein. Gibts da einen Trick?
Nur einen: einen Flash-Stein mit RAM-Cache verwenden.
c-hater schrieb:> Nur einen: einen Flash-Stein mit RAM-Cache verwenden.
Dann kann man auch noch einen Schritt weiter gehen und auf SD-Karten
setzen. Die kümmert sich dann auch direkt selbst um Wear-Leveling usw.
Jan schrieb:> Jetzt bin ich verwirrt... wenn ich> also irgendwann mal ein Byte ändern will,
Irgendwie erscheint mit dein Konzept etwas merkwürdig.
Warum sollte man bei einem Datenlogger bereits gespeicherte Daten im
Nachhinein nochmal ändern wollen?
Normalerweise schreibt man da doch einfach die Datensätze fortlaufend
weg bis man irgendwann mal sagt lösche die gesamte Log.
Oder wenn man den gesamten Speicher zyklische verwenden will hat man in
der Regel genügend Vorlauf um den ältesten Block bei Zeiten zu löschen
um diesen dann wieder verwenden zu können.
Jan schrieb:> Jetzt bin ich verwirrt... wenn ich> also irgendwann mal ein Byte ändern will...
...dann solltest du dich schleunigst an deinen Tisch setzen, Papier und
Stift bereithalten und versuchen, zu denken. Oder selbiges wenigstens
zu versuchen.
So ein serieller Flash kann eben bloß blockweise auf FF gelöscht werden,
also solltest du dir einen zu so einem Chip passenden Algorithmus
ausdenken. Das ist eigentlich alles. Für einen Datenlogger braucht man
überhaupt nicht "irgendwann mal ein Byte" zu ändern.
Der Knackpunkt ist eigentlich nur, die aktuelle Schreibposition zu
finden. Das kann man so machen, daß man sich für seine zu loggenden
Daten einen Record (bzw. struct) ausdenkt, dessen 1. Byte garantiert
nicht FF ist und dessen Länge so bemessen ist, daß eine glatte Anzahl
solcher Datenstructs in einen Block des seriellen Flashes hineinpassen.
Jetzt muß man nach dem Einschalten des Gerätes zunächst erstmal suchen,
bei welchem Block des Chips das erste Byte = FF ist. Entweder man sucht
ab 0 oder ab letztem Block. Ist Ansichtssache. Das nette an solchen
seriellen Flashes ist (zumeist), daß man nicht den ganzen Block lesen
muß, sondern auch bei Bedarf nur das jeweils 1. Byte eines Blockes.
Damit findet man die aktuelle Schreibposition schneller.
Wenn man so einen Block mit FF als erstem Byte gefunden hat, betrachtet
man den vorherigen Block und sucht darin die Stelle, wo der erste
Datenrecord mit 1. Byte = FF ist. Wenn keiner drin ist, dann nimmt man
den nächsten Block als aktuellen Block und löscht vorsorglich dessen
Nachfolgeblock. So hat man grundsätzlich immer einen gelöschten Block
auf dem Chip, um die aktuelle Schreibposition zu finden.
Siehste, und ab da kannst du mit dem Logging anfangen. Wenn ein Block
voll ist, wird der nächste Block genommen (der ja per Procedere gelöscht
ist) und zugleich dessen Nachfolgeblock gelöscht. Und so geht das
beliebig lange immer im Kreise herum. Bist du beim letzten Block des
Chips, dann ist der erste Block wieder dran. Eben ne Art Ringpuffer.
Klaro?
W.S.
Es gibt SPI-SRAM von Microchip: 23K256 z.B. oder 23LC1024. Das kannst Du
als Cache nehmen, um das Flash so lange wie möglich im Powerdown-Zustand
zu halten.
fchk
Andre schrieb:> Dann kann man auch noch einen Schritt weiter gehen und auf SD-Karten> setzen. Die kümmert sich dann auch direkt selbst um Wear-Leveling usw.
Ja. Mehr oder weniger...
Prinzipiell hast du natürlich vollkommen Recht, leider ist aber bei
SD-Karten derartig viel Vollschrott im Umlauf, dass es wirklich schwer
fällt, brauchbare Hardware zu kaufen. Kauft man sie dort, wo man sich
auf die Eigenschaften verlassen kann, sind sie einfach mal nur sehr
teuer.
Braucht man nur relativ wenig Speicherplatz, ist es nicht unbedingt der
weiseste Schluß, auf SD-Card zu setzen...
W.S. schrieb:> ...dann solltest du dich schleunigst an deinen Tisch setzen, Papier und> Stift bereithalten und versuchen, zu denken. Oder selbiges wenigstens> zu versuchen.
Das ist genau die richtige Aufgabe für dich.
Zb solltest du erstmal ordentlich Tasten enprellen lernen bevor due
andere dumm anmachst.
Wer das nichtmal kann sollte nämlich seeehr leise sein ;)
OK dann nehme ich einen EEPROM für die kleinen Statistiken und das Flash
für den seriellen Kram, was ich auch auf Tape packen würde. Hindert mich
ja nichts dran, das zu kombinieren.
Bei Flash wird immer eine gesamte Seite auf einmal gelöscht, also jedes
Byte auf 0xFF gesetzt.
Zumindest den Flash den ich kenne, kann man nach dem Löschen beschreiben
wie man will. Eine bereits gesetzte Null bekommt man erst dann wieder
auf Eins gesetzt, in dem die komplette Seite gelöscht wird.
Also Ja, ein Byte zwischendrin ändern geht nicht. Du könntest aber die
Seite im Flash kopieren, löschen, die Seite ohne die zu ändernden Daten
zurückkopieren und dabei die Daten modifizieren.
Brauchst du das bei einem Datenlogger wirklich?
Hatten einige Tinys nicht ein EEprom? Dort könnte man die
Schreibposition ablegen.