Forum: Mikrocontroller und Digitale Elektronik flash speicher und erase


von markus (Gast)


Lesenswert?

Tach auch!
Ich benutze einen ATmega32 und einen s25fl064a Flash-Speicher.
Dabei stellt sich nun folgendes Problem:
Ich habe Datenpackete die maximal 32KByte groß sind und davon einige. 
Der Speicher hat jedoch 512KBit große Sektoren und man kann nur ganze 
Sektoren oder direkt den Chip löschen (falls ich das richtig verstanden 
habe.) 0xFF in eine bestimmte adresse schreiben funktioniert auch nicht, 
da man beim schreiben nur von 1 auf 0 setzen kann. Ich möchte aber nur 
ungern pro datenpacket einen ganzen sektor verwenden und falls sich 
daten verändern den kompletten sektor löschen und wieder neu 
beschreiben. Es tritt oft der fall ein, dass sich nur 1 oder 2 byte 
ändern und ich dann auch nur die bytes die sich geändert haben in den 
speicher schreiben möchte. Kennt jemand eine Lösung dieses Problems oder 
ist das ein Ding der Unmöglichkeit?

Datenblatt:
http://www.spansion.com/datasheets/s25fl064a_00_c3_e.pdf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Es tritt oft der fall ein, dass sich nur 1 oder 2 byte
> ändern und ich dann auch nur die bytes die sich geändert
> haben in den speicher schreiben möchte.

Dann ist Flash für diese Anwendung ungeeignet. Anstelle dessen sollte 
ein normales EEPROM verwendet werden, bei dem nämlich kann jedes Byte 
einzeln beliebig umprogrammiert werden.

Allerdings dürfte es schwierig werden, ein 64 MBit-EEPROM zu finden.

von A. F. (artur-f) Benutzerseite


Lesenswert?

Ohne die kompletten Pages im mc zwischenspeichern, verändern und wieder 
raufladen ist es unmöglich. Aber da du wahrscheinlich nciht aus Spass 
64Mbit brauchst, gibt es meiner Meinung nach keine EEPROMs/FRAMs in der 
Größe. Also, musst du schon die Page lesen, verändern und schreiben.

von Timmo H. (masterfx)


Lesenswert?

Wieso mit dem Pageprogramm kannst du doch von 1 Byte bis 256 Bytes 
beschreiben.

>If fewer than 256 data bytes are sent to device, they
>are correctly programmed at the requested addresses.
Verstehe ich so, dass du auch ein bestimmtes Byte wie bei NOR-Flash 
adressieren kannst. Ein Sektor ist 64KiB groß, somit kannst du in jeden 
Sektor zwei deiner Datensätze unterbringen. Den ersten an Adresse 
0x00000-0x07FFF den zweiten von 0x08000-0x0FFFF und ab da weiter im 
nächsten Sektor.

von Michael U. (amiga)


Lesenswert?

Hallo,

wie wäre es mit der AT45DB-Serie von Atmel?
Die haben interne Ram-Buffer, so daß man zumindest zum Ändern den Kram 
nicht erst in den AVR-Ram befördern muß.

Gibt es bis 64MBit, max. 66MHz SPI und 100000 Zyklen.

Gruß aus Berlin
Michael

von Timmo H. (masterfx)


Lesenswert?

>Es tritt oft der fall ein, dass sich nur 1 oder 2 byte
>ändern und ich dann auch nur die bytes die sich geändert haben in den
>speicher schreiben möchte.
Wie oft denn eigentlich genau? Ich meine, wenn du einen Speicher hast, 
wo die Blöcke 100.000 mal beschrieben/gelöscht werden können und du z.B. 
jede Stunde diese Daten updatest, dann würdest du über 10 Jahre damit 
auskommen.

von Sven P. (Gast)


Lesenswert?

Je nach Einsatzzweck kann man auch SD-Karten verlöten. Da ist dann 
mitunter sogar nochn MMU dabei.

von markus (Gast)


Lesenswert?

@Timmo: Bei schreiben kann man nur Bits von 1 auf 0 setzen. Deshalb muss 
man auch bevor man den flash beschreibt, vorhandene Daten löschen.

AVR-Ram ist ein bisschen klein für 64KByte. Dadrüber hatte ich auch 
schon nachgedacht, und externes Ram kostet auch wieder Geld. Ein Atmel 
Flash ist auch sehr teuer, aber so wie ich das sehe werde ich nicht 
drumrum kommen. Evtl kann ich aber auch die Daten so optimieren, dass 
ich nicht mehr als 100 Sektoren brauche. Mal sehen.

Es wird nicht oft auf den Flash geschrieben, aber wenn es passiert wird 
nicht ein ganzer Datensatz verändert sondern eben nur ein paar Byte und 
die verteilt auf den ganzen Datensatz.
Danke für die vielen Antworten!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Evtl kann ich aber auch die Daten so optimieren, dass
> ich nicht mehr als 100 Sektoren brauche.

Wieviel Speicher brauchst Du denn im nicht optimierten Falle?

Serielle EEPROMs gibt es mit bis zu 1 MBit (128 kByte) Kapazität, wenn 
Du die per I²C anschließt, kannst Du ohne zusätzliche Adressleitungen 
vier Stück davon gleichzeitig nutzen (Microchip 24LC1025) und hast so 
immerhin 512 kByte zur Verfügung, bei denen Du jedes einzelne Byte nach 
Belieben umprogrammieren kannst.

von markus (Gast)


Lesenswert?

Ich weiss. Ich habe den Flash schon mit bedacht gewählt. Ein EEPROM ist 
mir zu langsam.

von (prx) A. K. (prx)


Lesenswert?

Wenn nicht oft drauf geschrieben wird: Die üblicheren Atmel Dataflashes 
haben viel kleinere selektiv lösch- und schreibbare Blöcke von ~1KB und 
für diese zudem integrierte Puffer. Die lassen sich also problemlos auch 
byteweise schreiben.

Wenn das auch zu langsam ist (ist aber wohl gleiche Ordnung wie das 
S25), dann kommt evtl. ein FRAM als zusätzlichem "write cache" in Frage.

von (prx) A. K. (prx)


Lesenswert?

Vielleicht lässt sich auch dein Grundansatz überdenken, direkt 
adressierten Speicher zu verwenden. Als sequentiell arbeitender Speicher 
funktioniert Flash besser. Dafür müsste man aber wissen, für was das gut 
sein soll.

von Timmo H. (masterfx)


Lesenswert?

@markus
>Bei schreiben kann man nur Bits von 1 auf 0 setzen. Deshalb muss
>man auch bevor man den flash beschreibt, vorhandene Daten löschen.
Das ist mir auch klar. Darum meinte ich ja dass du einfach immer nen 
neuen Block nimmst. Der alte bleibt erhalten, der erneuerte mit den 
neuen Daten kommt einfach dahinter. Wenn du am ende des Flashspeichers 
angelangt bist fängst du wieder vorne an und fängst auch dann erst mit 
löschen an.

von Sandra S. (sandra)


Lesenswert?

hallo  markus,

ich habe auch hier eine kleine Aufgabe wobei ich den Speicher 
Sektorenweise lesen, löschen und schreiben will.
Ich möchte nur pro datenpacket einen ganzen sektor verwenden und falls 
sich
daten verändern den kompletten sektor löschen und wieder neu
beschreiben.
Sicher kann deine code mir besser helfen da ich neu in C bin.
Es wäre nett wenn du deine Source unter sandrametampa@yahoo.fr posten 
könntest.

mfG.
sandra

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.