fehler: externen flash ansprechen

OP #1055344
Hallo,

hab einen - für mich - merkwürdigen Fehler, bei dem ich nicht genau weiß 
wo die Ursache dafür liegt (Prozessor AT91SAM9260).

Es geht um einen externen Nor Flash AT49BV322DT. Wenn ich z.B. den CFI 
Command schicke, bekomme ich lediglich die Hälfte der richtigen Antwort 
zurück. Sprich manche Speicherstellen beinhalten den richtigen Wert und 
manche nicht. Hab max. Wait-States eingefügt und es gibt auch keine 
Sleep-Time etc. beim Flash. Auch wenn ich die Setup-Zeiten etc. etwas 
verändere - wird stets das gleiche angezeigt.

Einen ähnlichen Flash von Atmel kann ich mit den gleichen Setup, Pulse 
und Hold Zeiten richtig ansprechen. Auf den Leitungen ist auch nichts 
festzustellen... sieht alles gut aus / andere ICs funktionieren auch.

Gruß
Bernd
OP
hab mir grad noch das muster (von den richtigen Werten) angeschaut...

ankommende Werte:
0x 00 00 52 00 00 00 02 00 00 00 41 00 00 00...27 00 00 00 90 00

normale Werte:
0x 51 00 52 00 59 00 02 00 00 00 41 00 00 00...27 00 36 00 90 00


-> d.h. es sind immer zwei 0x-Werte richtig und die nächsten sind 
falsch. Dieses Muster zieht sich komplett durch.-...


Hat jmd eine Ahnung, wo der Fehler legen könnte?

Bernd
Gast
Ich kenn deinen ARM nicht, aber vermutlich liegts noch am "umrechnen" 
der Adressen. Die Addr (zb 0x555) in der Command Tabelle beziehen sich 
auf A11-A00 des FLASH. Da du aber im Word Mode bist hast du A1 des ARM 
an A0 angeschlossen. Dies ist für das Auslesen des FLASH im Run-Mode 
auch i.O.

Beim Lesen/Schreiben von Befehlen auf CFI muss die aber die Adressen 
entsprechend umwandeln.
OP
habs geändert und jetzt schreib ich zwar was ins flash, allerdings nicht 
das richtige.... es wird immer 0xE59F reingeschrieben (egal was ich 
hinschicke)
1
#define M16(adr) (*((volatile unsigned short *) (adr)))
2

3
M16(0x10000000 + 0x0AAA) = 0xAA;
4
M16(0x10000000 + 0x1554) = 0x55;
5
M16(0x10000000 + 0x0AAA) = 0xA0;
6
M16(0x10000004) = *((unsigned short *) 0xEE);


Als Flash-Init hab ich
1
AT91C_BASE_SMC->SMC_SETUP0 = 0x00000001;
2
AT91C_BASE_SMC->SMC_PULSE0 = 0x08080804;
3
AT91C_BASE_SMC->SMC_CYCLE0 = 0x00080008; 
4
AT91C_BASE_SMC->SMC_CTRL0 =  0x000B1003;  
5

6
AT91F_SMC_CfgPIO();
7
AT91F_EBI_CfgPIO();

Bernd
OP
1
0x FF FF E5 9F E5 9F E5 9F FF FF FF 00 
2
   FF FF FF FF FF FF 00 FF 
3
   FF FF FF FF FF FF 00 FF 
4
   FF FF FF FF FF FF 00 FF usw.

die E5 9F entstanden, als ich versucht hab etwas in den Flash zu 
schreiben.

Hab auch einige andere Setup-, Pulse- Kombinationen ausprobiert.
1
AT91C_BASE_SMC->SMC_SETUP0 = 0x00030003;
2
AT91C_BASE_SMC->SMC_PULSE0 = 0x08080804;
3
AT91C_BASE_SMC->SMC_CYCLE0 = 0x000A000A; 
4
AT91C_BASE_SMC->SMC_CTRL0 =  0x000B1003;  
5

6
AT91F_SMC_CfgPIO();
7
AT91F_EBI_CfgPIO();

Bei dieser werden neben 0x E5 9F lediglich 0xFF angezeigt. Allerdings 
werden beim Versuch etwas zu schreiben lediglich einige Nullen 
hinzugefügt (ebenfalls im Abstand wie oben). Der Flash benötigt keine 
Setup-Time für die Adresslines aber eine Hold-Time. Laut Datenblatt des 
Prozessors muss diese Cycle = Pulse + Setup + Hold sein (für die 
Hold-Time gibt es kein extra-Register).

>Vor dem Programieren kommt das lesen.. so ist klarer.
für diesen Flash benötigt man ja keinen Command um den Inhalt angezeigt 
zu bekommen. In der Keil Umgebung mit der ich arbeite, gibt es ein 
"Memory-Window" welches immer den aktuellen Inhalt ausliest (wenn der 
Debugger angehalten wurde)

Bernd
Gast
Keine Ahnung was Keil macht..

Versuch nochmals die Daten des CFI zu lesen. Und bevor das nicht stabil 
geht würd ich nicht ins FLASH programieren. Sonst hast du 2 Baustellen 
gleichzeitig was die Fehlersuche deutlich erhöht.

Poste male wie du das CFI ausliest und was dabei rauskommt.
OP
das CFI lese ich mit diesem Command aus:
1
M16(0x10000000 + 0xAA) = 0x98;

und erhalten tue ich:
1
0x 00 00 01 00 98 00 01 00 FF 00 FF 00 FF FF FF FF FF 00 FF 00 FF FF FF 
2
   FF FF 00 FF 00 FF FF FF FF 00 00 00 59 00 02 00 00 00 00 00 00 00 00 
3
   00 00 00 00 00 00 00 00 00 27 00 00 00 00 00 A0 00 04 00 00 00 00 0F

ein paar Zahlen stimmen überein; wie die erste 0x01 oder 0x59 0x02 oder 
die 0x27

Bernd
OP
zuvor hab ich es mit 0x55 versucht (wie im Datenblatt angegeben), dann 
kommt

1
0x 00 00 01 C9 00 00 00 01 FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 
2
   FF FF FF 00 FF FF FF 00 FF FF 00 00 52 00 00 00 02 00 00 00 41 00 
3
   00 00 00 00 00 00 00 00 00 00 27 00 00 00 90 00 00 00 04 00 00 00
OP
>Product ID Entry Cmd vorher ausgeführt?

ja hab ich zuvor ausgeführt (allerdings kommt das gleiche Result mit und 
ohne Product ID Entry raus).
1
M16(0x10000000 + 0xAAA) = 0xAA;
2
M16(0x10000000 + 0x1554) = 0x55;
3
M16(0x10000000 + 0xAAA) = 0x90;

Bernd

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.