Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | Nächste ÜberarbeitungBeide Seiten der Revision | ||
jtag:tutorials:start [Sun. 11.03.2018 15:52] – wikiadmin | jtag:tutorials:start [Sun. 11.03.2018 16:44] – wikiadmin | ||
---|---|---|---|
Zeile 25: | Zeile 25: | ||
Desweiteren brauchst Du einen Pegelwandler um die IO-Signale vom Arduino an den Spannungspegel des JTAG-Chips auf dem Testgerät anzupassen. Such auf ebay nach " | Desweiteren brauchst Du einen Pegelwandler um die IO-Signale vom Arduino an den Spannungspegel des JTAG-Chips auf dem Testgerät anzupassen. Such auf ebay nach " | ||
- | == Verbinde das ganze so == | + | == Hardware-Aufbau mit Arduino und Pegelwandler == |
+ | |||
+ | Verbinde das ganze so: | ||
+ | |||
+ | ^ Arduino ^ Pegelwandler HS ^ Pegelwandler LS ^ JTAG-Signal ^ Kabelfarbe ^ | ||
+ | | D7 | H1 | L1 | TCK | Gelb | | ||
+ | | D8 | H2 | L2 | TMS | Grau | | ||
+ | | D9 | H3 | L3 | TDI | Grün | | ||
+ | | D10 | H4 | L4 | TDO | Lila | | ||
< | < | ||
+ | |||
+ | == Arduino-Code dazu == | ||
+ | |||
+ | Zunächst definieren wird die Signale mit Namen um sie einfach verwenden zu können: | ||
+ | |||
+ | <code c> | ||
+ | #define TCK 7 | ||
+ | #define TMS 8 | ||
+ | #define TDI 9 | ||
+ | #define TDO 10 | ||
+ | </ | ||
+ | |||
+ | Dann, im '' | ||
+ | |||
+ | <code c> | ||
+ | void setup() | ||
+ | { | ||
+ | pinMode(TCK, | ||
+ | pinMode(TMS, | ||
+ | pinMode(TDO, | ||
+ | pinMode(TDI, | ||
+ | |||
+ | digitalWrite(TCK, | ||
+ | digitalWrite(TMS, | ||
+ | digitalWrite(TDO, | ||
+ | digitalWrite(TDI, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **Damit ist der grundlegende Aufbau der Schnittstelle erledigt!** | ||
== Was haben wir nun gelernt? == | == Was haben wir nun gelernt? == | ||
Zeile 48: | Zeile 86: | ||
TDI < | TDI < | ||
- | Will man also nur die Daten eines bestimmten Chips lesen oder schreiben, muss man wissen | + | Die Befehls- und Taktleitung (TMS, TCK) liegt an allen Chips parallel an, was bedeutet das immer alle den gleichen Betriebszustand einnehmen werden. |
+ | == Daten an TDI einlesen == | ||
- | Die Befehls- und Taktleitung liegt an allen parallel an, was bedeutet | + | Die Norm definiert das der Logikpegel (Bit) von TDI bei der steigenden Flanke von TCK in das Schieberegister übernommen wird. Solange TCK also ' |
+ | digitalWrite(TCK, | ||
+ | digitalWrite(TCK, | ||
+ | bit = digitalRead(TDI); | ||
+ | data = (data << 1) & bit; | ||
+ | </ | ||
+ | == Daten auf TDO senden == | ||
+ | Bei der fallenden Flanke von TCK wird das nächste Bit vom Schieberegister an TDO ausgegeben. | ||
+ | <code c> | ||
+ | digitalWrite(TCK, | ||
+ | bit = data & 1; | ||
+ | digitalWrite(TDO, | ||
+ | digitalWrite(TCK, | ||
+ | data >> 1; | ||
+ | </ | ||
+ | == Daten auf TMS senden == | ||
- | Mit JTAG kann man mehr als einen Chip verbinden. Diese sind dabei datentechnisch in Reihe geschaltet | + | TMS ist unidirektional, |
+ | <code c> | ||
+ | bit = x; // 0 oder 1 | ||
+ | digitalWrite(TCK, | ||
+ | digitalWrite(TMS, | ||
+ | digitalWrite(TCK, | ||
+ | </ | ||
- | Die Kommunikation vom Testadapter (unserem Arduino) mit der Chain erfolgt also seriell. Jeder Chip enthält seinen eigenen | + | == Welche Betriebszustände kennt der JTAG-Controller und wozu dienen diese? == |
- | Zur Synchronisation dient das Clocksignal TCK. Bei der steigenden, bzw. fallenden Flanke des Signals werden bestimmte Ein-, Ausgangssignale verarbeitet. Man muss wissen das TCK und TMS im Gegensatz zu TDI und TDO bei allen JTAG-Chips einer Chain parallel anliegen. Man steuert also über TMS nicht nur einen Chip sondern alle und der Betriebszustand ist immer für alle gleich. | + | Nach dem einschalten befindet sich der JTAG-Controller im Betriebszustand " |
- | ===== Anzahl der JTAG-Controller einer Chain bestimmen ===== | + | In diesem Zustand passiert |
- | Es gilt als erstes herauszufinden wieviele Chips in einer Chain verkettet sind. Das ist die Basis für alle weiteren Untersuchungen. Später wirst Du das verstehen! | + | Für uns ist wichtig, das man über TMS den Controller dazu veranlassen kann, entweder das Datenregister ('' |
+ | Die JTAG-Norm definiert hier nur wenige: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | Darüber hinaus unterstützen manche Chips auch noch diese: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Will man also nur die Daten eines bestimmten Chips lesen oder schreiben, muss man wissen an welcher Stelle der Chain sich dieser befindet. | ||
+ | |||
+ | Mit JTAG kann man mehr als einen Chip verbinden. Diese sind dabei datentechnisch in Reihe geschaltet und man nennt das eine " | ||
+ | |||
+ | |||
+ | Die Kommunikation vom Testadapter (unserem Arduino) mit der Chain erfolgt also seriell. Jeder Chip enthält seinen eigenen JTAG-Controller. Sein Betriebsmodus bestimmt, was mit den einfließenden Daten an TDI zu tun ist und welche Daten an TDO anliegen. Dieser Modus wird über die separate TMS-Leitung eingestellt, | ||
+ | |||
+ | Zur Synchronisation dient das Clocksignal TCK. Bei der steigenden, bzw. fallenden Flanke des Signals werden bestimmte Ein-, Ausgangssignale verarbeitet. Man muss wissen das TCK und TMS im Gegensatz zu TDI und TDO bei allen JTAG-Chips einer Chain parallel anliegen. Man steuert also über TMS nicht nur einen Chip sondern alle und der Betriebszustand ist immer für alle gleich. | ||
+ | |||
+ | ===== Anzahl der JTAG-Controller einer Chain bestimmen ===== | ||
+ | |||
+ | Es gilt als erstes herauszufinden wieviele Chips in einer Chain verkettet sind. Das ist die Basis für alle weiteren Untersuchungen. Später wirst Du das verstehen! | ||
Nach dem einschalten des Chips befindet sich der Controller im Zustand " | Nach dem einschalten des Chips befindet sich der Controller im Zustand " |