mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Flash beschreiben - Ich werd noch wahnsinnig


Autor: Max S. (axim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
  FMI_WriteProtectionCmd(FMI_B1S0, DISABLE);
   FMI_EraseSector(FMI_B1S0);
  FMI_Timeout_Status = FMI_WaitForLastOperation(FMI_BANK_1);
  content = 0x1114;
  FMI_WriteHalfWord(0x400000,content);
  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.
u8 FMI_WaitForLastOperation(vu32 FMI_Bank)
{
  int tmp;
  u32 Time_Out = 0;
 
  /* Write a read status register command */
  *(vu16 *)(FMI_Bank) = 0x70;

  /* Wait until operation compeletion */
  while((!((*(vu16 *)FMI_Bank) & 0x80))&&(Time_Out < TIMEOUT ))
  {
    Time_Out++ ;  /* Time Out */
  }
...
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:
  while((!((*(vu16 *)FMI_Bank) & 0x80))&&(Time_Out < TIMEOUT ))
  {
    int dat;
    Time_Out++ ;  /* Time Out */
    // added
    dat = GPIO7->DR[0x3FC]; //Port 7 lesen
    //GPIO7->DR[0x3FC] = 0x02; // Oder auch etwas ausgeben
  }
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

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.