mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik flash speicher und erase


Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. F. (artur-f) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: markus (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sandra Sandra (sandra)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.