Forum: Mikrocontroller und Digitale Elektronik Programmierung des AM29LV017D


von Hagen (Gast)


Lesenswert?

Hat jemand zufällig schon einmal den Flash Memory AM29LV017D von AMD
benutzt?
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/21415.pdf


Wie habt ihr ein Byte in den Flash Memory gebracht. ich kriege das
irgendwie nicht hin. Ist ein ziemlich komplziertes Signalspiel nötig.

Habe versucht einfach 4 Schreibbefehle nacheinander, aber klappt nicht
??

Danke, falls jemand antwortet.

von Darko Sabljo (Gast)


Lesenswert?

Hi

also um das Flash zu beschreiben musst du ja erst die 3 Commands
reinschreiben, und als letztes erst das Byte das du im Flash haben
möchtest.
Ahja.. beim schreiben musst du DQ7 abfragen, ob der Flash das Commando
verarbeitet hab... wenn du die 4 Schreibbefehle einfach reinhaust, bist
du warscheinlich zu schnell, und der Flash is noch nicht so weit, um
zum nächsten Befehl zu gehen..

gruss
Darko

von Hagen (Gast)


Lesenswert?

Danke, werd es mal probieren.

von hagen (Gast)


Lesenswert?

Muss ich nach jedem Command (0xAA,0x55,0xA0) das DQ7 bit abfragen, oder
erst nach Abschluss des 4-zykligen Byte-Programs, um damit ein neues
Byte schreiben zu können ?

Also 1.

Schreibe 0xAA nach DQ0..DQ7
DQ7 abfragen

Schreibe 0x55 nach DQ0..DQ7
DQ7 abfragen

Schreibe 0xA0 nach DQ0..DQ7
DQ7 abfragen

Schreibe Datum nach DQ1..DQ7 und Adresse nach A0..A20
DQ7 abfragen

oder 2.

Schreibe 0xAA nach DQ0..DQ7
Schreibe 0x55 nach DQ0..DQ7
Schreibe 0xA0 nach DQ0..DQ7
Schreibe Datum nach DQ1..DQ7 und Adresse nach A0..A20.
DQ7 abfragen

?????????????

Danke

von Darko Sabljo (Gast)


Lesenswert?

lass mich überlegen...
also wenn ich mich nicht irre nach jedem Cycle... also die Version 1
von dir.
Übrigens, das weisst du sicher schon, aber du kannst nicht eine Adresse
doppelt beschreiben, d.H. du musst bei einem Flash bevor du neue Daten
Schreiben willst, immer den Sector erst löschen.

gruss
darko

von Hagen (Gast)


Lesenswert?

Im Datenblatt steht ja, dass man zuerst an DQ0..DQ7 0xAA, übergeben
soll. Bei der Adresse steht XXX. Heißt das, das die Adresse egal ist
also, wäre:

unsigned char *ptr_to_sram;
...
...
ptr_to_sram=0xFFFF;
*ptr_to_sram=0xAA;

das gleiche wie

unsigned char *ptr_to_sram;
...
...
ptr_to_sram=0xEEEE;
*ptr_to_sram=0xAA;


????

von Darko Sabljo (Gast)


Lesenswert?

hi

jep is egal.
Funktionierts noch immer nicht?  kannste mal den Code deiner
Schreibroutine komplett posten?
Vielleicht solltest du erstmal testen ob du die Device/manufacture ID
rausbekommst, und anhand der die restliche Routine anpassen..

Gruss
Darko

von Hagen (Gast)


Lesenswert?

Danke Darko für deinen Tipp mit der manufactures ID. Hab das damit mal
probiert und es hat dann auch geklappt. Konnte damit die Fehler so
einengen, dass ich das jetzt glaub ich gepackt habe. Naja auf dem Oszi
scheinen die richtigen Daten zu sein.

Mein Fehler war, dass ich nach der Sector Erase Sequenz die falschen
Statusbits abgefragt habe. Dass schreiben hat danach nicht geklappt.So
scheint es richtig zu sein:
--------------

//RESET

RESET_SRAM=0;
*ptr_to_sram=0xF0;
RESET_SRAM=1;

// Sector Erase Sequence: 6 Schreibzyklen


*ptr_to_sram=0xAA;
*ptr_to_sram=0x55;
*ptr_to_sram=0x80;
*ptr_to_sram=0xAA;
*ptr_to_sram=0x55;
*ptr_to_sram=0x30;

//solange warten bis Sector Erase Sequence abgeschlossen


while (DQ7==1){
};  //-->bei DQ7==0 --> Erase Command Sequenz akzeptiert


while (ERASE_READY==0){
};  //--> ERASE_READY=1 --> Löschvorgang abgeschlossen



--------------
(ERASE_READY ist das RY/BY# BIT)
Wichtig ist auch die vorherige Anfrage von DQ7. Ohne die klappts
nicht.


Also nochmal. Vielen Dank Darko

von Hagen (Gast)


Lesenswert?

Hi, mit diesem Programmausschnitt kann ich ja Bytes einschreiben:

void unlock_bypass_byte_program(unsigned char f[], unsigned int
anzahl){
  unsigned int k;
  //unlock bypass program enter

  *ptr_to_flash=0xAA;
  *ptr_to_flash=0x55;
  *ptr_to_flash=0x20;



  for (k=0;k<anzahl;k++){

    *ptr_to_flash=0xA0;
    *ptr_to_flash=f[k];
    while (PROGRAM_DONE==0);
    ptr_to_flash++;

  }

  //EXIT Unlock Bypass Mode

  *ptr_to_flash=0x90;
  *ptr_to_flash=0x00;

}

Ich kann alle Zeichen einschreiben. Bis auf das Zeichen 0x0D.  Wenn ich
dieses Zeichen versuche einzuschreiben, schreibt er mir zwei Bytes:
0x0D und 0x0A.

Hat jemand ein Idee woran das liegen könnte ???

Danke.

von Gate (Gast)


Lesenswert?

Hallo,
Tschuldige, das ich mich da auch noch einschleiche.
Ich habe auch mal eine frage.
Ich habe nämlich auch Probleme mit einem Flash Speicher.
Eine Frage wollte ich dir stellen Hagen, wenn ich darf.
Wenn du den Flash Speicher löschen willst, sei es Sector oder alles,
wartest du eine Zeit ab und fragst dann den Status ab, oder nach dem
die den Command geschrieben hast wartest du mit der while schleife.

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.