Forum: Mikrocontroller und Digitale Elektronik NOR Flash löschen


von Timmo H. (masterfx)


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:
1
/* Flashspeicher ist auf 0xFF000000 gemapped */
2
#define FLASH_BASE  0xFF000000
3
#define write_flash( a , byte )  *(unsigned short *)(FLASH_BASE + a) = (unsigned short)byte
4
#define read_flash(a)  *(unsigned short *)(FLASH_BASE + a)
5
6
int rd_status(){
7
  unsigned short status;
8
  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
9
  write_flash(0xFFFF, 0x70);
10
  status = read_flash(0xFFFF);
11
  
12
  return status;
13
}
14
15
int block_erase(unsigned char blocknr){
16
17
  write_flash(blocknr, 0x20);
18
  write_flash(blocknr, 0xD0);
19
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */
20
  
21
  return 0;
22
}
23
24
int word_program(unsigned int address, unsigned short data_word){
25
26
  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
27
  write_flash(0xFFFF, 0x40);
28
  write_flash(address, data_word);
29
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */
30
31
  return 0;
32
}
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.

von Timmo H. (masterfx)


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.

von Timmo H. (masterfx)


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:
1
#define FLASH_BASE  0xFF000000
2
#define write_flash( a , byte )  *(unsigned short *)(FLASH_BASE + a) = (unsigned short)byte
3
#define read_flash(a)  *(unsigned short *)(FLASH_BASE + a)
4
5
int rd_status(){
6
  unsigned short status;
7
  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
8
  write_flash(0x10, 0x70);
9
  status = read_flash(0x10);
10
  
11
  return status;
12
}
13
14
int block_erase(unsigned char blockaddress){
15
16
  write_flash(blockaddress, 0x20);
17
  write_flash(blockaddress, 0xD0);
18
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */
19
  
20
  return 0;
21
}
22
23
int word_program(unsigned int address, unsigned short data_word){
24
25
  /* Laut Datenblatt an eine irgendeine gültige Speicheradresse schreiben */
26
  write_flash(0x10, 0x40);
27
  write_flash(address, data_word);
28
  while( !(rd_status() & 0x0080) ) ;  /* Warte auf "ready" */
29
30
  return 0;
31
}
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

von Timmo H. (masterfx)


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.

von Peter D. (peda)


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

von Timmo H. (masterfx)


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

von Peter D. (peda)


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

von Timmo H. (masterfx)


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.

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.