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
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
hat keiner für mich einen Tipp (oder sind es noch zu wenig Informationen)? Könnte beim Flash eine AdressLine defekt sein? Bernd
Poste doch mal dein Schaltplan. - Wie ist der /Byte Eingang des 49BV322 beschaltet? - Häufig wird das mit I/O15(A1) falsch verstanden
hier mal meine Anschlussbelegung R53 ist nicht angeschlossen. Somit ist bei mir BYTE auf high gezogen Bernd
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.
>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
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
Vor dem Schreiben kommt das lesen. Poste mal was du aus deinem Baustein lesen kannst.
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
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.
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
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 |
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.