jtag:tutorials:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
jtag:tutorials:start [Sun. 11.03.2018 16:44] wikiadminjtag:tutorials:start [Tue. 13.03.2018 07:26] (aktuell) wikiadmin
Zeile 19: Zeile 19:
 Nimm ein Gerät von dem die JTAG-Schnittstelle bekannt und bereits dokumentiert ist. Google einfach danach: "<GERÄTENAME> JTAG Signale Header". Später lernen wir noch, wie man die Schnittstelle eines nicht bekannten Systems ermittelt. Für den Anfang wäre das aber der falsche Weg, glaub mir. Sobald Du also weißt wo auf Deinem Test-Board die JTAG-Anschlüsse ''TCK, TMS, TDI, TDO'' (und natürlich ''GND'') liegen kann es schon losgehen. Nimm ein Gerät von dem die JTAG-Schnittstelle bekannt und bereits dokumentiert ist. Google einfach danach: "<GERÄTENAME> JTAG Signale Header". Später lernen wir noch, wie man die Schnittstelle eines nicht bekannten Systems ermittelt. Für den Anfang wäre das aber der falsche Weg, glaub mir. Sobald Du also weißt wo auf Deinem Test-Board die JTAG-Anschlüsse ''TCK, TMS, TDI, TDO'' (und natürlich ''GND'') liegen kann es schon losgehen.
  
-== Wie kann ich den PC mit der JTAG-Schnittstelle des Geräts verbinden? ==+== Womit und wie kann ich Daten über die JTAG-Schnittstelle senden und lesen? ==
  
-Ich verwende dafür nachfolgend einen Arduino verwenden, mit dem ich die Signale erzeuge und ausleseSowas sollte jeder in der Bastelkiste habenhier reicht ein Arduino Nano Clone, der für unter 5,- € zu haben ist.+Dafür sind die "Test-Adapter" da. Die machen die Kommunikation vom PC aus möglich und kommen meist auch mit einer Steuersoftware daherAnstelle jetzt aber hunderte von Euros dafür auszugebenverwenden wir erstmal einen billigen 5,- € Arduino Nano (oder Uno) und kommunizieren direkt bzw. per Serial-Terminal mit dem JTAG-Chip.
  
-Desweiteren brauchst Du einen Pegelwandler um die IO-Signale vom Arduino an den Spannungspegel des JTAG-Chips auf dem Testgerät anzupassenSuch auf ebay nach "Pegelwandler TXS0108" und Du wirst was passendes für wenige Euro finden. **HEY, DAS IST WICHTIG** nicht einfach drauf verzichten, sonst grillst Du womöglich gleich Dein Testgerät([[nerdwissen_pegelwandler|Nerd-Wissen: Warum braucht man das?]])+Damit uns der nicht wegen unterschiedlicher Betriebs- und IO-Signalspannung hopps  geht, schalten wir noch einen Pegelwandler zwischen ihm und der JTAG-Schnittstelle vom GerätIch verwende hier einen 8-Kanaligen mit nem "TXS0108" IC drauf. Der kostet auf Ebay auch nur ein paar Euro.
  
-== Hardware-Aufbau mit Arduino und Pegelwandler ==+**UND HEY, DAS IST WICHTIG** nicht einfach auf den Pegelwandler verzichten, sonst grillst Du womöglich gleich Dein Testgerät. ([[nerdwissen_pegelwandler|Nerd-Wissen: Was macht ein Pegelwandler und wozu braucht man das?]])
  
-Verbinde das ganze so:+===== Wir bauen uns ein JTAG-Interface mit Arduino und Pegelwandler ===== 
 + 
 +== Prinzipschaltbild == 
 + 
 +<code> 
 +[PC]<---USB---> [Arduino]<--->[Pegelwandler]<--->[JTAG-Schnittstelle vom Testgerät] 
 +</code> 
 + 
 +== Schaltplan und physikalischer Aufbau == 
 + 
 +<SCHALTPLAN> 
 + 
 +<FOTO VOM AUFBAU>
  
 ^ Arduino ^ Pegelwandler HS ^ Pegelwandler LS ^ JTAG-Signal ^ Kabelfarbe ^ ^ Arduino ^ Pegelwandler HS ^ Pegelwandler LS ^ JTAG-Signal ^ Kabelfarbe ^
Zeile 35: Zeile 47:
 | D10 | H4 | L4 | TDO | Lila | | D10 | H4 | L4 | TDO | Lila |
  
-<FOTOS> +== Software-Grundgerüst für den Arduino ==
- +
-== Arduino-Code dazu ==+
  
 Zunächst definieren wird die Signale mit Namen um sie einfach verwenden zu können: Zunächst definieren wird die Signale mit Namen um sie einfach verwenden zu können:
Zeile 48: Zeile 58:
 </code> </code>
  
