Flash-Speicher: Muss die gesamte Seite gelöscht werden, bevor nur wenige Bytes geschrieben werden?


16

Eine einfache Frage, hoffe ich! Ich finde keine endgültigen Antworten ...

Ich schreibe Treiber für einen SST25VF064C- Flash-Speicherchip. Es kommuniziert über SPI.

Wie jeder Flash-Speicher (den ich kenne) muss er gelöscht werden (alle Bits = 1), bevor er geschrieben werden kann (Bits = 0). Für diesen Chip beträgt der kleinste Bereich, der gelöscht werden kann, 4 KB.

Sein Speicher ist in 256-Byte-Seiten unterteilt. Mit einer Anweisung kann ich zwischen einem Byte und 256 Byte in eine bestimmte Seite schreiben. Ich muss nicht an einer Seitengrenze beginnen: Der erste zu programmierende Ort kann an einer beliebigen Stelle auf einer Seite liegen.

In der Regel wird sichergestellt, dass die Seite vor dem Schreiben gelöscht wird. Aber kann ich in eine zuvor geschriebene Seite schreiben, wenn ich die bereits geschriebenen Bereiche vermeide? Angenommen, ich speichere Daten in Bytes 0-127. Kann ich später weitere 128 Byte in dieselbe Seite schreiben, wenn ich bei Byte 128 beginne?

Antworten:


13

Ja, nach jedem Löschen können Sie eine beliebige Anzahl separater Vorgänge zum Schreiben von Daten (Ändern der Bits von 1 auf 0) vor dem nächsten Löschvorgang verwenden.

Sie können sogar eine zuvor geschriebene Stelle neu schreiben, solange Sie nur mehr Bits löschen. Dies kann nützlich sein, um beispielsweise Zuordnungsbitmaps zu verwalten.


Großartig, danke! Das war genau das, wonach ich gesucht habe.
Bitsmack

Beachten Sie, dass einige Chips es nicht mögen, dass Sie ein früheres Byte nach einem späteren schreiben, wenn Sie verschiedene Datenblätter durchsehen. Dies scheint jedoch von Gerät zu Gerät zu Gerät zu variieren.
Vality

1
@Vality: Kannst du ein Beispiel dafür geben?
Dave Tweed

3
@ DaveTweed NXP LPC21xx- und LPC23xx-MCUs verfügen über ein Prüfsummenbyte für jeweils 16 Byte Speicher. Sie müssen alle 16 Bytes auf einmal schreiben, da die Prüfsumme in dieser Operation geschrieben wird. Wenn Sie später kommen und versuchen, Nullen in dieselbe "Zeile" zu schreiben, werden die Nullen geschrieben, aber eine neue Prüfsumme wird auch über die vorherige geschrieben. Wahrscheinlich hat es einige Einsen, bei denen die vorherigen Nullen hatten, sodass die Prüfsumme ungültig wird. Ich erinnere mich nicht, ob die MCU es Ihnen erlaubt, eine Zeile mit einer schlechten Prüfsumme zu lesen. Jedenfalls wäre das ein Beispiel für "Geräteübergreifend variieren".
Guillermo Prandi

1
msgstr "beliebig viele separate Operationen zum Schreiben ... die nächste Löschoperation." Beachten Sie, dass einige Teile, insbesondere eingebettete Flash-Speicher in MCUs, eine maximale Anzahl von Schreibvorgängen angeben, bevor ein Löschen erforderlich ist. Wenn Sie dieses Limit vermutlich überschreiten, besteht die Gefahr, dass andere Speicherbereiche beschädigt werden. Achten Sie daher auf solche Limits.
Ajb

5

kann ich in eine bereits geschriebene Seite schreiben, wenn ich die bereits geschriebenen Bereiche vermeide?

Wenn ich verstehe, p. 16 des Datenblattes richtig heißt es: Mit diesem speziellen Chip dürfen Sie nicht in eine zuvor geschriebene Seite schreiben, auch wenn Sie die bereits geschriebenen Bereiche meiden.

Einzelheiten

Das Datenblatt zum SST25VF064C-Flash-Speicherchip auf S. 22 . 16 sagt: "Die Seitenprogrammanweisung programmiert bis zu 256 Datenbytes in dem Speicher. Die ausgewählte Seitenadresse muss sich in dem gelöschten Zustand (FFH) befinden, bevor die Seitenprogrammoperation initiiert wird."

Ich gehe daher davon aus, dass "die gesamte ausgewählte Seite im gelöschten Zustand sein muss (jedes Byte auf der Seite FFh), bevor eine Seitenprogrammoperation eingeleitet wird." Hat SST oder Microchip eine Dokumentation veröffentlicht, die diesen verrückt mehrdeutigen Satz klarstellt?

