Wird ein SPI-EEPROM-Chip die gleichen Probleme mit nicht-atomaren Schreibvorgängen haben wie das interne EEPROM eines dsPIC? [Duplikat]

Vor einiger Zeit hatte ich sporadisch Probleme mit dem internen EEPROM eines dsPIC. Hin und wieder wurde ein Wert im EEPROM beim Einschalten auf Null gesetzt. Ich habe das Problem bis zu dem Zeitpunkt verfolgt, an dem der Chip nach dem Löschschritt des Schreibzyklus, aber bevor der Schreibvorgang abgeschlossen war, die Stromversorgung verlor. Es drehte sich alles um das Timing des Herunterfahrens relativ zur Firmware-Ausführung, die (im Normalbetrieb) zufällig war. Ich löste dies, indem ich meinem EEPROM einen Pufferabschnitt hinzufügte, um sicherzustellen, dass ein unvollständiger Schreibzyklus bei Wiederherstellung der Stromversorgung abgeschlossen werden konnte. Ich musste EEPROM-Schreibvorgänge in eine atomare Operation umwandeln.

(Für weitere Details definiert meine Puffertechnik einen Bereich des persistenten Speichers, der aus drei Feldern besteht: Adresse zum Schreiben, zu schreibende Daten und ein READY-Flag. Ein "Schreiben" besteht aus vier Schritten: in den Puffer schreiben, READY setzen Flag, aus Puffer schreiben, READY-Flag löschen. Beim Einschalten prüfen Sie das READY-Flag. Wenn es gesetzt ist, führen Sie aus, was sich im Puffer befindet. Dies funktionierte gut im internen EEPROM.)

Jetzt verwende ich einen anderen dsPIC ohne internes EEPROM und versuche, einen externen EEPROM-Chip zum Speichern persistenter Daten zu verwenden. Ich frage mich, ob ich ähnliche Bedenken haben sollte. Sollte ich mir Sorgen machen, dass mein externer EEPROM-Chip während des Schreibens herunterfährt und Daten verliert, und einen Fix dafür in meine Firmware schreiben, wie ich es für das interne EEPROM getan habe? Oder garantiert der Chip selbst atomare Schreibvorgänge?

Gleiche Frage, gleiche Antwort: Der Chip garantiert NICHT den Abschluss von Schreibvorgängen. Damit müssen Sie auf die eine oder andere Weise umgehen.
Im Allgemeinen sollten Sie einen direkten Link zum Gerätedatenblatt bereitstellen , nicht einen Link zu einer Produktseite eines Händlers. Beachten Sie, dass dieses Gerät bei Schreibvorgängen mehr als zwei Größenordnungen langsamer ist (6 ms gegenüber 40 us) als das Flash-Gerät.
Meine andere Frage ist nur ein Duplikat, wenn jemand sie lesen und die gleichen Informationen wie diese erhalten kann. Es ist nicht unangemessen zu glauben, dass sich Flash- und EEPROM-Chips auf diese Weise unterschiedlich verhalten könnten.
Warum denken Sie, dass die Antwort in Bezug auf internes EEPROM und externes Flash unterschiedlich sein könnte? Das grundlegende Problem ist in allen drei Fällen dasselbe: Es erfordert erhebliche Energie, um den Zustand dieser Geräte zu ändern, und diese Energie kann nicht auf dem Chip gespeichert werden.
Flash löscht große Sektoren, EEPROM ist byte-löschbar. Ich fände es nicht unvernünftig zu glauben, dass die Designer der byte-löschbaren Technologie ein paar zusätzliche Bytes ausgeben würden, um einen Puffer hinzuzufügen, damit sie ein asynchrones Herunterfahren handhabt. Für Flash ist das natürlich viel teurer, schon allein aufgrund der Sektorgröße.

Antworten (2)

Der Chip kann atomare Schreibvorgänge nicht garantieren - wenn die Stromversorgung während des Schreibens (oder Löschens) unterbrochen wird, kann er nichts dagegen tun.

Natürlich könnten die Chip-Designer eine Art Haltespeicher implementieren (wie Sie es getan haben) - aber das fügt Kosten hinzu, die andere Benutzer nicht zahlen möchten. Was passiert auch, wenn der Strom ausfällt, während in den Puffer statt in den "echten" Speicher geschrieben wird?

Wenn die Stromversorgung während des Schreibens in den Puffer ausfällt, haben Sie verloren, was Sie schreiben wollten, aber Sie haben keine Ihrer zuvor gespeicherten Daten verloren. Das ist das Hauptanliegen: Ausschalten zwischen Löschen und Schreiben.
@StephenCollings - ja, fair genug, das funktioniert für viele Anwendungen.

Für eine zuverlässige Wiederherstellung von Daten aus dem EEPROM gibt es eine Reihe von Dingen, die getan werden können. Betrachten wir zum Beispiel das Speichern eines gelegentlichen Zählerwerts im dauerhaften Speicher des EEPROM. Sie müssen sowohl das hier diskutierte Verlustleistungsproblem als auch die Schreibdauereigenschaften des seriellen EEPROM berücksichtigen.

