Hallo,
ich habe diesen Flash im Einsatz:
http://www.micron.com/products/ProductDetails.html?product=products/nor_flash/serial_nor_flash/M25P64-VD11
Was mich interesieren würde, und darüber schreibt das Datenblatt nicht
viel...
Wie setzten sich die teoretischen 100k Zyklen zusammen?
Im Datenblatt steht "Erase/Program Cycles". Bei diesem NOR Typ ist es
so, das durch ein Page-Program die zellen von 1 nach 0 kippen können.
Zurück nach 1 bekommt man sie durch ein Erase. Wenn ich nun einen Sektor
erase mache und dann darin "ein" byte schreibe, altern dann die
restlichen Zellen auch?
Oder erst wenn ich diese dann auch schreibe bzw. wenn ich den gesagtem
Sektor wieder lösche?
Flasher
Flasher schrieb:> Wenn ich nun einen Sektor> erase mache und dann darin "ein" byte schreibe, altern dann die> restlichen Zellen auch?
Jedes Kippen des Bitzustandes altert die Zelle. Ein Sektor-Erase altert
alle Zellen, die vorher 0 waren und ein 0-Schreiben altert diejenige
Zelle, die von 1 auf 0 wechselt.
...das heißt, wenn ich -mal angenommen- erst die ganze page löschen
würde (mit page erase, danach ist alles FF), dann nicht die ganze Page
auf einmal schreibe (ein page-program), sondern mit 256 x 1 bytes (256ig
page-programs), trotzdem die ganze Page an sich quasi nur 2 x altert,
weil ich sie einmal gelöscht habe und einmal alle bytes nacheinander
geschrieben?
hab ich das so richtig verstanden?
verhällt sich da NOR flash immer gleich (herstellerübergreifend), oder
kommt es da darauf an wie die hersteller die Zellen aufbauen?
Flasher
Stellt sich aber die Frage, ob das Teil vielleicht schlau genug ist, nur
dann eine 0 aktiv reinzuprogrammieren, wenn vorher eine 1 drin steht,
und die Zelle in Frieden zu lassen wenn nicht.
Laut Datenblatt ist der Flash byteweise organisiert. Der Page-Write
fasst das Schreiben auf mehrere Bytes in einer Page zusammen, um die
Programmierzeit zu verkürzen. Wenn du nur ein Byte schreibst, dann
sollten alle anderen Bytes einer Page unbeeinflusst bleiben.
Das kann ich da nicht drin wiederfinden. Die Dinger sind durchaus in
Pages organisiert. Nur sind 256 Programmierzyklen langsamer als einer,
folglich sollte man die Page nicht inkrementell programmieren, wenn man
es eilig hat.
Aber es steht drin: "If less than 256 Data bytes are sent to device,
they are correctly programmed at the requested addresses without having
any effects on the other bytes of the same page." Was präzise verstanden
hiesse, dass bereits programmierte Bytes nicht "überbraten" werden und
die Zyklenzahl dieser anderen Bytes nicht betroffen sein sollte.
Da man Bit, Bytes und Pages nicht einzeln löschen kann, darf man sich
das technisch vielleicht so vorstellen, dass der Versuch, ein Bit auf 1
zu programmieren, für die Zelle unabhängig von deren Inhalt neutral ist,
keine Auswirkung auf die Zyklenzahl hat. Wenn dann jene Bytes im
Pagebuffer, die nicht per Kommando beschrieben wurden, auf 1 stehen,
bleiben diese Bytes in der Page unbeeinflusst.
so wie A. K. habe ich das im ungefähren auch verstanden...
Ein sector erase löscht die beinhalteden pages auf logisch 1, dann kann
ich geziehlt bits in bytes auf logisch 0 programmieren, maximal aber
immer nur eine page a 256 bytes pro page write...
...wenn ich nun nur ein byte in einer page schreibe, würde ich erwarten
das die restlichen nicht altern, weil ja deren zustand nicht verändert
wird, ausserdem kann ich sie ja später noch schreiben...
...ich stimme weiterhin Arno zu, zeitlich ist ein inkrementelles
schreiben natürlich nicht zu atraktiv, aber: Es bedeutet für mich
westliche weniger Aufwand das bestehende design (welchen inkrementelles
schreiben schon beinhaltet, weil es vorher ein eeprom war) weiterhin zu
benutzen als das ganze nun auf page programming umzubauen, wenn es
unterm strich nur ein zeitlichen Vorteil bringt (ich brauch das
programming eh nur alle schaltjahre mal...).
Flasher
A. K. schrieb:> darf man sich> das technisch vielleicht so vorstellen, dass der Versuch, ein Bit auf 1> zu programmieren, für die Zelle unabhängig von deren Inhalt neutral ist,> keine Auswirkung auf die Zyklenzahl hat.
Um eine Flashzelle auf 1 zu programmieren, muss man sie löschen. Wenn
man eine genullte Zelle mit 1 überschreiben will, passiert gar nichts.
Jeder Wechsel von 0 auf 1 und umgekehrt wird durch das Tunneln von
Elektronen erreicht und an der Stelle findet auch daer Verschleiss
statt. Will man also nur einzelne Zellen mit "0" bschreiben, mußß man
halt alle anderen mit "1" beschreiben, wodurch sie unangetastet bleiben.
Viele Controller machen das inzwischen automatisch, indem der Pagebuffer
mit "FF" vorinitialisiert wird, und nur Null-Bits übernommen werden.
Ich weiß nicht genau, wie es bei den AVR ist, aber besteht ein
Page-Erase normalerweise nicht aus zwei Schritten?
1. Flash Clear -> Alle Zellen auf 0
2. Flash Erase -> Alle Zellen auf 1
Genau beschrieben ist das beispielsweise bei den TMS320F2xxx. Dort gibt
es einen Flashbereich für die Code-Security-Funktion. Wenn man da nur
Nullen reinschreibt, ist das Bauteil für immer gesperrt.
Im Handbuch steht dazu ausdrücklich, dass das passieren kann, wenn
während dem Flash Clear Schritt z.B. durch Unterspannung abgebrochen
wird.
Im Handbuch zum Flash Controller steht, dass ein Flash Clear immer vor
dem Flash Erase ausgeführt wird.
Demnach müsste es für den Verschleiß der Zellen egal sein, was vorher
dringestanden hat.
Grüße,
Peter