(Aktualisiert) Seltsames Rücksetzverhalten mit ARM9-Prozessor

7

Ich arbeite daran, ein Startproblem mit einer Atmel AT91SAM9G20-Karte zu beheben. In den ersten 700 ms läuft alles gut. Es scheint, dass der Prozessor etwa 700 ms nach dem Zurücksetzen einfriert. Merkwürdig ist, dass die CPU die Reset-Leitung steuert, nachdem ich die Reset-Taste losgelassen habe.

Hier ist eine Scope-Aufnahme, die zeigt, was los ist. Die gelbe Kurve ist die Rücksetzlinie. Das erste Eintauchen ist die Zeit, in der ich die Reset-Taste gedrückt halte. Der zweite Einbruch wird, glaube ich, von der CPU erzeugt.

Die blaue Kurve sind serielle Daten, die aus der CPU kommen. Die ersten beiden Bursts stammen vom ersten Bootloader. Der dritte Burst ist der U-Boot-Start. Die CPU sendet keine Zeichen mehr, wenn der dritte blaue Burst endet.

Wenn ich die Traces richtig interpretiere, bedeutet dies, dass die Reset-Leitung fast genau für die Zeit niedrig ist, in der der Prozessor U-Boot von NAND-Flash lädt.

zwei Oszilloskopspuren

Ich habe ein paar Fragen:

  • Ist diese Art des CPU-gesteuerten Zurücksetzens normal?
  • Irgendwelche Vorschläge, wie man das debuggt?

Noch ein paar Details: Ich sollte hinzufügen, dass ich mir die Stromschienen angesehen habe und sie sauber aussehen. Das folgende Verhalten ist reproduzierbar. Ich kann die Länge des anfänglichen Reset-Eintauchens (in Gelb) um einige Sekunden variieren, und der Rest des Verhaltens geschieht auf die gleiche Weise. Wenn ich das JTAG-Kabel anschließe, ändert sich das Verhalten - manchmal startet es, manchmal nicht, aber nach einigen Sekunden übernimmt JTAG und der Prozessor wird angehalten.

Unter JTAG kann ich erfolgreich booten. So sieht ein erfolgreicher JTAG-gesteuerter Start aus:

Ein weiterer Screenshot des Scopes, jedoch mit mehr seriellen Daten

Beachten Sie, dass die Zeitskala unterschiedlich ist und ich nicht die Reset-Taste drücke - sie wird softwaregesteuert. Der gleiche Reset-Dip tritt auf. In beiden Fällen beträgt die Länge ca. 500 ms.

Update (immer noch verblüfft)

Auf Anregung von Mr. Taffeys Vorschlag unten habe ich den Watchdog-Timer und den Reset-Controller genauer untersucht. Der Watchdog-Timer wird tatsächlich vom ersten Bootloader deaktiviert. Ich bin mir ziemlich sicher, dass Code ausgeführt wird, da er auftritt, bevor Text über die serielle Debug-Schnittstelle gesendet wird, und ich den Text erfolgreich lesen kann.

Bei der Lektüre über die Details des Reset - Controller, erfuhr ich , dass der Prozessor soll zur Greifersteuerung des Reset - Pin und ziehen Sie sie niedrig für einen kurzen Zeitraum. Dies soll sicherstellen, dass andere Hardware auf der Karte, die dieselbe Leitung hört, einen ausreichend langen Reset erhält. Beim Durchsuchen des U-Bootes stellte ich fest, dass die Dauer des Zurücksetzens mithilfe des ERSTL-Felds auf 0x0D festgelegt wurde:

at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY |
  (AT91_RSTC_ERSTL & (0x0D << 8)) |
  AT91_RSTC_URSTEN);

Das Datenblatt erklärt, dass die Dauer auf 2 ^ (ERSTL + 1) langsame Taktperioden eingestellt ist.

Die Rücksetzdauer beträgt ungefähr 500 ms, der langsame Taktkristall beträgt 32768 Hz, und Google teilt mir mit, dass log (0,500 * 32768) / log (2) = 14 und 0x0D + 1 = 14 ist. Dies alles ist also sinnvoll.

