<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > 實(shí)現MAXQ2000微控制器的JTAG加載主機

實(shí)現MAXQ2000微控制器的JTAG加載主機

作者: 時(shí)間:2012-03-19 來(lái)源:網(wǎng)絡(luò ) 收藏
示。TAP狀態(tài)機中有16個(gè)分立狀態(tài)。根據TMS信號值,在TCK的上升沿從一個(gè)狀態(tài)向下一個(gè)狀態(tài)轉變。例如,如果TAP控制器處于Select-DR-Scan狀態(tài),TCK出現了上升沿:
  • 如果TMS = 1,TAP控制器將轉換到Select-IR-Scan狀態(tài)。
  • 如果TMS = 0,TAP控制器將轉換到Capture-DR狀態(tài)。
通過(guò)這種方式,TAP控制器能夠同步到任何需要的狀態(tài)。對狀態(tài)圖(圖2)需要注意兩點(diǎn):
  • 5個(gè)'1'轉換(保持TMS高電平,同步TCK 5個(gè)周期)總是使狀態(tài)機回到Test-Logic-Reset,而不論起始狀態(tài)如何。這表明,如果不確定TAP控制器當前的狀態(tài),或者在某些情況下主機和從機間的通信中斷,總是可以通過(guò)同步5個(gè)'1'轉換,使TAP控制器回到已知狀態(tài)。
  • 即使TCK時(shí)鐘繼續運行,也可以暫停通信,不確定地保持在Run-Test-Idle、Pause-DR或者Pause-IR狀態(tài),而不影響TAP控制器的狀態(tài)。
實(shí)現MAXQ2000微控制器的JTAG加載主機
圖2. 測試訪(fǎng)問(wèn)端口(TAP)狀態(tài)機

TAP控制器的狀態(tài)機提供對兩個(gè)控制寄存器的訪(fǎng)問(wèn),而寄存器提供啟動(dòng)加載程序接口、調試接口以及其他功能。
  • IR (指令寄存器)寬度總是3位。該寄存器可以用作指數寄存器,控制DR的功能(參見(jiàn)下面)。
  • DR (數據寄存器)是TAP控制器中幾個(gè)寄存器的訪(fǎng)問(wèn)點(diǎn)。當比特移入或者移出DR時(shí)實(shí)際訪(fǎng)問(wèn)的寄存器取決于IR當前值。
實(shí)現MAXQ2000微控制器的JTAG加載主機
圖3. TAP控制器中的寄存器訪(fǎng)問(wèn)

如圖3所示,DR根據IR值而指向三個(gè)內部寄存器之一。
  • 如果IR = 011b,TAP控制器處于Bypass模式。在這一模式下(這是TAP控制器的默認模式),通過(guò)TDO,移入到DR (通過(guò)TDI)的數據被直接移回送出。通過(guò)TAP控制器移動(dòng)數據并沒(méi)有改變內部寄存器。
  • 設置IR = 100b,使TAP控制器處于System Programming模式。在這種模式下,移入DR中的數據被移入到3位系統編程寄存器中。該寄存器(也可以通過(guò)MAXQICDF寄存器的[3:1]位進(jìn)行訪(fǎng)問(wèn))控制MAXQ復位后進(jìn)入正常程序執行模式還是啟動(dòng)加載程序模式。如果使能啟動(dòng)加載程序模式,它還控制啟動(dòng)加載程序使用哪一接口(、串口或者SPI)。
  • 設置IR = 010b,使TAP控制器進(jìn)入Debug模式。在這一模式下,移入DR的數據被移入到內部10位調試寄存器中,可以被啟動(dòng)加載程序讀取。啟動(dòng)加載程序輸出的數據也通過(guò)該寄存器,在TDO上被移回送出(以及兩個(gè)狀態(tài)位)。該寄存器被用于啟動(dòng)加載程序模式和在線(xiàn)調試模式時(shí)的數據傳送。
