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?
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"
quelle
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!
quelle