Ich denke, das eigentliche Problem könnte ein Absturz des U-Bootes sein. Die Tatsache, dass dies unmittelbar nach diesem Zurücksetzen geschieht, ist wahrscheinlich irrelevant. Was verwirrend ist, ist, warum U-Boot nur abstürzt, wenn JTAG nicht verbunden ist.

Zweites Update

Ich weiß immer noch nicht, was schief geht oder warum JTAG es anders macht, aber ich denke, ich habe eine Problemumgehung gefunden. Es sieht so aus, als würde der U-Boot-Absturz auf irgendeine Weise durch den NAND-Blitz auf der Platine verursacht. Zufällig verwendet die nächste Revision der Karte, die erst kürzlich eingetroffen ist, eine microSD-Karte anstelle von NAND-Flash für die nichtflüchtige Massenspeicherung (nun, es gibt NAND-Flash in der microSD-Karte, aber Sie sehen den Punkt).

Meine "Lösung" besteht darin, die nächste Version des Boards zu verwenden. U-Boot stürzt ebenfalls ab, aber aus bekannten Gründen - es ist so konfiguriert, dass es nach einem NAND-Flash sucht, den es nicht finden kann. Daher stirbt es einen feurigen Tod.

Also, Problem "gelöst". (Erwarten Sie in Kürze eine weitere Frage wie "Wie lasse ich AT91Bootstrap U-Boot von einem seriellen Flash laden?" Oder "Wie kann U-Boot mit einer microSD-Karte funktionieren?" Oder "Warum mache ich das?" )

Ich denke, das grüne Häkchen geht an Joby, um zu bemerken, dass die Rücksetzleitung vom Mikro gesteuert werden kann, obwohl sie sich auf lange Sicht als irrelevant herausgestellt hat. Vielen Dank für die Hilfe an euch alle. Ich schätze es.

Drittes Update (ca. eine Woche später)

Ich habe in letzter Zeit hauptsächlich an anderen Dingen gearbeitet, aber ich habe herausgefunden, wo das Problem letztendlich lag. Mein letztes Rätsel habe ich oben zusammengefasst als:

Was verwirrend ist, ist, warum U-Boot nur abstürzt, wenn JTAG nicht verbunden ist.

Tatsächlich stellte sich heraus, dass ich den U-Boot-Fehler beim Senden von Zeichen über die serielle Debug-Schnittstelle für einen U-Boot-Absturz hielt. Ich verstehe die Details immer noch nicht, aber ich habe festgestellt, dass es nicht JTAG ist, das U-Boot zum Funktionieren bringt - es ist eine gemeinsame Basis zwischen meiner Schaltung und dem USB-Host meines PCs, den JTAG bereitgestellt hat, weil es durchläuft den USB-Anschluss. Tatsächlich funktionierte der U-Boot die ganze Zeit einwandfrei, aber wenn JTAG getrennt wurde, funktionierte der von mir mit einem Steckbrett versehene RS-232-zu-USB-Level-Shifter nicht mehr, die serielle Schnittstelle fiel aus und ich ging davon aus, dass dies der Fall war tot. In Wirklichkeit stellte ich fest, dass ich beispielsweise immer noch Ping-Befehle eingeben und die erzeugten ICMP-Pakete sehen konnte, obwohl meine Zeichen nicht auf dem Terminal wiedergegeben wurden.

Ich verstehe nicht genau, was falsch gelaufen ist, aber es ist mir egal - ich kann leicht einen anderen Weg finden, um die serielle Schnittstelle zu lesen, und kurzfristig kann ich einfach die Verbindung zur USB-Masse mit einem Kabel herstellen .

Vielen Dank für die Hilfe.

