Hallo Zusammen, ich habe meiner Schaltung mal einen 2MB Flash Speicher spendiert, weil ich eine Unmenge an "Rezepturen" zu verwalten habe. Habe mich für diesen hier entschieden ADESTO AT25SF161-SHD-B und soweit auch am Laufen. Nun habe ich aber eine Verständnisfrage die ich doch etwas wundert. Ich beschreibe immer eine Page komplett (was ja nicht unbedingt sein müsste, aber sich in meiner Datensruktur anbietet) Jetzt steht aber im Datenblatt, dass ein Beschreiben des Flash nur in Bytes funtioniert, die vorher gelöscht wurden. So weit so gut, heißt für mich, wenn ich z.B. in der ersten Page am 1. Byte eine 5 gespeichert hatte und will während der Runtime daraus eine machen muss diese Speicherzelle zuerst gelöscht werden (Inhalt dann 0xFF), dann erst kann ich das Byte beschreiben. Jetzt kommt aber der Hammer! Lt. Datenblatt kann man nur 4k zusammen löschen. Heist das, wenn ich 20 Pages mit Daten beschrieben habe und dann EINEN Wert ändern will, muss ich alle 4k auslesen, 4k löschen und die ganzen 4k (mit dem einen geänderten Wert) wieder reinflashen? Da muss es doch eine andere Möglichkit geben????
So funktioniert FLASH-Speicher nunmal. Entweder auf EEPROM ausweichen, oder genug Flash-Speicher verbauen, dass für jeden Datensatz eine ganze Page verwendet werden kann, oder "intelligenten" Flash-Speicher verwenden (--> SD-Karte), bei der sich der integrierte Controller um den ganzen Ablauf kümmert.
soundmachine123 schrieb: > Jetzt kommt aber der Hammer! > Lt. Datenblatt kann man nur 4k zusammen löschen. So ist es. Und normalerweise ist das auch nicht schlimm. So grosse Speicher nimmt man normalerweise nicht, um einzelne Bytes wegzuspeichern bzw. zu ändern, sondern eher um fortlaufend grössere Datenmengen zu speichern. Für deine Anwendung gibt es bessere Chips (EEPROM, FRAM).
Naja, z. B.: Man ändert nicht ein paar Bytes, sondern schreibt ein fortlaufendes Log, wo einfach der Reihe nach die geänderten (und nur diese!) Bytes (oder die geänderten Datensätze, falls nicht zu groß) mit ihren Adressen abgelegt werden. Und erst wenn der Platz fürs Log knapp wird oder in einzelnen Datensätzen viele Änderungen zusammengekommen sind, werden die "alten" Sektoren gelöscht und mit den aktualisierten Datensätzen neu befüllt, und das Log dann ebenfalls (event. teilweise) gelöscht. Das macht natürlich einen gewissen Aufwand. Das ist aber allein schon deshalb sinnvoll, weil Flash-Speicher typischerweise eine sehr begrenzte Anzahl Schreib-/Löschzyklen überstehen. EEPROMs sind da deutlich gnädiger. Deshalb: Braucht man wenig Platz, ist ein EEPROM einfacher, aber da ist z. Z. wohl bei 256kByte Schluss. Wenn's mehr sein soll, muss man den Aufwand halt spendieren ... Geht etwa bei SD-Karten auch nicht anders, da werden immer komplette Sektoren gelöscht/beschrieben.
Ansonsten: die AT45xx-Serie ist da deutich flexibler. Kleinere mögliche Blockgrössen und vor allem ein interner SRAM-Buffer. D.h. du kannst eine page in den internen SRAM lesen, dann modifizieren, flash-page löschen und zurückschreiben. Du musst also nicht den gesamten page-Inhalt via SPI erst auslesen, extern zwischenspeichern+modifizieren und dann zurückschreiben, sondern kannst das chipintern erreichen.
Hallo, vielen lieben Dank für die Antworten. Ok dann ist das wohl so. Nicht sonderlich schlimm aber ich war mir fast sicher, dass es noch andere Möglichkeiten gibt. Das ist wohl nicht der Fall, also muss ich mir einen "Workaround" bauen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.