實(shí)現(xiàn)MAXQ2000微控制器的JTAG加載主機(jī)
- 如果TMS = 1,TAP控制器將轉(zhuǎn)換到Select-IR-Scan狀態(tài)。
- 如果TMS = 0,TAP控制器將轉(zhuǎn)換到Capture-DR狀態(tài)。
- 5個(gè)'1'轉(zhuǎn)換(保持TMS高電平,同步TCK 5個(gè)周期)總是使?fàn)顟B(tài)機(jī)回到Test-Logic-Reset,而不論起始狀態(tài)如何。這表明,如果不確定TAP控制器當(dāng)前的狀態(tài),或者在某些情況下JTAG主機(jī)和從機(jī)間的通信中斷,總是可以通過(guò)同步5個(gè)'1'轉(zhuǎn)換,使TAP控制器回到已知狀態(tài)。
- 即使TCK時(shí)鐘繼續(xù)運(yùn)行,也可以暫停JTAG通信,不確定地保持在Run-Test-Idle、Pause-DR或者Pause-IR狀態(tài),而不影響TAP控制器的狀態(tài)。
圖2. 測(cè)試訪問(wèn)端口(TAP)狀態(tài)機(jī)
TAP控制器的狀態(tài)機(jī)提供對(duì)兩個(gè)控制寄存器的訪問(wèn),而寄存器提供啟動(dòng)加載程序接口、調(diào)試接口以及其他功能。
- IR (指令寄存器)寬度總是3位。該寄存器可以用作指數(shù)寄存器,控制DR的功能(參見下面)。
- DR (數(shù)據(jù)寄存器)是TAP控制器中幾個(gè)寄存器的訪問(wèn)點(diǎn)。當(dāng)比特移入或者移出DR時(shí)實(shí)際訪問(wèn)的寄存器取決于IR當(dāng)前值。
圖3. TAP控制器中的寄存器訪問(wèn)
如圖3所示,DR根據(jù)IR值而指向三個(gè)內(nèi)部寄存器之一。
- 如果IR = 011b,TAP控制器處于Bypass模式。在這一模式下(這是TAP控制器的默認(rèn)模式),通過(guò)TDO,移入到DR (通過(guò)TDI)的數(shù)據(jù)被直接移回送出。通過(guò)TAP控制器移動(dòng)數(shù)據(jù)并沒(méi)有改變內(nèi)部寄存器。
- 設(shè)置IR = 100b,使TAP控制器處于System Programming模式。在這種模式下,移入DR中的數(shù)據(jù)被移入到3位系統(tǒng)編程寄存器中。該寄存器(也可以通過(guò)MAXQ微控制器ICDF寄存器的[3:1]位進(jìn)行訪問(wèn))控制MAXQ復(fù)位后進(jìn)入正常程序執(zhí)行模式還是啟動(dòng)加載程序模式。如果使能啟動(dòng)加載程序模式,它還控制啟動(dòng)加載程序使用哪一接口(JTAG、串口或者SPI)。
- 設(shè)置IR = 010b,使TAP控制器進(jìn)入Debug模式。在這一模式下,移入DR的數(shù)據(jù)被移入到內(nèi)部10位調(diào)試寄存器中,可以被啟動(dòng)加載程序讀取。啟動(dòng)加載程序輸出的數(shù)據(jù)也通過(guò)該寄存器,在TDO上被移回送出(以及兩個(gè)狀態(tài)位)。該寄存器被用于啟動(dòng)加載程序模式和在線調(diào)試模式時(shí)的數(shù)據(jù)傳送。
控制JTAG端口和復(fù)位線
從機(jī)MAXQ2000 (TMS, TCK, TDO和TDI) JTAG/TAP端口的四條線以及nRESET線分別連接至主機(jī)MAXQ2000的一個(gè)端口引腳??刂艼TAG接口的第一步是正確配置這些線。#define TCK PO0.0 ; Test Clock - Master output#define TDO PI0.1 ; Test Data Out - Slave output, master input#define TMS PO0.2 ; Test Mode Sel - Master output#define TDI PO0.3 ; Test Data In - Master output#define RST PD0.4 ; Reset - Master open-drain output (on 1)四條JTAG線工作在標(biāo)準(zhǔn)驅(qū)動(dòng)模式下。從主機(jī)角度看,TMS、TCK和TDI總是被驅(qū)動(dòng)為輸出,而TDO (由從機(jī)驅(qū)動(dòng))總是為輸入。JTAG線的方向固定,不是雙向的。nRESET線是特殊情況,被配置為主機(jī)側(cè)開漏輸出。通常,從機(jī)將自己的nRESET線拉至高電平,因此,主機(jī)只能將該線拉低(復(fù)位從機(jī)時(shí)),或者完全釋放它(在其他所有時(shí)間)。主機(jī)不應(yīng)將從機(jī)的nRESET線驅(qū)動(dòng)為高電平。
;==============================================================================;=;= initializeJTAG;=;= Sets up the port pins for the JTAG interface.;=;= Inputs : None;= Outputs : None;= Destroys : None;=initializeJTAG:move PD0.0, #1 ; TCK - master outputmove PO0.0, #1 ; Drive highmove PD0.1, #0 ; TDO - master inputmove PO0.1, #1 ; Weak pullup onmove PD0.2, #1 ; TMS - master outputmove PO0.2, #1 ; Drive lowmove PD0.3, #1 ; TDI - master outputmove PO0.3, #1 ; Drive highmove PD0.4, #0 ; RST - open drain when 1, tristate when 0move PO0.4, #0 ; Weak pullup offret端口引腳初始化之后,采用例程clock0和clock1來(lái)同步TMS線上的靜態(tài)0和1,使TAP控制器從一個(gè)狀態(tài)轉(zhuǎn)換到另一狀態(tài)。只要JTAG時(shí)鐘速率保持低于從機(jī)微控制器系統(tǒng)時(shí)鐘速率1/8的最大值,JTAG時(shí)鐘可以采用任何頻率。這里不需要考慮主機(jī)的系統(tǒng)時(shí)鐘速率;它不需要和從機(jī)系統(tǒng)時(shí)鐘速率相匹配。主機(jī)可以比從機(jī)運(yùn)行的快或者慢,而不會(huì)導(dǎo)致出現(xiàn)JTAG通信問(wèn)題。
由于這一例子中的從機(jī)MAXQ2000安裝了8MHz時(shí)鐘晶振,主機(jī)能夠驅(qū)動(dòng)JTAG時(shí)鐘達(dá)到1MHz,而不會(huì)出現(xiàn)問(wèn)題。對(duì)于這個(gè)例子,100kHz JTAG時(shí)鐘足夠了。
#define JCLOCK 40 ; 100kHz : (((10us / (1/8MHz)) / 2);==============================================================================;=;= clock0;=;= Clocks a zero TMS bit into the JTAG interface.;=;= Inputs : None;= Outputs : None;= Destroys : LC[0]clock0:move TMS, #0 ; Drive TMS lowmove LC[0], #JCLOCKdjnz LC[0], $move TCK, #1 ; Clock rising edgemove LC[0], #JCLOCKdjnz LC[0], $move TCK, #0 ; Clock falling edgemove LC[0], #JCLOCKdjnz LC[0], $ret;==============================================================================;=;= clock1;=;= Clocks a one TMS bit into the JTAG interface.;=;= Inputs : None;= Outputs : None;= Destroys : LC[0]clock1:move TMS, #1 ; Drive TMS highmove LC[0], #JCLOCKdjnz LC[0], $move TCK, #1 ; Clock rising edgemove LC[0], #JCLOCKdjnz LC[0], $move TCK, #0 ; Clock falling edgemove LC[0], #JCLOCKdjnz LC[0], $ret利用這兩個(gè)例程,我們可以增加另一個(gè)例程來(lái)初始化TAP控制器,迫使它回到Test-Logic-Reset狀態(tài)。注意Test-Logic-Reset狀態(tài),正如其名稱的含義,它對(duì)TAP邏輯進(jìn)行徹底復(fù)位,包括確定啟動(dòng)加載程序是否使能以及啟動(dòng)加載程序使用哪一接口位(SPE和PSS[1:0])。因此,一旦進(jìn)入啟動(dòng)加載程序模式,設(shè)置TAP控制器為Test-Logic-Reset,對(duì)器件進(jìn)行復(fù)位,退出啟動(dòng)加載程序模式。演示應(yīng)用程序中使用的JTAG例程(除了testLogicReset本身之外)都假定TAP控制器在例程啟動(dòng)時(shí)處于Run-Test-Idle狀態(tài)。在JTAG通信期間,TAP控制器在不同狀態(tài)間轉(zhuǎn)換;例程最后,TAP控制器總是返回到Run-Test-Idle。
;==============================================================================;=;= testLogicReset;= clock0, clock1;=;= Resets the JTAG/TAP controller to its starting state.;=;= Inputs : None;= Outputs : None;= Destroys : LC[0];=testLogicReset:call clock1call clock1call clock1call clock1call clock1call clock1call clock1call clock0 ; Brings us to Run-Test-Idleret
寫入TAP指令寄存器
TAP狀態(tài)機(jī)向下轉(zhuǎn)換到Shift-IR狀態(tài),同步輸入一個(gè)新的3位數(shù)值,將數(shù)值裝入TAP控制器的IR。在進(jìn)入U(xiǎn)pdate-IR狀態(tài)之前,該數(shù)值并沒(méi)有實(shí)際從移位寄存器復(fù)制到指令寄存器中。對(duì)于所有的JTAG移位寄存器操作,隨著新數(shù)值的移入,寄存器的當(dāng)前內(nèi)容被移出(由TDO)。但是,移出的數(shù)值總是固定的(001b);這是由JTAG標(biāo)準(zhǔn)在測(cè)試JTAG接口功能時(shí)決定的。
比特移入和移出移位寄存器的過(guò)程(IR或者DR)是一樣的;TAP狀態(tài)機(jī)必須分別處于Shift-IR或者Shift-DR狀態(tài),TAP控制器在每個(gè)TCK周期的上升沿對(duì)輸入比特(在TDI)進(jìn)行采樣,而在TCK周期下降沿驅(qū)動(dòng)輸出比特(在TDO)。
;==============================================================================;=;= shift;=;= In a shift register state, clocks in a TDI bit and clocks out a TDO bit.;=;= Inputs : C - Bit to shift in to TDI.;= Outputs : C - Bit shifted out from TDO.;= Destroys : PSW, LC[0];=shift:jump C, shift_bit1shift_bit0:move TDI, #0 ; Shift in zero bitjump shift_bitEndshift_bit1:move TDI, #1 ; Shift in one bitjump shift_bitEndshift_bitEnd:move LC[0], #JCLOCKdjnz LC[0], $move TCK, #1 ; Rising edge, TDI is sampledmove LC[0], #JCLOCKdjnz LC[0], $move TCK, #0 ; Falling edge, TDO is driven outmove LC[0], #JCLOCKdjnz LC[0], $move C, TDO ; Latch TDO valueret對(duì)于傳送的每一位,除了最后一位之外,TMS必須保持低電平。這非常重要,因?yàn)楫?dāng)每一位移入和
評(píng)論