pingswept
quelle
"Interessant" ... das ist alles was ich zu sagen habe.
Kellenjb
1
wahrscheinlich eine blöde Frage, aber Ihre Reset-Schaltung (die Taste) hat einen Pull-up-Widerstand, oder? Ich meine, wenn die Taste nicht gedrückt wird, bleibt der Reset-Pin nicht schweben. Darüber hinaus können Sie auch versuchen, die Reset-Taste mit einer Entprellungsobergrenze zu versehen, um ein ungewöhnliches Verhalten aufgrund eines Abpralls der Rücksetzlinie auszuschließen.
Mark
(Keine dumme Frage - es war eines der ersten Dinge, die ich überprüft habe.) Ja, der Knopf ist hochgezogen. Es gibt keine Entprellungskappe, aber ich habe mir die ansteigende Flanke genau angesehen, und sie springt nicht erkennbar. Der Fehler tritt fast 1 Sekunde nach dem Loslassen der Taste auf, sodass ich dies ausschließen kann.
Pingswept
2
Ich würde wahrscheinlich anfangen, Code aus dem U-Boot zu rippen, um herauszufinden, wo er abstürzt ... Vielleicht führt Ihr JTAG-Adapter einen Reset durch und hält dann die CPU für eine Weile an - damit etwas anderes auf dem Board Zeit hat, sich richtig
einzuschalten
1
JTAG wirkt sich darauf aus. Dies sagt Ihnen nur, dass Sie in der Lage sein sollten, im Uboot-Code etwas Ähnliches zu finden.
Kortuk

Antworten:

6

Betrachten Sie das Datenblatt:

14.3.4.5 Watchdog-Reset Der Watchdog-Reset wird eingegeben, wenn ein Watchdog-Fehler auftritt. Dieser Zustand dauert 3 langsame Taktzyklen.

Beim Watchdog-Reset hängt die Aktivierung der Reset-Signale vom WDRPROC-Bit in WDT_MR ab: Wenn WDRPROC 0 ist, werden der Prozessor-Reset und der Peripherie-Reset aktiviert. Abhängig von der Programmierung des Feldes ERSTL wird auch die NRST-Leitung aktiviert. Der resultierende niedrige Pegel in NRST führt jedoch nicht zu einem Benutzer-Reset-Status.

Könnte es sein, dass der Watchdog die Reset-Linie abfeuert und steuert?

Toby Jaffey
quelle
Das nächste, was ich lesen wollte, war der Watchdog-Timer, der seltsame Probleme verursachen kann, aber ich war mir nicht sicher, ob der JTAG den Watchdog deaktivieren und das Problem stoppen würde.
Kortuk
4

Dies kann ein langer Schuss sein. Auf einem viel niedrigeren Mikrocontroller, einem PIC, habe ich Menschen mit seltsamen Resets viele Male geholfen, da ein Niederspannungs-Programmier-Pin aktiviert war.

Wenn ein Programmierer angeschlossen ist, hält er ähnliche Leitungen bei einer eingestellten Spannung. Wenn der Programmierer getrennt wurde, können sie leicht schweben. Bei einem Projekt wurde das Gerät zurückgesetzt, wenn es über Metall ging. Sie haben LVP nicht überprüft, als ich sie darum gebeten habe, sie haben noch 2 Wochen gearbeitet und es dann deaktiviert und das Problem wurde gelöst.

Kortuk
quelle
Ich denke nicht, dass dies ein langer Schuss ist. Es kann sich nicht um einen LVP oder einen ähnlichen Pin handeln, sondern um einen schwebenden Eingang. Wir hatten einen PowerPC, bei dem der allgemeine E / A-Eingang schwebte, nur weil der Pegel des Eingangs früh im Code überprüft wurde.
Andrey
2

Sind die JTAG-Leitungen eines Geräts mit Dingen verbunden, die sie nicht sein sollten?

Wie sagen Adressbusleitungen?

(Es hat Monate gedauert, um dieses eine Mal zu debuggen.)

Tim Williscroft
quelle
Gute Idee. Ich habe gerade den Schaltplan und das PCB-Layout überprüft. Ich sehe keine versehentlichen Adressleitungskreuzungen oder Fehlverbindungen. Ich habe bemerkt, dass sich der JTAG-Anschluss direkt unter dem RAM befindet, aber sie sind durch zwei Energieebenen getrennt, und die Karte startet korrekt unter JTAG-Kontrolle. Wenn der JTAG inaktiv ist, tritt das Problem auf.
Pingswept
Sie ziehen den jtag tclk und trst in sichere Zustände?
Tim Williscroft
Ja, alle JTAG-Eingänge werden auf 3,3 V hochgezogen, daher sollte sich ihr Zustand nur ändern, wenn JTAG angeschlossen ist und sie ansteuert.
Pingswept