Handgefertigte Schnittstelle zu SWD zum Schreiben des Flashs des ARM-Chips

Ich bin daran interessiert, eine einfache Schnittstelle zu SWD zu erstellen, um Flash-Speicher von ARM-Chips schreiben zu können. Dh ein behelfsmäßiges Programmiergerät zu erstellen - eher der Übung halber.

Ich fing an, die Dokumentation zu lesen und nach Beispielen zu suchen (denn ich glaube, die Leute haben das schon versucht). Aktuell habe ich ein paar Fragen, bei denen ich für Hinweise dankbar wäre:

  • Ich werde SWDCLK als normalen Ausgang und SWDIO als Open-Drain konfigurieren (als Eingang fungieren, wenn es in High-Z ist, siehe unten) - ich vermute, dass es auch auf der Seite des Zielgeräts ein Open-Drain ist , also mit Hilfe von Pull-up bekomme ich nie versehentlich einen Kurzschluss - ist das richtig?
  • Gibt es eine zulässige Mindestuhrzeit? oder irgendetwas reicht, auch nur ein paar Hertz? Oder ist dies vielleicht vom Zielgerät abhängig?
  • Ist es richtig, dass im Wartemodus beide Leitungen auf der Hostseite auf HIGH getrieben werden und wenn die Kommunikation beginnt, die erste Flanke an SWDCLK fällt?
  • HOST sollte SWDIO bei fallender Flanke von SWCLK ändern - und Daten vom Ziel (falls erforderlich) auch bei fallender Flanke von SWCLK abtasten - richtig?

Ich denke derzeit reicht das (obwohl ich auch dankbar wäre für kurze Beispielbefehle zum Lesen/Schreiben des Flashs - aber ich glaube, ich werde es sowieso bald herausfinden) - vielen Dank im Voraus!

Derzeit versuche ich, Arduino zu verwenden, um einen einfachen Prototyp zu erstellen, obwohl ich jederzeit mit FTDI-Kabel auf einfachen Atmega oder LPC111x umsteigen kann ... Obwohl ich glaube, dass dies nicht wichtig ist.

PS, um SWDIO besser zu erklären - mit AVRs zum Beispiel setze ich den Pin auf LOW-Zustand und wenn er dann auf Ausgang geschaltet wird, erzeugt er 0. Wenn er jedoch auf Eingang geschaltet wird, befindet er sich im High-Z-Zustand und funktioniert wirklich als Eingang. Dh ich manipuliere nicht PORTx-Bit, sondern DDRx (während PORTx permanent 0 ist und PINx zum Lesen verwendet wird).

Antworten (1)

Ich werde SWDCLK als normalen Ausgang und SWDIO als Open-Drain konfigurieren

SWDCLK ist OK, aber SWDIO ist bidirektional und kein Open-Drain. Das heißt, Sie müssen in der Lage sein, vom Ausgabe- in den Eingabemodus und umgekehrt zu wechseln.

Gibt es eine zulässige Mindestuhrzeit?

Normalerweise nicht, aber einige Geräte haben Mindesttaktraten für spezielle Funktionen wie das Entsperren.

Ich wäre auch dankbar für ein kurzes Beispiel der Befehlssequenz zum Lesen / Schreiben des Flash

Das ist für jedes Gerät spezifisch. OpenOCD unterstützt viele verschiedene Typen (sowohl Mikrocontroller als auch Programmierer) und verfügt über Quellcode.

Ich habe Versaloon bereits auf die LPC1343-MCU auf dem CCC R0ket portiert , dies könnte ein einfacherer Ausgangspunkt sein.

"aber SWDIO ist bidirektional und kein Open Drain" - oh, ich habe meine Idee schlecht erklärt, ich werde die Beschreibung aktualisieren. Vielen Dank für alle Hinweise!
Wenn Stromverbrauch und Geschwindigkeit nicht wichtig sind, ist es möglich, anstelle eines 3-State-Treibers einen Widerstand zu verwenden, um einen Ausgang mit einem I/O-Pin zu verbinden. Wenn der I/O-Pin ein Signal antreibt, gewinnt er. Wenn es schwebend ist, gewinnt der widerstandsgebundene Ausgang. Es ist im Allgemeinen nicht schwer, einen Widerstand zu finden, der hoch genug ist, um eine Beschädigung des Ausgangs zu vermeiden, aber niedrig genug, um parasitäre Lecks zu überwältigen. Parasitäre Kapazitäten können die nutzbare Geschwindigkeit einschränken, aber für eine manuelle Schnittstelle sollte das kein Problem sein.
Übrigens, ich habe noch nie einen Prozessor seriell programmiert, aber ich habe eine Gruppe von 8 Datenschaltern, 8 LEDs, einigen Modusschaltern und einer Taste verwendet, um ein 16-Byte-Kurzprogramm in einen RCA-1801-Prozessor einzuspeisen .