Forum: Mikrocontroller und Digitale Elektronik Wie nutzt man Flash ICs z.B. Winbond mit AVR tiny?


von Jan (Gast)


Lesenswert?

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?

von Johannes S. (Gast)


Lesenswert?

Einen fetteren ARM nehmen?

von K. S. (the_yrr)


Lesenswert?

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?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
von Tom T. (tomth)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Andre (Gast)


Lesenswert?

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.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Frank K. (fchk)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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

von Jan (Gast)


Lesenswert?

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.

von Tilo (Gast)


Lesenswert?

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.

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.