Timing-Problem beim Schreiben von internem Flash (AT91SAM7S256)

Gast #1042529
Hallo zusammen

ich versuche gerade ein paar Funktionen zusammenzustellen, die es mir 
auf einem AT91SAM7S256 erlauben, ins interne Flash zu schreiben. Habe 
dafür zuerst mal das Kapitel über den Embedded Flash Controller (EFC) 
gelesen und mich dann ans Programmieren gemacht. Was dabei rausgekommen 
ist, könnt ihr im Anhang sehen (zumindest das C Source File).

Nur leider funktioniert das noch nicht so ganz, wie ich gerne möchte. 
Irgendwie springt der Programmverlauf aus der IntFlash_Write() Funktion 
immer zur Adresse 0x0 und kommt dann halt wieder in die main() Funktion 
(Soft Reset sozusagen). Ich habe dann mal angefangen die Quelle des 
Übels zu suchen und hab mich durch die Funktion durchgesteppt.... und 
lustigerweise lief dabei alles einwandfrei, ich konnte problemlos 
mehrere Pages des internen Flashs beschreiben. Ein bisschen verwirrt hab 
ich das Programm nochmals komplett (ohne Steps und Breakpoints) 
durchlaufen lassen und da ist es sofort wieder "abgestürzt". Durch 
setzen verschiedener Breakpoints konnte ich das Problem dann auf die 
_IntFlash_Ready() Funktion reduzieren (Zeile 73):

1
// Warten bis Schreib-Routine fertig
2
statreg = _IntFlash_Ready();

Solange ich VOR dem Ausführen dieser Funktionen einen Breakpoint setze, 
funktioniert alles einwandfrei. Nehme ich den Breakpoint raus, springt 
er von dort zu 0x0.

Hat jemand einen Hinweis, woran das liegen könnte? Ich nehme mal an, 
dass meine _IntFlash_Ready() Funktion zu wenig lange wartet und der 
Prozessor eigentlich noch am Schreiben der Daten ist. Durch den 
Breakpoint hat er jedoch genug Zeit den Schreib-Vorgang zu beenden. Ist 
sowas möglich? Und wenn ja wie bzw was mache ich falsch? Ich prüfe 
eigentlich einfach das Ready-Flag im Status-Register des EFCs (da ich 
keine Interrupts zur Verfügung habe).

Falls zusätzliche Informationen zum Umfeld oder zu Code-Ausschnitten 
benötigt werden, sagt einfach Bescheid. Bin für jeden Tipp und jede 
Hilfe sehr dankbar!

Grüsse

Sidd
Angehängte Dateien:
Gast
Ok konnte das Problem endlich lösen. Hatte vergessen die FMCN (Flash 
Micro Cycle Number) für den Write-Vorgang korrekt zu setzen. Der Wert 
blieb immer auf 48 sprich Anzahl Cycles pro Microsekunde. Das ist auch 
ok so, wenn man Lock und NVM Bits setzt. Für das Ausführen eines anderen 
Befehls wie Write muss der Wert aber auf 72 Cycles pro 1.5 Microsekunden 
gesetzt werden, hatte ich übersehen.

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.