Flash beschreiben - Ich werd noch wahnsinnig

OP #1072653
Hallo!

Seit Stunden versuche ich, den Flash Speicher auf einem ARM9 
(STR912FAW44) zu beschreiben. Habe mich deshalb nun extra hier 
angemeldet, nachdem ich sonst nur mitgelesen hattee. Um den Speicher zu 
beschreiben verwende ich Keil und die mitgelieferten Bibliotheken. Der 
Controller bootet von Bank 0, und ich möchte Daten auf Bank 1 sichern. 
Ich orientiere mich an einem Beispiel.
Letztendlich sollen diese Codezeilen Daten schreiben:
1
  FMI_WriteProtectionCmd(FMI_B1S0, DISABLE);
2
   FMI_EraseSector(FMI_B1S0);
3
  FMI_Timeout_Status = FMI_WaitForLastOperation(FMI_BANK_1);
4
  content = 0x1114;
5
  FMI_WriteHalfWord(0x400000,content);
6
  FMI_Timeout_Status = FMI_WaitForLastOperation(FMI_BANK_1);

Leider erhalte ich als Status immer einen Timeout.
Da dachte ich, schaue ich doch mal in die Library.
1
u8 FMI_WaitForLastOperation(vu32 FMI_Bank)
2
{
3
  int tmp;
4
  u32 Time_Out = 0;
5
 
6
  /* Write a read status register command */
7
  *(vu16 *)(FMI_Bank) = 0x70;
8

9
  /* Wait until operation compeletion */
10
  while((!((*(vu16 *)FMI_Bank) & 0x80))&&(Time_Out < TIMEOUT ))
11
  {
12
    Time_Out++ ;  /* Time Out */
13
  }
14
...
Darunter wird dann, je nachdem ob Time_Out den Grenzwert erreicht hat, 0 
oder 1 zurückgegeben.
Beim Durchsteppen mit dem Hardware Debugger habe ich gemerkt, dass der 
Code durchgesteppt funktioniert. Klar, Taktproblem, dachte ich mir, und 
habe den PLL mal mit "SCU_PLLFactorsConfig(6, 25, 128);" 
runtergeschraubt. Pustekuchen, nix.
Auch eine künstliche Warteschleife (die sogar etwa eine Sekunde zählt) 
hat nichts gebracht. Grübeln. Den Code im Hardware Debugger wieder 
laufen lassen. Beim Ablaufen irgendwann gestoppt, dabei war ich 
logischerweise immer in der While Schleife, die den Timeout erhöht. Aber 
allein das Anhalten im Debugger hat genügt, dass es danach weiter geht. 
Hm.
Durch Zufall dann ein paar LEDs zu Diagnosezwecken angeschaltet, und 
dadurch erstaunliches festgestellt:

Füge ich in die While Schleife noch einen Befehl wie "GPIO7->DR[0x3FC] = 
0x02;" ein, oder auch nur "int tmp = GPIO7->DR[0x3FC];". so funktioniert 
alles. Also wie folgt:
1
  while((!((*(vu16 *)FMI_Bank) & 0x80))&&(Time_Out < TIMEOUT ))
2
  {
3
    int dat;
4
    Time_Out++ ;  /* Time Out */
5
    // added
6
    dat = GPIO7->DR[0x3FC]; //Port 7 lesen
7
    //GPIO7->DR[0x3FC] = 0x02; // Oder auch etwas ausgeben
8
  }
Ich kann auch GPIO6 verwenden, dieser Port wird nicht einmal verwendet. 
Es scheint mir, als ob irgendeine Busaktivität etwas auslöst.
Nun bin ich ratlos.
Habt ihr eine Idee? Es kann ja nicht der Sinn sein, die mitgelieferte 
Bibliothek zu verändern?

Danke schonmal!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.