Forum: Mikrocontroller und Digitale Elektronik fehler: externen flash ansprechen


von Bernd S. (mms)


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

von Bernd S. (mms)


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

von Physiker (Gast)


Lesenswert?

Und wie ist dein Flash an deinen uC angeschlossen?

von Bernd S. (mms)


Lesenswert?

via 16Bit Datenbus und Adressbus, CS0, NRD, WE

Bernd

von Bernd S. (mms)


Lesenswert?

hat keiner für mich einen Tipp (oder sind es noch zu wenig 
Informationen)? Könnte beim Flash eine AdressLine defekt sein?

Bernd

von Physiker (Gast)


Lesenswert?

Poste doch mal dein Schaltplan.

- Wie ist der /Byte Eingang des 49BV322 beschaltet?
- Häufig wird das mit I/O15(A1) falsch verstanden

von Bernd S. (mms)


Angehängte Dateien:

Lesenswert?

hier mal meine Anschlussbelegung

R53 ist nicht angeschlossen. Somit ist bei mir BYTE auf high gezogen


Bernd

von Physiker (Gast)


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.

von Bernd S. (mms)


Lesenswert?

>Beim Lesen/Schreiben von Befehlen auf CFI muss die aber die Adressen
>entsprechend umwandeln.

wie meinst du das genau? Hab es mal mit 0xAA beim CFI Command versucht - 
leider ebenfalls ohne Erfolg.

Bernd

von Bernd S. (mms)


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

von Physiker (Gast)


Lesenswert?

Vor dem Schreiben kommt das lesen. Poste mal was du aus deinem Baustein 
lesen kannst.

von Physiker (Gast)


Lesenswert?

Vor dem Programieren kommt das lesen.. so ist klarer.

von Bernd S. (mms)


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

von Physiker (Gast)


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.

von Bernd S. (mms)


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

von Bernd S. (mms)


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

von Physiker (Gast)


Lesenswert?

Product ID Entry Cmd vorher ausgeführt?

von Bernd S. (mms)


Lesenswert?

>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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.