在上面討論的三種模式中,Bypass模式是"非工作"模式;它并不使用我們感興趣的啟動(dòng)加載程序功能。System Programming模式雖然有這樣的名稱(chēng),但實(shí)際上并不用于啟動(dòng)加載程序的通信,只是使能對它的訪(fǎng)問(wèn)。一旦激活啟動(dòng)加載程序,開(kāi)始進(jìn)行通信,不再使用TAP模式。Debug模式可以訪(fǎng)問(wèn)10位輸入/輸出寄存器,用于實(shí)現啟動(dòng)加載程序的所有通信功能。一旦使能了啟動(dòng)加載程序,在加載部分完成之前,只使用這一TAP控制器模式。

控制JTAG端口和復位線(xiàn)

從機 (TMS, TCK, TDO和TDI) JTAG/TAP端口的四條線(xiàn)以及nRESET線(xiàn)分別連接至主機的一個(gè)端口引腳??刂艼TAG接口的第一步是正確配置這些線(xiàn)。
#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線(xiàn)工作在標準驅動(dòng)模式下。從主機角度看,TMS、TCK和TDI總是被驅動(dòng)為輸出,而TDO (由從機驅動(dòng))總是為輸入。JTAG線(xiàn)的方向固定,不是雙向的。nRESET線(xiàn)是特殊情況,被配置為主機側開(kāi)漏輸出。通常,從機將自己的nRESET線(xiàn)拉至高電平,因此,主機只能將該線(xiàn)拉低(復位從機時(shí)),或者完全釋放它(在其他所有時(shí)間)。主機不應將從機的nRESET線(xiàn)驅動(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線(xiàn)上的靜態(tài)0和1,使TAP控制器從一個(gè)狀態(tài)轉換到另一狀態(tài)。只要JTAG時(shí)鐘速率保持低于從機系統時(shí)鐘速率1/8的最大值,JTAG時(shí)鐘可以采用任何頻率。這里不需要考慮主機的系統時(shí)鐘速率;它不需要和從機系統時(shí)鐘速率相匹配。主機可以比從機運行的快或者慢,而不會(huì )導致出現JTAG通信問(wèn)題。

由于這一例子中的從機安裝了8MHz時(shí)鐘晶振,主機能夠驅動(dòng)JTAG時(shí)鐘達到1MHz,而不會(huì )出現問(wèn)題。對于這個(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),正如其名稱(chēng)的含義,它對TAP邏輯進(jìn)行徹底復位,包括確定啟動(dòng)加載程序是否使能以及啟動(dòng)加載程序使用哪一接口位(SPE和PSS[1:0])。因此,一旦進(jìn)入啟動(dòng)加載程序模式,設置TAP控制器為T(mén)est-Logic-Reset,對器件進(jìn)行復位,退出啟動(dòng)加載程序模式。演示應用程序中使用的JTAG例程(除了testLogicReset本身之外)都假定TAP控制器在例程啟動(dòng)時(shí)處于Run-Test-Idle狀態(tài)。在JTAG通信期間,TAP控制器在不同狀態(tài)間轉換;例程最后,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

寫(xiě)入TAP指令寄存器

TAP狀態(tài)機向下轉換到Shift-IR狀態(tài),同步輸入一個(gè)新的3位數值,將數值裝入TAP控制器的IR。在進(jìn)入Update-IR狀態(tài)之前,該數值并沒(méi)有實(shí)際從移位寄存器復制到指令寄存器中。

對于所有的JTAG移位寄存器操作,隨著(zhù)新數值的移入,寄存器的當前內容被移出(由TDO)。但是,移出的數值總是固定的(001b);這是由JTAG標準在測試JTAG接口功能時(shí)決定的。

比特移入和移出移位寄存器的過(guò)程(IR或者DR)是一樣的;TAP狀態(tài)機必須分別處于Shift-IR或者Shift-DR狀態(tài),TAP控制器在每個(gè)TCK周期的上升沿對輸入比特(在TDI)進(jìn)行采樣,而在TCK周期下降沿驅動(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
對于傳送的每一位,除了最后一位之外,TMS必須保持低電平。這非常重要,因為當每一位移入和


關(guān)鍵詞: MAXQ2000 微控制器 JTAG

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>