-Dann, im ''setup()'' Teil die Signalrichtungen einstellen:+Im ''setup()'' Teil des Codes konfigurieren wir damit die Signalports und stellen ihren Grundzustand ein:
  
 <code c> <code c>
-void setup()+void initPins()
 { {
   pinMode(TCK, OUTPUT);   pinMode(TCK, OUTPUT);
Zeile 61: Zeile 71:
   digitalWrite(TMS, HIGH);   digitalWrite(TMS, HIGH);
   digitalWrite(TDO, HIGH);   digitalWrite(TDO, HIGH);
-  digitalWrite(TDI, HIGH);+
 + 
 +void setup() 
 +
 +  initPins(); 
 +  ...
 } }
 </code> </code>
  
-**Damit ist der grundlegende Aufbau der Schnittstelle erledigt!**+===== Wie kommuniziere ich nun mit dem Chip? =====
  
-== Was haben wir nun gelernt? ==+== Erstes Etappenziel: IDCODE auslesen ==
  
-  * Du weißt nun das JTAG mindestens 4 Signalleitungen brauchtnämlich TCKTMS, TDI und TDO. +Um schnell einen Erfolg zu erziehlen und auch das ganze Setup zu überprüfennehmen wir uns etwas einfaches vordas auslesen des IDCODEs aus dem ChipUm das hinzubekommen musst Du erst ein klein Wenig Theorie kennen.
-  * Der Spannungspegel dieser Leitungen ist zu beachten und entsprechend anzupassen um sicher darauf zuzugreifen.+
  
-===== Wie kommuniziere ich nun mit dem Chip? =====+== Automatische IDCODE Bereitstellung nach Reset == 
 + 
 +Ein JTAG-Controller soll seinen IDCODE nach einem Reset in das Datenregister stellen. Durch geeignete Ansteuerung der Statemachine über den TMS-Pin kann man dieses Register dann zwischen TDI und TDO schalten und die darin befindlichen Bits "heraustakten"
 + 
 +Neben dem Reset nach einschalten kann man aber auch per Hardware oder Software einen Reset durchführen. Hierzu führen manche JTAG-Header einen zusätzlichen Pin, namens ''TRST'' (oder manchmal auch ''nTRST'' bezeichnet) heraus. Der ist active-Low und sollte während des Betriebs mit einem Pullup auf den HIGH-Pegel gezogen werden. Eine andere Möglichkeit ist den Reset per Software auszulösen, indem man über TMS eine bestimmte Bitfolge einschreibt. 
 + 
 +Um das Ziel zu erreichen musst Du also nun wissen wie man einen Soft-Reset auslöst, wie man das Datenregister aktiviert und wie man die Daten dann daraus ausliest. Das zeige ich dir nun...
  
 == Grundlegende Kommunikation == == Grundlegende Kommunikation ==
  
-Diese ist seriell, sowohl für die Daten als auch für die Befehle. Die Daten werden an den TDI und TDO-Pins gesendet bzw. empfangen, die Befehle über den TMS-Pin. Wann die jeweilige Information an den Pins stabil ist und übernommen wird, regelt die Taktleitung TCK. Hierbei sind die Übergänge von 0 nach 1 bzwnach 0 entscheident.+Diese ist seriell, sowohl für die Daten als auch für die Befehle. Die Daten werden am TDO Pin gesendet und am TDI-Pin empfangen. Der Betriebszustand des JTAG-Controllers wird über eine State-Machine bestimmtwelche vom TMS-Pin gesteuert wird. Der Betriebszustand entscheidet was mit eingehenden Daten zu tun ist, bzw. welche ausgenden Daten bereitgestellt werden sollen. 
 + 
 +Der Aufbau und die Funktion der State-Machine sind wichtig, bedarf aber etwas Erklärung. Kurz gesagt sendet man eine bestimmte Bitfolge über den TMS-Pin um einen bestimmten Zustand zu erwirken([[nerdwissen_statemachine|Nerd-Wissen: Die JTAG State-Machine]])) 
 + 
 +Zur Synchronisation der Zustands- und Datensignale wird die Taktleitung TCK genutztBeim Übergang von LOW zu HIGH (steigende Flanke) wird das an TMS anstehende Signal übernommen. 
 + 
 +nach LOW oder umgekehrt, werden bestimmte Zustände übernommen.
  
 Intern liegt zwischen TDI und TDO ein Schieberegister. Die Breite dieses und die Verwendung der darin befindlichen Daten bestimmt der Betriebsmodus des Chips, der über JTAG-Befehle gesteuert wird. Intern liegt zwischen TDI und TDO ein Schieberegister. Die Breite dieses und die Verwendung der darin befindlichen Daten bestimmt der Betriebsmodus des Chips, der über JTAG-Befehle gesteuert wird.
  • jtag/tutorials/start.txt
  • Zuletzt geändert: Tue. 13.03.2018 07:26
  • von wikiadmin