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.
Je nach Einsatzzweck kann man auch SD-Karten verlöten. Da ist dann mitunter sogar nochn MMU dabei.
@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.
Ich weiss. Ich habe den Flash schon mit bedacht gewählt. Ein EEPROM ist mir zu langsam.
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
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.