www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik NOR Flash löschen


Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Ich bin gerade dabei eine Routine zu schreiben, die Srecords in 
einen vorhandenen 16 MB NOR Flash schreiben soll. Bloß irgendwie 
schmiert er beim Block-Erase ab. Bei dem Flash handelt es sich um den 
Micron MT28F128J3. Also ein 128 Mbit Flashspeicher. Er wird im x16 Modus 
betrieben (Wort-Modus).
Hier mal die Funktion zum löschen und schreiben:
/* Flashspeicher ist auf 0xFF000000 gemapped */
#define FLASH_BASE  0xFF000000
#define write_flash( a , byte )  *(unsigned short *)(FLASH_BASE + a) = (unsigned short)byte
#define read_flash(a)  *(unsigned short *)(FLASH_BASE + a)

int rd_status(){
  unsigned short status;
  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
  write_flash(0xFFFF, 0x70);
  status = read_flash(0xFFFF);
  
  return status;
}

int block_erase(unsigned char blocknr){

  write_flash(blocknr, 0x20);
  write_flash(blocknr, 0xD0);
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */
  
  return 0;
}

int word_program(unsigned int address, unsigned short data_word){

  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
  write_flash(0xFFFF, 0x40);
  write_flash(address, data_word);
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */

  return 0;
}
Ist das soweit richtig oder mache ich was falsch? Wahrscheinlich liegt 
der Fehler auch gar nicht beim Flash beschreiben, sondern mein Stack 
oder so geht kaputt, aber wenn die obigen Funktionen soweit richtig sind 
wäre ich schonmal weiter.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh, der Fehler liegt daran weil das Programm ja noch im Flash 
ausgeführt wird. Wenn ich lösche ist das lesen gesperrt (da gibts jedoch 
noch gewisse Möglichkeiten wie "Read while write"). Ist aber nicht so 
ohne weiteres machbar. Ich habs jetzt einfach so gelöst, dass ich meinen 
Bootloader erstmal in den RAM kopiere und ihn von dort aus ausführe... 
Mal abwarten ob die Löschroutine dann funktioniert.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So jetzt konnte ich wieder ein bissl weiter rumprobieren. Hab jetzt noch 
ein Flash-Speicher aufgelötet. Baugleich natürlich. Wie ich festgestellt 
habe darf ich nur gerade Adressen an den Flash schicken. Also sieht mein 
Code jetzt so aus:
#define FLASH_BASE  0xFF000000
#define write_flash( a , byte )  *(unsigned short *)(FLASH_BASE + a) = (unsigned short)byte
#define read_flash(a)  *(unsigned short *)(FLASH_BASE + a)

int rd_status(){
  unsigned short status;
  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
  write_flash(0x10, 0x70);
  status = read_flash(0x10);
  
  return status;
}

int block_erase(unsigned char blockaddress){

  write_flash(blockaddress, 0x20);
  write_flash(blockaddress, 0xD0);
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */
  
  return 0;
}

int word_program(unsigned int address, unsigned short data_word){

  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
  write_flash(0x10, 0x40);
  write_flash(address, data_word);
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */

  return 0;
}
Soweit so gut. Nun bleibt er nicht hängen, aber dafür springt er sofort 
wieder raus. Sprich das ReadyBit im Statusregister ist sofort auf "1". 
Ich habe zum testen einfach mal 0xAFFE in den Flashspeicher geschrieben, 
aber beim lesen zeigt sich, dass nichts drin ist.
Das Chipselect wird definitiv aktiviert, da bin ich mit nem 
Logic-Analyzer bei gegangen. Hat das hier wirklich noch keiner gemacht? 
Bin für jede Hilfe dankbar

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, da spinnt mein CPLD wohl ein bissl. Der Pegel an V_PEN war 
scheinbar nicht korrekt. Jetzt funzt es. Wenigstens ist der Code 
richtig... Trotzdem seltsam dass keiner hier sowas bis jetzt gemacht 
hat.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. wrote:

> richtig... Trotzdem seltsam dass keiner hier sowas bis jetzt gemacht
> hat.

Was ist daran seltsam?
Es gibt doch genug MCs mit internem Flash.
Warum sich also unnötig Mühe machen und externen Flash ranpappen?


Peter

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uCs mit 16 MB internem Flash? Zudem haben die internen Flashspeicher 
nicht immer so viele Schreibzyklen und sind dazu auch meist nicht gerade 
schnell... Naja egal

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. wrote:
> uCs mit 16 MB internem Flash? Zudem haben die internen Flashspeicher
> nicht immer so viele Schreibzyklen und sind dazu auch meist nicht gerade
> schnell... Naja egal

Sorry, mit 16MB-MCs kenne ich mich überhaupt nicht aus, mein bisher 
größtes Programm ist 50kB, also 300-mal kleiner.

Ich mache nur Gerätesteuerungen mit CAN-Bus und einfachen Displays ohne 
Animationen, da brauch ich nicht solche riesen Mengen an Flash.
Die nur 10.000 Schreibzyklen reichen mir völlig aus.


Peter

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja eben, aber nur weil du nicht mehr brauchst heisst das ja noch lange 
nicht, dass es anderen genauso geht. Ich muss halt ein Betriebssystem 
darauf speichern und das ist nunmal etwas größer.

Naja, aber ist ja eh egal, denn mein Code war ja von Anfang an quasi 
richtig.

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.