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
> 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.
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.
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.
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
>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.
@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!
> 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.
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.
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.
@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.
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