fehler: externen flash ansprechen

OP #1055344
Lesenswert?

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 #1055353
Lesenswert?

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 #1055713
Lesenswert?

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 #1055854
Lesenswert?

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 #1055923
Lesenswert?

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 #1055953
Lesenswert?

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 #1055967
Lesenswert?

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 #1055977
Lesenswert?

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

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