JTAGの実験 2008.12.27(土)〜 JTAGライターの製作
著作者名: 中野 良知 作成開始: 2008.12.26(金) 更新 : 2009.01.23(金) △1 LOCK BIT書き込みを追加。
目次 1. 目的 2. 実験の経過 1. 目的 JTAGの制御を理解する為、プログラムライターの製作実験を行います。 ターゲットデバイスはATMELのATmega644P、データシートにJTAGの制御方法が詳しく 書かれています。 (CPLDのプログラム書き込みも実験したいところですが....。調査中です。) 2. 実験の経過 2009.01.23(金) △1 LOCK BITの書き込みを追加しました。 1) LOCK BITデータを取得。 2) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 3) [SHIFT DR]へ遷移 4) LOCK BIT書き込み許可。0x2320, 15bits。 5) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 6) LOCK BITデータ設定。0x13C0 + ロックビット1バイト。15bits。 7) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 8) LOCK BITデータ書き込み指示(1)。0x3300, 15bits。 9) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 10) LOCK BITデータ書き込み指示(2)。0x3100, 15bits。 11) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 12) LOCK BITデータ書き込み指示(3)。0x3300, 15bits。 13) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 14) LOCK BITデータ書き込み指示(4)。0x3300, 15bits。 15) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 16) 書き込み終了チェック。0x3300, 15bits。 17) TODの10ビット目が1になり書き込みが終了するまで15)へループ。 18) [RUN TEST/IDLE]へ遷移 19) プログラミング終了処理。 (2009.01.03を参照) フラッシュROM、EEPROM、FUSE BIT、LOCK BITのR/WとERASE機能が揃いました。 2009.01.20(火) FUSE BITの書き込みを追加しました。 FUSE BIT書き込み手順 1) 書き換え用のFUSE BITの3バイト(拡張、上位、下位)を用意。 2) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 3) [SHIFT DR]へ遷移 4) ヒューズ書き込み許可。0x2340, 15bits。 5) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 6) 拡張ヒューズビットデータ設定。0x1300 + 拡張ヒューズデータ。15bits。 7) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 8) 拡張ヒューズビットデータ書き込み指示(1)。0x3B00, 15bits。 9) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 10) 拡張ヒューズビットデータ書き込み指示(2)。0x3900, 15bits。 11) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 12) 拡張ヒューズビットデータ書き込み指示(3)。0x3B00, 15bits。 13) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 14) 拡張ヒューズビットデータ書き込み指示(4)。0x3B00, 15bits。 15) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 16) 書き込み終了チェック。0x3B00, 15bits。 17) TODの10ビット目が1になり書き込みが終了するまで15)へループ。 18) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 19) FUSE BIT上位データ設定。0x1300 + ヒューズビットの上位バイト。15bits。 20) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 21) FUSE BIT上位書き込み指示(1)。0x3700, 15bits。 22) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 23) FUSE BIT上位書き込み指示(2)。0x3500, 15bits。 24) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 25) FUSE BIT上位書き込み指示(3)。0x3700, 15bits。 26) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 27) FUSE BIT上位書き込み指示(4)。0x3700, 15bits。 28) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 29) 書き込み終了チェック。0x3700, 15bits。 30) TODの10ビット目が1になり書き込みが終了するまで28)へループ。 31) FUSE BIT下位データ設定。0x1300 + ヒューズビットの下位バイト。15bits。 32) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 33) FUSE BIT下位書き込み指示(1)。0x3300, 15bits。 34) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 35) FUSE BIT下位書き込み指示(2)。0x3100, 15bits。 36) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 37) FUSE BIT下位書き込み指示(3)。0x3300, 15bits。 38) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 39) FUSE BIT下位書き込み指示(4)。0x3300, 15bits。 40) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 41) 書き込み終了チェック。0x3300, 15bits。 42) TODの10ビット目が1になり書き込みが終了するまで40)へループ。 43) [RUN TEST/IDLE]へ遷移 44) プログラミング終了処理。 (2009.01.03を参照) 2009.01.17(土) EEPROMの書き込みを追加しました。 2Kバイト書き込み時間 = 8秒(書き込み) + 5秒(ベリファイ) = 合計13秒。 EEPROM書き込み手順 1) HEXファイル読み込み 2) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 3) [SHIFT DR]へ遷移 4) EEPROM書き込み移行を指示。0x2311, 15bits。 5) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 6) アドレス上位バイト指定。0x0700 + バイトアドレスの上位バイト。15bits。 7) アドレス下位バイト指定。0x0300 + バイトアドレスの下位バイト。15bits。 8) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 9) データ設定。0x1300 + 書き込みバイトデータ。15bits。 10) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 11) データラッチ(1)。0x3700, 15bits。 12) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 13) データラッチ(2)。0x7700, 15bits。 14) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 15) データラッチ(3)。0x3700, 15bits。 16) 7)へループ。1ページ(8バイト)設定完了まで繰り返し。 17) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 18) EEPROM書き込み指示(1)。0x3300, 15bits。 19) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 20) EEPROM書き込み指示(2)。0x3100, 15bits。 21) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 22) EEPROM書き込み指示(3)。0x3300, 15bits。 23) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 24) EEPROM書き込み指示(4)。0x3300, 15bits。 25) 書き込み終了チェック。0x3300, 15bits。TODの10ビット目が1で書き込み終了。 26) バイトアドレス更新。(+=8) 27) 6)へループ。書き込みページ分繰り返し。 28) [RUN TEST/IDLE]へ遷移 29) プログラミング終了処理。 (2009.01.03を参照) 2009.01.14(水) フラッシュROM書き込みを追加しました。 ページ(256バイト)書き込みを使用。 64Kバイト書き込み時間=16秒。(ベリファイ時間を含む) フラッシュROM書き込み手順 1) HEXファイル読み込み 2) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 3) [SHIFT DR]へ遷移 4) フラッシュ書き込み移行。0x2310, 15bits。 5) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 6) アドレス上位バイト指定。0x0700 + ワードアドレスの上位バイト。15bits。 7) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 8) アドレス下位バイト指定。0x0300 + ワードアドレス下位バイト。15bits。 9) [SHIFT IR]へ遷移。RUN_TEST/IDLE経由。 10) PROG_PAGELOAD命令を発行。PROG_PAGELOAD, 4bits。 11) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 12) 書き込みデータ1バイト送信 13) 11)へループ。256バイト分繰り返し。 14) [SHIFT IR]へ遷移。RUN_TEST/IDLE経由。 15) PROG_COMMANDS発行。PROG_COMMANDS, 4bits。 16) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 17) 書き込み指示(1)。0x3700, 15bits。 18) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 19) 書き込み指示(2)。0x3500, 15bits。 20) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 21) 書き込み指示(3)。0x3700, 1bits。 22) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 23) 書き込み指示(4)。0x3700, 1bits。 24) [SHIFT DR]へ戻す。RUN_TEST/IDLE経由。 25) 書き込み終了チェック。0x3700, 15bits。TODの10ビット目が1で書き込み終了。 26) ワードアドレス更新。(+=128) 27) 6)へループ。書き込みページ分繰り返し。 28) [RUN TEST/IDLE]へ遷移 29) プログラミング終了処理。 (2009.01.03を参照) 2009.01.12(月) チップ消去を追加しました。 消去手順 1) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 2) [SHIFT DR]へ遷移 3) チップ消去指示(1)。0x2380、15bits。 4) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 5) チップ消去指示(2)。0x3180、15bits。 6) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 7) チップ消去指示(3)。0x3380、15bits。 8) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 9) チップ消去指示(4)。0x3380、15bits。 チップ消去チェック 10) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 11) チェック指示、消去完了ビットチェック。0x3380、15bits。 12) 消去完了ビット=1になるまで10)へループ 13) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 14) プログラミング終了処理。 (2009.01.03を参照) 2009.01.11(日) 実験の様子です。 エバボード上の左からFT232モジュール(USB I/F)、ATtiny2313(JTAG I/F)、 ATmega644P(ターゲット)。 上のシリアルライター(FT233+ATtiny2313)でATtiny2313にJTAG I/F用のプログラム を書き込みます。 2009.01.10(土) EEPROM(2Kバイト)を読出しました。 読出し手順 1) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 2) [SHIFT DR]へ遷移 3) EEPROM読出し移行。0x2303、15bits。 4) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 5) アドレス上位バイト指定。 0x0700 + アドレス上位バイト、15bits。 6) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 7) アドレス下位バイト指定。 0x0300 + アドレス下位バイト、15bits。 8) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 9) EEPROM読出し指示(1)。0x3300 + アドレス下位バイト。15bits。 10) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 11) EEPROM読出し指示(2)。0x3200、15bits。 12) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 13) EEPROM読出し指示(3)。0x3300、15bits。1バイトのEEPROMデータ読み取り。 14) アドレスを+1 15) 4)へループ。2048バイト分を繰り返す 16) 仮想COMポートから2048バイトを引き取る 17) [RUN TEST/IDLE]へ遷移 18) プログラミング終了処理。 (2009.01.03を参照) 19) EEPROMデータを表示 1バイトのEEPROMデータは、13)でTDOのLSBから8ビットです。 2009.01.09(金) フラッシュROM 64Kバイトを読出しました。 64Kバイト読出し時間の比較 1) JTAGページリード(256バイト/ページ) :2.64秒(*1)、3.68秒(*2)、5.68(*3) 2) シリアルライター(FT232+ATtiny2313):7.8秒(CLOCK=4MHz)、23秒(CLOCK=1MHz) 3) パラレルライター(FT232+ATmega8) :5.6秒 (*1)は4ページ毎に、(*2)は2ページ毎に、(*3)は1ページ毎に仮想COMポートの受信 バッファーからデータを引き取ります。 読出し手順。(*3)の場合 1) プログラミング開始処理。[RUN TEST/IDLE]でリターン。 (2009.01.03を参照) 2) [SHIFT DR]へ遷移 3) フラッシュ読出し移行。0x2302, 15bits。 4) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 5) アドレス上位バイト指定。0x0700 + ワードアドレス上位バイト。15bits。 6) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 7) アドレス下位バイト指定。0x0300 + ワードアドレス下位バイト。15bits。 8) [RUN TEST/IDLE]経由で[SHIFT IR]へ遷移 9) PROG_PAGEREAD命令を発行 10) [RUN TEST/IDLE]経由で[SHIFT DR]へ遷移 11) 1バイト読出し。MSBはTMS=1にして[EXIT1 DR]へ遷移 12) [UPDATE DR]から直接[SELECT DR SCAN]へ、更に[SHIFT DR]へ遷移 13) 11)へループ。256バイト分を繰り返し 14) 仮想COMポートの受信バッファーから256バイトのデーターを引き取る。 15) [RUN TEST/IDLE]経由で[SHIFT IR]へ遷移 16) PROG_COMMANDS発行 17) 4)へループ。256ページ分を繰り返し 18) [RUN TEST/IDLE]へ遷移 19) プログラミング終了処理。 (2009.01.03を参照) 20) 64KバイトROMデータを表示 2009.01.08(木) フラッシュROM読出し時間をさらに短縮しました。 1ページ(256バイト)のフラッシュROMの読出時間=7.12msec。 (参考) 2009.01.05(月) 18秒。 2009.01.07(水) 17.4msec。 2009.01.08(木) 7.12msec。 主な変更内容: 1) ページ読出し処理をATtiny2313に移行。 2009.01.07(水) フラッシュROM読出し時間を短縮しました。 1ページ(256バイト)のフラッシュROMの読出時間=17.4msecです。 (参考) 2009.01.05(月) 18秒。 2009.01.07(水) 17.4msec。 主な変更内容: 1) TAPの初期化から256バイト読出し、終了処理までの制御データを、1回の仮想COM ポートアクセスで送信。 2) TCKの生成およびTDIとTDOのシリアル・パラレル変換をATtiny2313に移行。 64Kバイト読出し比較 JTAG 17.4msec×256で換算 :4.5秒 シリアルライター(FT232+ATtiny2313):23秒 パラレルライター(FT232+ATmega8) :5.6秒 2009.01.06(火) フラッシュROM読出し時間の検討。 1バイトの読出しでTCKなどの制御データを4回に分けて仮想COMポートへ送信します。 8ビット分のTCKとTDO読み取りで1回。 [PAUSE DR][EXIT2 DR][UPDATE DR][SELECT DR SCAN][CAPTURE DR][SHUFT DR]の 順に遷移させる為に3回、計4回です。 1回の仮想OCMポートへのアクセスで、15.8msec間通信が中断、256バイトの読出しで 合計15.8msec×4×256=16.2秒間通信が中断します。 この間は、Windows OSやUSB仮想COMポートドライバーなどのシステムプログラムが 実行されるものと思われます。 一方、TCKの周期は50μsecで1バイトの読出しに11クロック、256バイトで0.14秒は 先の中断時間に対して極めて短時間です。 ROM読出し時間の短縮には、仮想COMポートへのアクセス回数を少なくする必要があ ります。 2009.01.05(月) 1ページ分のフラッシュROMを読出しました。 読出し時間は約18秒。 手順 1) プログラミング開始処理。 (2009.01.03を参照) 2) [SHIFT DR]へ遷移 3) フラッシュ読出し移行を指示。 0x2302、15biys。 4) [SHIFT DR]へ戻す 5) アドレス上位バイト指定。 0x0700、15bits。 6) [SHIFT DR]へ戻す 7) アドレス下位バイト指定。 0x0300、15bits。 8) [SHIFT IR]へ遷移 9) PROG_PAGEREAD命令を発行 10) [SHIFT DR]へ戻す 11) 8ビットリードし1バイトのパラレルデータに変換 12) [UPDATE DR]から[SELECT DR SCAN]に戻し、[SHIFT DR]へ遷移 13) 11)に戻して繰り返し。256バイト受信するまで。 14) ROMデータ256バイト表示 15) [RUN TEST/IDLE]へ遷移 16) プログラミング終了処理。 (2009.01.03を参照) 2009.01.04(日) LOCK BITの読出しを追加しました。 手順 1) プログラムモード開始処理。 (2009.01.03を参照) 2) [SHIFT DR]へ遷移 3) ヒューズ/ロックビット読み出し移行を指示。0x2304、15bits。 4) [SHIFT DR]へ戻す 5) ロックビット読み出し指示(1)。0x3600、15bits。 6) [SHIFT DR]へ戻す 7) ロックビット読み出し指示(2)。0x3700、15bits。 8) 受信したシリアルデータを1バイトパラレルデータに組み立て 9) [RUN TEST/IDLE]へ遷移 10) LOCK BITを表示 11) プログラミングモード終了処理。 (2009.01.03を参照) 2009.01.03(土) FUSE BIT読み出し。 FF 99 62 は初期値です。 JTAG制御手順 プログラムモード開始処理 1) [TEST LOGIC RESET]へ遷移 2) [RUN TEST/IDLE]へ遷移 3) [SHIFT IR]へ遷移 4) RESET命令発行。4bits 5) [RUN TEST/IDLE]へ遷移 6) [SHIFT DR]へ遷移 7) RESETレジスタに1を設定。1bit 8) [RUN TEST/IDLE]へ遷移 9) [SHIFT IR]へ遷移 10) PROG_ENABLE命令を発行。4bits 11) [RUN TEST/IDLE]へ遷移 12) [SHIFT DR]へ遷移 13) PROG_ENABLE識別コード送信。0xA370、16bits。 14) [RUN TEST/IDLE]へ遷移 15) [SHIFT IR]へ遷移 16) PROG_COMMANDS命令発行。4bits 17) [RUN TEST/IDLE]へ遷移 18) [SHIFT DR]へ遷移 ヒューズビット読み出し処理 19) ヒューズ/ロックビット読み出しへ移行を指示。0x2304、15bits。 20) [SHIFT DR]へ戻す 21) ヒューズ拡張読み出し指示(1)。0x3A00、15bits。 22) [SHIFT DR]へ戻す 23) ヒューズ拡張読み出し指示(2)。0x3B00、15bits。 24) 受信したシリアルデータを1バイトパラレルデータに組み立て→fuse_ext。 25) [SHIFT DR]へ戻す 26) ヒューズ上位読み出し指示(1)。0x3E00、15bits。 27) [SHIFT DR]へ戻す 28) ヒューズ上位読み出し指示(2)。0x3F00、15bits。 29) 受信したシリアルデータを1バイトパラレルデータに組み立て→fuse_high。 30) [SHIFT DR]へ戻す 31) ヒューズ下位読み出し指示(1)。0x3200、15bits。 32) [SHIFT DR]へ戻す 33) ヒューズ下位読み出し指示(2)。0x3300、15bits。 34) 受信したシリアルデータを1バイトパラレルデータに組み立て→fuse_low。 データ表示 35) FUSE BIT 拡張、上位、下位を表示 プログラムモード終了処理 36) [RUN TEST/IDLE]へ遷移 37) [SHIFT IR]へ遷移 38) PROG_COMMANDS命令発行。4bits 39) [RUN TEST/IDLE]へ遷移 40) [SHIFT DR]へ遷移 41) 全てのプログラミング命令の禁止を指示(1)。0x2300、15bits。 42) [SHIFT DR]へ戻す 43) 全てのプログラミング命令の禁止を指示(2)。0x3300、15bits。 44) [RUN TEST/IDLE]へ遷移 45) [SHIFT IR]へ遷移 46) PROG_ENABLE命令を発行。4bits 47) [RUN TEST/IDLE]へ遷移 48) [SHIFT DR]へ遷移 49) PROG_ENABLE識別コード送信。0x0000、16bits。 50) [RUN TEST/IDLE]へ遷移 51) [SHIFT IR]へ遷移 52) RESET命令発行。4bits 53) [RUN TEST/IDLE]へ遷移 54) [SHIFT DR]へ遷移 55) RESETレジスタに0を設定。1bit 56) [RUN TEST/IDLE]へ遷移 "[SHIFT IR]へ戻す"と"[SHIFT DR]へ戻す"は[RUN TEST/IDLE]経由で戻しました。 拡張ヒューズビットからロックビットまでを順次読み出すタイプの指示の場合は、 ヒューズビット読み出し処理中の 23) 28) 33) のステップを省略できます。 2009.01.02(金) デバイスID取得(2)。 IDCODE命令を使用せず、[TEST LOGIC RESET]から[SHIFT DR]へ遷移し、デバイスID コード(32ビット)を読込みました。 T E S S T R E U L L N E O / C C G T T A I E P S S S S S SE C S D T H H H H H HX T R U I I I I I II R R F F F F F FT E I S E T T T T T T1 S D C E L A D D D D D D DD T E N R R R R R R RR │ | | | | ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 1 2 3 31 32 ─┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ ┌┐┌─── TCK └┘└┘└┘└┘└┘└┘└┘└ ─ ─ ─ ┘└┘ ─┐ ┌─┐ ┌─── TMS └─┘ └────────── ─ ─ ─ ──┘ ┌─┐ TDI ─┘ └──────────── ─ ─ ─ ────── ─────────┬────── ─ ─ ─ ───┬── TDO └────── ─ ─ ─ ───┘ │←────────────→│ LSB デバイスIDコード MSB 電源投入時と[TEST LOGIG RESET]でデータレジスタ(DR)にデバイスIDコードが設定 されます。 2009.01.01(木) IDコードの読込みに成功しました。 製造者ID=0x01F 部品番号=0x960A (ATmega644Pの値) バージョン=0x0 [SHIFT IR]でIDCODE命令を発行し、[SHIFT DR]でIDコード(32ビット)を読込みまし た。 ATmega644Pとの接続 ATtiny2313 ATmega644P ┌────┐12 24┌───────┐10 │(PB0)TCK├→────┤TCK(PC2) VCC├──●── +5V │ │13 25│ │30 │ │(PB1)TMS├→────┤TMS(PC3) AVCC├──┘ │ │14 27│ │9 │(PB2)TDI├→────┤TDI(PC5) RESET├──┐ │ │15 26│ │11 │ │(PB3)TDO├←────┤TDO(PC4) GND├──●── GND └────┘ └───────┘ 2008.12.31(水) JTAG出力テスト ATtiny2313 ┌────┐12 │(PB0)TCK├→──── │ │13 │(PB1)TMS├→──── │ │14 │(PB2)TDI├→────┐ │ │15 │ │(PB3)TDO├←────┘ └────┘ 動作テストの為にTDIをTODにループバックしています。 出力波形 横軸:50μS/DIV。縦軸:2V/DIV。上:TCK。 下:TDI。 TCKを8ビット出力。TDIに0xA5をLSBから出力しました。 Windows GUI。 TDIをTDOにループバックし、受信したシリアルデータを1バイトに組み立ててリスト ボックスに表示しました。 GUIプログラム抜粋 2008.12.30(火) RS-232C I/F FT232RL ATtiny2313 ┌────┐ 1M BAUD 2┌────┐ │ TXD├──→───┤RXD(PD0)│ │ │ 3│ │ │ RXD├──←───┤TXD(PD1)│ │ │ 4│ │ │ CTS├──←───┤TXE(PA1)│ └────┘ └────┘ ATtiny2313のSRAMを受信用リングバッファとして使用します。容量は100バイトです 。 SRAMの残り28バイトはスタック用です。 受信用リングバッファーの書き込みポインターにXレジスターを、読み出しポインタ ーにYレジスターを、リングバッファ残量カウント用に汎用レジスタを使用します。 リングバッファへの書き込みオーバラン防止用にTXE(送信許可)でFT232のCTSを制御 します。 2008.12.29(月) ブロックダイアグラム ┌─────┐ │ PC │USB ┌────┐RS-232C ┌─────┐JTAG┌─────┐ │ VC# App ├←→┤FT232RL ├←──→┤ATtiny2313├←→┤ATmega644 │ └─────┘ └────┘ └─────┘ └─────┘ PC:VC#でGUIアプリケーションを作成。仮想COMポートを使ってデータの送受信。 FT232RL:USBとRS-232Cを変換し、PCとATtiny2313とのデータ通信の仲介。 ATtiny2313:PCのリモート端末として機能し、JTAGデバイスと信号授受。 ATmega644:JTAGのターゲットデバイス。 ATtiny2313はPCからの指示で、ポートのビット毎の入出力方向設定、8ビットパラレ ルデータの入出力、1ビットデータの出力などを実行します。 例: PCから 1) PB_DDRコマンドを受け取ると、次のデータをDDRBレジスタにセットします。 2) PB_OUTコマンドを受け取ると、次のデータをPORTBに出力します。 3) PB_INコマンドを受け取ると、PINBで取り込んだデータをPCへ送信します。 2008.12.28(日) デバイスID取得(2)。 TAPの[TEST LOGIC RESET]でJTAGの命令レジスタにデバイスIDコードが格納され、 [SHIFT DR]でその値を読み出す事が出来ます。 *2009.01.01(木) [SHIFT ID]からの読み出しを[SHIFT DR]で訂正。 TMSに0,1,1,0,0を送り[SHIFT IR]遷移し、TMS=0で2回目以降の[SHIFT IR]の繰り返 しループでデバイスIDコード(32bits)をTDOから読み取ります。 32ビット目はTMS=1にしてIDコード読み出しと同時に[EXIT1 IR]に遷移します。 以後[EXIT1 IR]→[PAUSE IR]→[EXIT2 IR]→[UPDATE IR]→[RUN TEST/IDLE]と遷移 させます。 2009.01.01(木) [SHIFT IR]でのIDコード読み取りから[SHIFT DR]での読み取りに 修正。 T E S S T R E U L L N E O / C C G T T A I E P S S S S S SE C S D T H H H H H HX T R U I I I I I II R R F F F F F FT E I S E T T T T T T1 S D C E L A D D D D D D DD T E N R R R R R R RR │ | | | | ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 1 2 3 31 32 ─┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ ┌┐┌─── TCK └┘└┘└┘└┘└┘└┘└┘└ ─ ─ ─ ┘└┘ ─┐ ┌─┐ ┌─── TMS └─┘ └────────── ─ ─ ─ ──┘ ┌─┐ TDI ─┘ └──────────── ─ ─ ─ ────── ─────────┬────── ─ ─ ─ ───┬── TDO └────── ─ ─ ─ ───┘ │←────────────→│ LSB デバイスIDコード MSB この方法はATmega644のデータシートに無く、実験で確かめたいと思います。 *2009.01.01(木) データシートには、電源投入後のJTAGデータレジスタの規定値 がIDコードであるとの記述がありました。 2008.12.27(土) TAP(Test Access Port)コントローラー 1) 流れ線の横の数値(0 or 1)は、TMS(モード選択ビット)の値です。 2) TMSは、TCKの立上りで取り込まれます。 3) どのモードにあっても、TMS=1を5回以上送ると[TEST LOGIC RESET]になります。 ↓ ↓ ↓ ↓ ↓ ─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌───────── TCK └─┘ └─┘ └─┘ └─┘ └─┘ ┌───────────────────┐ TMS ─┘ └─────── ---------------------------------------[TEST LOGIC RESET]- TAPの状態遷移図 ┌─┐ 1↑┌┴───────┐ └┤TEST LOGIC RESET├←────────────────────┐ └───┬────┘ │ ↓0 │ ┌─┐ │ │ 0↑┌┴──┴────┐1 ┌───────┐1 ┌───────┐↑1 └┤RUN TEST/IDLE ├→┤SELECT DR SCAN├→─┤SELECT IR SCAN├┘ └───┬────┘ └┬─┬────┘ └──┬────┘ ↑ ┌───→┘ ↓0 ↓0 │ │ ┌──┴──┐1 ┌──┴──┐1 │ │ │CAPTURE DR├┐ │CAPTURE IR├┐ │ │ └──┬──┘↓ └──┬──┘↓ │ │ ┌─┐ ↓0 │ ┌─┐ ↓0 │ │ │ 0↑┌┴─┴──┐│ 0↑┌┴─┴──┐│ │ │ └┤SHIFT DR ├│┐ └┤SHIFT IR ├│┐ │ │ └──┬──┘│↑ └──┬──┘│↑ │ │ ↓1 ┌←┘│ ↓1 ┌←┘│ │ │ ┌──┴─┴┐1 │ ┌──┴─┴┐1 │ │ │ │EXIT1 DR ├┐│ │EXIT1 IR ├┐│ │ │ └──┬──┘↓│ └──┬──┘↓│ │ │ ┌─┐ ↓0 ││ ┌─┐ ↓0 ││ │ │ 0↑┌┴─┴──┐││ 0↑┌┴─┴──┐││ │ │ └┤PAUSE DR │││ └┤PAUSE IR │││ │ │ └──┬──┘││ └──┬──┘││ │ │ ↓1 ││ ↓1 ││ │ │ ┌──┴──┐│↑0 ┌──┴──┐│↑0 │ │ │EXIT2 DR ├─┘ │EXIT2 IR ├─┘ │ │ └──┬──┘│ └──┬──┘│ │ │ ↓1 ┌←┘ ↓1 ┌←┘ │ │ ┌──┴─┴┐ ┌──┴─┴┐ │ │ │UPDATE DR │ │UPDATE IR │ │ │ └─┬─┬─┘ └─┬─┬─┘ │ │ 1↓ 0│ 1↓ 0│ │ └─────┴──────────┘ │ │ ↓ ↓ └──────────┴──────────┘ ATmega644のデバイスID取得(1) 1) [TEST LOGIC RESET]からTMSに0,1,1,0,0を順に送ると、[SHIFT IR]になります。 [RUN TEST/IDLE]からはTMSに1,1,0,0を順に送ります。 2) [SHIFT IR]でTMS=0のままIDCODE命令をLSBから順にTDIに送ります。 ATmega644の命令は4ビット幅で、IDCODE=$1です。 1 2 3 4 5 ───┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌──── TCK └─┘ └─┘ └─┘ └─┘ └─┘ ┌────── TMS ───────────────────┘ ┌───┐ TDI ───────┘ └────────────── ------[SHIFT IR]---------------------------[EXIT1]-- [SHIFT IR]に入って2個目のTCKからTDIを送ります。 TDIの最後の1ビットでTMS=1にして命令の転送を完了し[EXIT1]に遷移します。 3) TMSに0,1,1,1を順に送ると[SELECT DR SCAN]になり、さらにTMSに0,0を送ると [SHIFT DR]になります。 4) TMS=0で1個のTCKを送ります。 5) TMS=0で31個のTCKを送ると、ATmega644のデバイスコードがLSBから順にTDOに 出力されます。 6) TCKの32個目でTMS=1にすると、ATmega644のデバイスコードのMSBがTODに出力さ れると同時に[EXIT1 DR]に遷移します。 ATmega644のJTAG ID MSB LSB 31 28 27 12 11 1 0 ┌─────┬────┬────┬─┐ │バージョン│部品番号│製造者ID│1 │ └─────┴────┴────┴─┘ 4bits 16bits 11bits 1bit 部品番号=$9609 製造者ID=$01F 6) TMSに0,1,1,0を送ると[RUN TEST/IDLE]モードに遷移します。 2008.12.26(金) ATmega644のデバイスIDを読出す事からJTAGに入門します。 制御線 名称 I/O 用途 備考 ------+-----+------------+--------------------------------------- TCK I クロック Test Clock TMS I モード選択 Test Mode Select TDI I データ入力 Test Data Input TDO O データ出力 Test Data Output TRST I リセット Test Reset(option)。ATmega644は未対応。 *I/OはATmega644の信号の方向。

JTAGの実験のTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。

[PR]今流行りの携帯ゲームは?:完全無料でずっと遊び放題だよ