Nach meiner Erfahrung schreibt der Hersteller aller MLC-Flash-Chips und einiger neuerer SLC-Flash-Chips vor, dass nach dem Schreiben einer Seite die Seite gelöscht werden muss , bevor diese Seite erneut geschrieben wird, auch wenn Sie nur ein Bit in a ändern möchten 0 bit. (Dies wird im YAFFS-Artikel als " Einmalschreib -Regel" bezeichnet .)

Nach meiner Erfahrung können Sie mit allen älteren Flash-Chips jedes 1-Bit in ein 0-Bit ändern, ohne einen Löschzyklus auszuführen, selbst wenn sich dieses Bit in einer Seite oder in einem Byte befindet, für das bereits andere Bits auf Null programmiert wurden - a Die Blitzseiten können zwischen den Löschvorgängen mehrmals programmiert werden. (Dies wird im YAFFS-Artikel als "Mehrfachschreiben" bezeichnet.)

Das Datenblatt des Herstellers ist ein bedingtes Versprechen des Herstellers an Sie. Solange Sie alle Datenblattempfehlungen befolgen, verspricht der Hersteller, dass der Chip wie angegeben funktioniert. Ich vermute, dass, wenn Sie eine zuvor geschriebene Seite programmieren und die bereits geschriebenen Bereiche meiden, eine gute Chance besteht, dass ein sofortiges Zurücklesen die Daten liefert, die Sie erwarten - die neu geschriebenen Bytes sind die Werte, die Sie gerade geschrieben haben. und die anderen Bytes sind wahrscheinlich unverändert. Da dies jedoch nicht den Empfehlungen des Datenblattes entspricht, können Sie sich nicht mehr auf alle Versprechen im Datenblatt verlassen. Ich höre Gerüchte, dass eine solche nicht genehmigte Aktivität die Vorratsdatenspeicherungszeit und -dauer aufgrund von Programmstörungen, Überprogrammierung, Ladungsfalle, ähnlichen Effekten wie DRAM-Zeilenhammer usw. beeinträchtigt .

Das Speicherverwendungsschema beeinflusst die Bitfehlerrate. Partielle Seitenprogrammierung, nicht sequentielle Seitenprogrammierung innerhalb des Blocks, übermäßiges Lesen pro Block ohne Löschen sowie ungleiche Anzahl von Leseoperationen innerhalb eines einzelnen Blocks erhöhen die Anzahl der Lesevorgänge Fehler stören. " - Michal Jedrak. Msgstr "NAND - Flash - Speicher in eingebetteten Systemen".

"Programmstörung tritt auf, wenn ein Bit während eines Seitenprogrammierungsereignisses ungewollt von" 1 "auf" 0 "programmiert wird. Dieser Bitfehler kann entweder auf der zu programmierenden Seite oder auf einer anderen Seite im Block auftreten. Vorspannungsbedingungen in Der Block während der Seitenprogrammierung kann dazu führen, dass eine kleine Strommenge in benachbarte Speicherzellen getunnelt wird. Wiederholte partielle Seitenprogrammierungsversuche verschlimmern diesen Zustand weiter. - Douglas Sheldon und Michael Freie. Msgstr "Testen in Flash - Speichern stören" . p. 8, 9.

"Programmstörung tritt auf, wenn ein Bit während eines Programmiervorgangs ungewollt programmiert wird (1 bis 0). ... Dieser Zustand wird durch zufälliges Programmieren im Block und durch Anwenden mehrerer teilweiser Schreibvorgänge auf die Seiten verschlimmert." "Yaffs NAND-Flash-Ausfallminderung"


0

Es ist sehr wahrscheinlich, dass die von Ihnen verwendete Programmiersoftware bereits die "erforderlichen" 256 Bytes schreibt. Es "scheint", als würde es Ihnen die Möglichkeit geben, von einem auf 256 Bytes zu schreiben, aber ich vermute, dass es die gewünschten Bytes mit einer "Maske" von 256 "FF" ODER-verknüpft. Wenn dies korrekt ist, können Sie jedes Byte einmal "sicher" schreiben , ohne die gesamten 4 KByte löschen zu müssen. Wenn eine Prüfsumme außerhalb Ihrer Kontrolle geschrieben wird, wird höchstwahrscheinlich eine ungültige Prüfsumme erstellt, wenn Sie ein weiteres Byte in ein zuvor geschriebenes Segment schreiben. Die Auswirkungen davon sind chipabhängig.

Wenn Ihre Programmiersoftware die "ODER-Verknüpfung" nicht ausführt, können Sie dies selbst tun. Löschen Sie ein 256-Byte-Segment, schreiben Sie das Byte (die Bytes) an die richtige (n) Position (en) ODER mit einer 256-Byte-FF-Maske und schreiben Sie das Segment auf die gewünschte Seite.

Ob eine der beiden Methoden mit einem bestimmten Chip funktioniert, können Sie leicht feststellen. Schreiben Sie in die ersten 128 Bytes, schreiben Sie in die zweiten 128 Bytes, stellen Sie sicher, dass die ersten 128 Bytes NICHT "durcheinander" sind!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.