NOR Flash löschen

OP #684226
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.
OP #687316
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.
OP #690754
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
#693477
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren