實現(xiàn)MAXQ2000微控制器的JTAG加載主機
作為一個例子,在表4中,JTAG主機將數(shù)值100b (系統(tǒng)編程模式)移入到IR寄存器中。IR寄存器開始設(shè)置旁路值011b;TAP控制器最初為Run-Test-Idle狀態(tài)。如下面的圖4所示,比特以最低有效位在前、最高有效位在后移入(移出)TAP控制器。因此,在第一個移位周期,新數(shù)值的第0位被移入,舊數(shù)值的第0位被移出。
表4. 指令寄存器移位實例
TCK | TMS | TDI | TDO | TAP State | Shift Register | Instruction Register | ||||
bit 2 | bit 1 | bit 0 | bit 2 | bit 1 | bit 0 | |||||
0 | 1 | x | x | Run-Test-Idle | x | x | x | 0 | 1 | 1 |
1 | 1 | x | x | Select-DR-Scan | x | x | x | 0 | 1 | 1 |
0 | 1 | x | x | Select-DR-Scan | x | x | x | 0 | 1 | 1 |
1 | 1 | x | x | Select-IR-Scan | x | x | x | 0 | 1 | 1 |
0 | 0 | x | x | Select-IR-Scan | x | x | x | 0 | 1 | 1 |
1 | 0 | x | x | Capture-IR | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | x | x | Capture-IR | 0 | 0 | 1 | 0 | 1 | 1 |
1 | 0 | x | x | Shift-IR | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | x | Shift-IR | 0 | 0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | x | Shift-IR | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 1 | Shift-IR | 0 | 0 | 0 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | Shift-IR | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | Shift-IR | 0 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | Exit1-IR | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | x | 0 | Exit1-IR | 1 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | x | 0 | Update-IR | 1 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | x | x | Update-IR | 1 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | x | x | Run-Test-Idle | x | x | x | 1 | 0 | 0 |
下面是執(zhí)行這一操作的例程shiftIR3。
;==============================================================================;=;= shiftIR3;= clock0, clock1, shift;=;= Shifts a 3-bit value into the IR register.;=;= Inputs : A[0] - Low three bits contain value to shift into IR;= Outputs : None;= Destroys : AP, APC, A[0], PSW, LC[0];=shiftIR3:move APC, #80h ; Acc => A[0], turn off auto inc/deccall clock1 ; (Select DR Scan)call clock1 ; (Select IR Scan)call clock0 ; (Capture IR - loads 001b to shift register)call clock0 ; (Shift IR)move TMS, #0 ; Drive TMS low move C, TDO ; xxxxx210 c = srrc ; sxxxxx21 c = 0call shift ; Shift in IR bit 0rrc ; ssxxxxx2 c = 1call shift ; Shift in IR bit 1rrc ; sssxxxxx c = 2move TMS, #1 ; Drive TMS high for last bitcall shift ; Shift in IR bit 2 (Exit1 IR)call clock1 ; (Update IR)call clock0 ; (Run Test Idle)ret
寫入TAP數(shù)據(jù)寄存器
數(shù)值移入或者移出TAP控制器DR的操作與裝入/卸載IR的方式相似。通常,只有當(dāng)IR被設(shè)置為兩個數(shù)值之一時才能進行這一操作:100b (使TAP控制器進入系統(tǒng)編程模式)或者010b (使TAP控制器進入調(diào)試模式)。激活系統(tǒng)編程模式后,裝入和卸載DR寄存器的操作如下。
- DR寄存器移入和移出寬度為3比特。所有三個比特都代表有效數(shù)據(jù)。
- 當(dāng)?shù)竭_Update-DR狀態(tài)時,送入DR寄存器的數(shù)值被復(fù)制到從機微控制器的內(nèi)部系統(tǒng)編程寄存器中。這三個比特的用法如下。
- 從機微控制器可訪問第0位(讀/寫),它作為寄存器位ICDF.1 (SPE),也被稱為系統(tǒng)編程使能位。復(fù)位后,程序ROM檢查該位,確定應(yīng)進入啟動加載程序模式(SPE = 1)還是正常程序執(zhí)行模式(SPE = 0)。
- 從機微控制器可訪問第1位和第2位(讀/寫),它作為寄存器位ICDF.2-3 (PSS0-PSS1),也被稱為編程源選擇位。對于能夠為啟動加載程序提供多個接口的微控制器,例如MAXQ2000,這些位用于當(dāng)SPE = 1時應(yīng)選擇哪一啟動加載程序接口。當(dāng)SPE = 0 (正常程序執(zhí)行模式)時,這些位的設(shè)置不起作用。
- DR寄存器傳送出去的數(shù)值是系統(tǒng)編程寄存器以前的數(shù)值(當(dāng)進入Capture-DR狀態(tài)后,鎖存到移位寄存器中)。
- DR寄存器移入和移出寬度為10比特。對于移出數(shù)據(jù),所有10個比特都代表有效數(shù)據(jù)(8個數(shù)據(jù)位和2個狀態(tài)位)。對于移入數(shù)據(jù),只使用了8個數(shù)據(jù)位;沒有使用兩個狀態(tài)位。
- 然后,將移入DR寄存器的高8位卸載,作為啟動加載程序命令的一部分,被啟動加載程序(從程序ROM中運行)讀取。
- 移出DR寄存器的10個比特含有8位由啟動加載程序裝入的數(shù)值(作為命令輸出的一部分),以及由TAP控制器設(shè)置的兩個狀態(tài)信息位。
;==============================================================================;=;= shiftDR3;=;= Shifts a 3-bit value into the DR register. This operation should only be;= performed when IR =100b (System Programming Mode).;=;= Inputs : A[0] - Low 3 bits contain value to shift into SPB (PSS1:PSS0:SPE);= Outputs : None;= Destroys : AP, APC, A[0], PSW, LC[0]shiftDR3:move APC, #80h ; Acc => A[0], turn off auto inc/deccall clock1 ; (Select DR Scan)call clock0 ; (Capture DR)call clock0 ; (Shift DR)move TMS, #0 ; Drive TMS low move C, TDO ; xxxxx210 c = srrc ; sxxxxx21 c = 0call shift ; Shift in DR bit 0rrc ; ssxxxxx2 c = 1call shift ; Shift in DR bit 1rrc ; sssxxxxx c = 2move TMS, #1 ; Drive TMS high for last bitcall shift ; Shift in DR bit 2 (Exit1 DR)call clock1 ; (Update DR)call clock0 ; (Run Test Idle)ret;==============================================================================;=;= shiftDR;= clock0, clock1, shift;=;= Shifts a 10-bit value into and out of the DR register. This operation ;= should only be performed when IR = 010b (Debug/Loader Mode).;=;= Inputs : A[0] - Byte value (input) to shift into DR;= Outputs : A[0] - Byte value (output) shifted out of DR;= A[1] - Low two bits are status bits 1:0 shifted out of DR;= A[15] - Byte value shifted in, cached for use by shiftDR_next;= Destroys : AP, APC, PSW, LC[0]shiftDR:move APC, #80h ; Acc => A[0], turn off auto inc/decmove A[15], A[0] ; Cache input byte value for use by shiftDR_nextsla2 ; Add two empty bits (for status)call clock1 ; (Select DR Scan)call clock0 ; (Capture DR)call clock0 ; (Shift DR)move TMS, #0 ; Drive TMS low move C, TDO ; xxxxxxxx76543210 c = s
評論