Es ist in Ordnung, das EEPROM im Lese- / Schreibmodus zu verwenden (vorausgesetzt, Sie haben Zeit dafür), solange Sie sicherstellen können, dass die Verschleißfestigkeit der Speicherzellen nicht in der Länge aufgebraucht wird Lebensdauer des Produkts. Zum Beispiel habe ich Produktdesigns mit externem EEPROM wie 93C46 erstellt, das über 3 Port-Pins mit dem Mikrocontroller verbunden ist. Ich habe bestimmte Orte in dem EEPROM verwendet, um Informationen zu akkumulieren, wie z. B. akkumulierte Zählung oder Gesamtzeitablauf. Ich habe Berechnungen unter Verwendung der Lebensdauerzahlen für 93C46 durchgeführt und festgestellt, dass Sie, wenn Sie sicherstellen möchten, dass ein Produkt 10 Jahre hält, im Durchschnitt zulassen können, dass der EEPROM-Standort einmal alle 10 Minuten aktualisiert wird.

In Anbetracht dessen entwerfe ich meine Software normalerweise so, dass der Mikrocontroller die aktuelle Zählung oder den Zeitakkumulator im lokalen RAM beibehält und dann eine Zeitgeberfunktion für eine Aktualisierung "einmal alle 10 Minuten" sorgt, um die RAM-Speicherorte in das EEPROM zu kopieren. Für viele Anwendungen ist diese einfache Lösung mehr als ausreichend, da der gelegentliche Verlust von 10 Minuten Akkumulation nicht besonders kritisch ist.

Wenn die Zählungswartung jedoch kritischer sein muss, können Sie den Mikrocontroller veranlassen, sein eigenes Ausschalten zu verwalten, und eine letzte Aktualisierung der EEPROM-Speicherorte von RAM-Speicherplätzen erzwingen, kurz bevor er sich selbst ausschaltet.

Und wenn eine noch kritischere Wartung erforderlich ist, können Sie eine Frühwarnunterbrechung bei Stromausfall einrichten, die es der Software ermöglicht, eine Aktualisierung des EEPROM zu erzwingen, kurz bevor der Mikrocontroller seine Blutversorgung mit Elektronen verliert.

Nun gibt es ein noch wichtigeres Thema, das bei der Verwendung eines EEPROM zur Aufrechterhaltung nichtflüchtiger Zähler zu berücksichtigen ist. Dies bezieht sich darauf, wie Sie den Prozess der Aufrechterhaltung einer zuverlässigen Speicherung der Akkumulatoren verwalten, wenn der Strom abgeschaltet wird, während Sie gerade in das EEPROM schreiben. Ich habe dieses Problem im Laufe der Jahre in vielen Projekten wie folgt angegangen:

Nehmen wir als Beispiel den 93C46-Chip. Es enthält 16-Bit-Stellen. Ich verwende normalerweise 2 Stellen und mache meinen Akkumulator zu 24 Bits und berechne dann einen einfachen XOR-CRC-Typ über diese drei Bytes und stecke diesen in das 4. Byte der 32 Bits des Paares von EEPROM-Stellen. Wenn dann das EEPROM geschrieben wird, wird der Akkumulator + CRC an zwei verschiedenen Stellen in das EEPROM geschrieben. (dh der Akku ist redundant im EEPROM gespeichert). Achten Sie auch darauf, Ihre Software so zu schreiben, dass das Schreiben einer Kopie des Akkumulators oder + CRC vollständig geschrieben ist, bevor die andere gestartet wird. Es ist auch eine gute Idee, eine Verzögerung von einigen Millisekunden zwischen das Paar von Schreiboperationen einzufügen.

Dann beim nächsten Einschalten, wenn ich die RAM-basierte Kopie der Akkumulatoren aus dem EEPROM initialisiere, verwende ich das folgende Konzept. Ich lese die erste Kopie des Akkumulators+CRC aus dem EEPROM und überprüfe den CRC. Wenn es richtig ist, verwende ich dann den gelesenen Wert der anderen 24 Bits als den Wert, um in die RAM-Speicherorte zu schreiben. Wenn die Überprüfung des ersten Standorts fehlschlägt, gehe ich zum zweiten Exemplar und überprüfe es. Wenn es in Ordnung ist, wird das der Wert, der in die RAM-Speicherorte gesteckt wird. Wenn beide fehlgeschlagen sind, wende ich einen Standardwert auf den Zähler im RAM an, z. B. Null oder "volle" Zählung. ("volle" Zählung würde für Fälle gelten, in denen der EEPROM-Speicherort verwendet wird, um zu verfolgen, ob wie oft noch etwas passieren kann ... [z. B. wie viele weitere Boxen zulässig sind, bevor der Mikrocontroller eine Wartung veröffentlicht Anfrage ... etc etc].