在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為MAXQ2000微控制器實現JTAG自舉加載程序主控

星星科技指導員 ? 來源:ADI ? 作者:ADI ? 2023-02-21 11:22 ? 次閱讀

MAXQ微控制器提供的JTAG引導加載程序允許外部JTAG主站使用一組標準化命令輕松識別和編程任何MAXQ微控制器。本應用筆記中包含的代碼可用作構建功能齊全的JTAG引導加載程序主應用程序的起點。主控應用可以識別、初始化、加載和驗證任何支持標準化引導加載程序命令集的MAXQ微控制器的代碼和數據存儲器內容。

概述

MAXQ微控制器包括可重寫的板載程序存儲器,通常包括一個基于ROM的引導加載程序,該引導加載程序存儲器可以使用微控制器的JTAG兼容調試端口加載。盡管JTAG引導加載程序提供的確切功能因設備而異,但它通常包括允許讀取、寫入、驗證和擦除程序和數據存儲器的命令。一些器件提供引導加載程序的替代接口(如串行端口或SPI?接口),但JTAG接口最常使用有兩個原因。首先,JTAG接口必須已經存在,以支持在線調試功能。其次,JTAG接口通常不被最終用戶應用程序使用(與串行端口不同)。加載程序代碼后,可以使用可選的密碼機制來限制對引導加載程序或在線調試功能的訪問。有關每個MAXQ器件所支持功能的詳細信息,請參閱產品特定信息,包括數據資料和用戶指南。

本應用筆記介紹了為MAXQ2000實現JTAG引導加載程序主機所需的基本步驟。這些步驟包括與JTAG端口接口,與測試訪問端口(TAP)控制器通信,激活引導加載程序模式以及向基于ROM的引導加載程序發送命令。由于JTAG端口在所有MAXQ器件上工作原理相同,并且MAXQ自舉加載程序使用共享命令集,因此本應用筆記中介紹的大部分主題(以及大多數示例代碼)將適用于為任何MAXQ微控制器實現JTAG引導加載程序主機。

除串行端口外,MAXQ2000沒有特殊功能用于此實現。這意味著本文給出的示例代碼可以很容易地重新定位,以運行在任何具有足夠程序存儲器的MAXQ20器件上。代碼是用MAXQ匯編編寫的,并使用MAX-IDE開發環境進行編譯。該代碼可供下載

硬件設置

本應用筆記的示例代碼是利用一對MAXQ2000評估(EV)板開發的。需要兩個MAXQ2000評估板來執行本文所述的軟件。一個MAXQ2000(JTAG主站)運行示例代碼;第二個MAXQ2000作為JTAG從站,由主站重新編程。兩個MAXQ8微控制器均采用標準00.2000MHz晶體。

主用MAXQ2000評估板經過修改,在原型設計區安裝一個2 x 5 引腳接頭,提供JTAG電纜連接的主端。接頭上的引腳遵循標準的MAXQ JTAG接頭布局,如表1所示進行連接。

JTAG針座引腳 JTAG電纜功能 MAXQ2000 JTAG
主連接
MAXQ2000 JTAG
從機連接
1 TCK (測試時鐘) P0.0 (輸出) P4.0 (輸入)
2 接地 接地 接地
3 TDO(測試數據輸出) P0.1 (輸入) P4.3 (輸出)
4 V裁判
5 TMS(測試模式選擇) P0.2 (輸出) P4.2 (輸入)
6 n重置 P0.4 (開漏) n復位 (輸入)
7 鍵控銷
8 +5V
9 TDI (測試數據輸入) P0.3 (輸出) P4.1 (輸入)
10 接地 接地 接地

從MAXQ2000評估板無需修改。如上所述,2 x 5 JTAG接頭安裝并連接在主MAXQ2000評估板的原型設計區域。然后連接兩個評估板;在主評估板原型區域的2 x 5 JTAG接頭和從評估板上的標準JTAG接頭(J2)之間連接了標準的5 x 4 JTAG電纜(通常用于將串行轉JTAG板連接到MAXQ評估板的JTAG類型)。該JTAG 2 x 5連接器包含在MAXQ2000評估板中。

為簡化起見,沒有嘗試通過JTAG電纜將電源或基準電壓從主評估板連接到從評估板。相反,兩個評估板設置為以相同的V工作。迪奧電壓(約3.6V)。這種設置確保MAXQ2000的主從器件在公共I/O軌電平下工作。

從評估板還將LCD子板(MAXQ2000-K01)安裝在接頭J3上。表2列出了兩塊板(以及串行轉JTAG板)的跳線和DIP開關設置。注意:所有未列出的跳線都應斷開連接。圖 1 顯示了最終設置。

開關或跳線 設置 筆記
串行轉JTAG板 JH1 連接
JH2 連接
JH3 連接 通過JTAG電纜提供5V電源
主MAXQ2000評估板 JU1 引腳 1 和 2 已連接 權力五DD采用 2.5V 電源
JU2 引腳 1 和 2 已連接 權力五迪奧采用 3.6V 電源
JU3 引腳 1 和 2 已連接 權力五液晶顯示器采用 3.6V 電源
JU4 連接 采用JTAG 5V電源為套件板供電
DIP SW1 開關 #4 和 #8 打開;所有其他開關關閉 使串行端口 0 輸出到 J5
DIP SW3 所有開關關閉
DIP SW6 所有開關關閉
從MAXQ2000評估板 JU1 Powers VDD from 2.5V supply
JU2 引腳 1 和 2 已連接 Powers VDDIO from 3.6V supply
JU3 引腳 1 和 2 已連接 Powers VLCD from 3.6V supply
DIP SW1 所有開關關閉
DIP SW3 所有開關關閉
DIP SW6 所有開關關閉

poYBAGP0OQmATdRLAACrYZ5J6pY055.jpg?imgver=1

圖1.JTAG演示設置。

MAXQ JTAG接口

MAXQ微控制器上的JTAG接口由四條信號線組成,用于將信息移入和移出測試訪問端口(TAP)控制器。該TAP控制器提供對MAXQ自舉加載程序和在線調試功能的訪問。(請注意,實現調試主機雖然類似于實現引導加載程序主機,但超出了本應用筆記的范圍。四條JTAG信號線如表3所示。

JTAG信號 信號名稱 方向(主) 方向(從屬) 信號描述
TMS 測試模式選擇 輸出 輸入 該信號線與TCK線一起用于將TAP控制器從一種工作狀態切換到另一種工作狀態。
TCK 測試時鐘 輸出 輸入 該信號為JTAG接口提供時鐘。JTAG時鐘限制為從機時鐘頻率除以8的最大值。例如,如果從機以8MHz的時鐘頻率運行,則TCK的JTAG時鐘不能運行得超過1MHz。
TDI 測試數據 輸出 輸入 該信號攜帶從主站發送到從站的數據。
統計局 測試數據輸出 輸入 輸出 該信號將從從站發送回主站的數據傳輸回主站。

從技術上講,nRESET引腳不是JTAG接口的一部分。它包含在JTAG電纜上,允許JTAG主機復位從機微控制器。復位從機微控制器是進入引導加載程序模式的必要步驟,如果JTAG通信意外中斷,復位也很有用。

由于JTAG接口是全雙工的,因此數據在TDI線路上從主站轉移到從機的同時,數據在TDO線路上從從機轉移到主站。從機在TCK的上升沿對輸入數據(在TDI和TMS上)進行采樣,并將傳出數據驅動到TCK下降沿TDO上的主站。對于傳入和傳出數據,值首先以最低有效位傳輸。

本應用筆記僅簡要概述JTAG接口和TAP控制器,以解釋示例代碼的操作。有關這些特性的更詳細討論,請參考MAXQ系列用戶指南的測試訪問端口(TAP)、在線調試模式和在系統編程部分。

與TAP控制器通信

TAP控制器圍繞狀態機構建,如下圖2所示。TAP 狀態機中包含 <> 個離散狀態。根據TMS信號的值,從一種狀態到另一種狀態的轉換發生在TCK的每個上升沿上。例如,如果TAP控制器處于選擇DR掃描狀態,并且TCK上出現上升沿:

如果TMS = 1,TAP控制器將轉換為選擇紅外掃描狀態。

如果 TMS = 0,TAP 控制器將轉換為捕獲 DR 狀態。

通過這種方式,可以將TAP控制器時鐘設置為任何所需狀態。關于下面的狀態圖(圖 2),有兩點需要注意:

無論啟動狀態如何,五個“1”轉換(保持TMS高電平和時鐘TCK五個完整周期)將始終使狀態機返回到測試-邏輯-復位狀態。這意味著,如果TAP控制器的當前狀態未知,或者JTAG主站和從站之間的通信以某種方式中斷,則始終可以通過時鐘進行五個“1”轉換,使TAP控制器恢復到已知狀態。

即使TCK時鐘繼續運行,也可以無限期地暫停JTAG通信并保持運行-測試-空閑、暫停-DR或暫停-IR狀態,而不會影響TAP控制器的狀態。

pYYBAGP0OQyARS1rAABMA5xfcl4708.gif?imgver=1

圖2.測試訪問端口 (TAP) 狀態機。

TAP控制器的狀態機提供對兩個控制寄存器的訪問,這兩個控制寄存器又提供引導加載程序的接口、調試接口和其他功能。

IR(指令寄存器)的寬度始終為三位。該寄存器充當索引寄存器,進而控制DR的功能(見下文)。

DR(數據寄存器)是TAP控制器內多個寄存器之一的接入點。當位移入或移出DR時,實際訪問的寄存器取決于IR的當前值。

poYBAGP0OQ2AH_3FAAA1id7fq4k331.gif?imgver=1

圖3.在 TAP 控制器中注冊訪問權限。

如圖3所示(DR指向三個內部寄存器之一,具體取決于IR的值。

如果 IR = 011b,則 TAP 控制器處于旁路模式。在此模式下(這是 TAP 控制器的默認模式),轉移到 DR(通過 TDI)的數據只是通過 TDO 再次移出。通過TAP控制器傳輸的數據不會改變內部寄存器。

設置 IR = 100b 會將 TAP 控制器置于系統編程模式。在此模式下,移入DR的數據將移入3位系統編程寄存器。該寄存器(也可由MAXQ微存儲器作為ICDF寄存器的位[3:1]訪問)控制復位后MAXQ是進入正常程序執行模式還是引導加載程序模式。如果啟用了引導加載程序模式,它還控制引導加載程序將使用哪個接口(JTAG、串行或SPI)。

設置 IR = 010b 會將 TAP 控制器置于調試模式。在這種模式下,移入DR的數據被移入內部10位調試寄存器,引導加載程序可以讀取該寄存器。引導加載程序輸出的數據也通過此寄存器移出(以及兩個狀態位),并通過TDO從那里移出。該寄存器用于在引導加載程序和在線調試模式下傳輸數據。

在上面討論的三種模式中,旁路模式是“無操作”模式;它不提供對我們感興趣的引導加載程序函數的訪問。系統編程模式,盡管它的名字,實際上并不用于與引導加載程序通信,只是為了啟用對它的訪問。一旦引導加載程序處于活動狀態并正在通信,此 TAP 模式將不再有用。Debug 模式允許訪問 10 位輸入/輸出寄存器,是用于執行與引導加載程序的所有通信的模式。啟用引導加載程序后,TAP 控制器的此模式將獨占使用,直到加載程序會話完成。

控制JTAG端口和復位線

從機MAXQ2000上的JTAG/TAP端口的四條線(TMS、TCK、TDO和TDI)和nRESET線分別連接到主站MAXQ2000上的一個端口引腳。控制JTAG接口的第一步是正確配置這些線路。

#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生產線在標準驅動模式下運行。從主機的角度來看,TMS、TCK和TDI將始終作為輸出驅動,而TDO(由從機驅動)將始終作為輸入驅動。JTAG線的方向是固定的,而不是雙向的。nRESET線路是一種特殊情況,配置為主端的漏極開路輸出。通常,從機會將自己的nRESET線拉高,因此主機應僅將線拉下(當從機復位時)或完全釋放(在所有其他時間)。主機沒有理由顯式驅動從機的nRESET線高電平。

;==============================================================================
;=
;=  initializeJTAG
;=
;=  Sets up the port pins for the JTAG interface.
;=
;=  Inputs   : None
;=  Outputs  : None
;=  Destroys : None
;=

initializeJTAG:
   move    PD0.0, #1      ; TCK - master output
   move    PO0.0, #1      ; Drive high
   move    PD0.1, #0      ; TDO - master input
   move    PO0.1, #1      ; Weak pullup on
   move    PD0.2, #1      ; TMS - master output
   move    PO0.2, #1      ; Drive low
   move    PD0.3, #1      ; TDI - master output
   move    PO0.3, #1      ; Drive high
   move    PD0.4, #0      ; RST - open drain when 1, tristate when 0
   move    PO0.4, #0      ; Weak pullup off
   ret

初始化端口引腳后,時鐘0和時鐘1例程用于時鐘TMS線上的靜態0和1,以將TAP控制器從一個狀態推進到下一個狀態。JTAG時鐘可以以任何頻率驅動,只要JTAG時鐘速率保持在從機微控制器系統時鐘速率的1/8最大值以下即可。這里不需要考慮主站的系統時鐘速率;它不需要以任何方式與從站的系統時鐘速率匹配。主站可以比從站運行得更快或更慢,而不會引起JTAG通信問題。

由于本例中的從機MAXQ2000安裝了8MHz時鐘晶體,因此主機可以毫無問題地驅動高達1MHz的JTAG時鐘。在本例中,100kHz的JTAG時鐘速率就足夠了。

#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 low
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    TCK, #1           ; Clock rising edge
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    TCK, #0           ; Clock falling edge
   move    LC[0], #JCLOCK
   djnz    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 high
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    TCK, #1           ; Clock rising edge
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    TCK, #0           ; Clock falling edge
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   ret

有了這兩個例程,我們可以添加一個例程來初始化TAP控制器,方法是強制TAP控制器返回到測試邏輯復位狀態。請注意,測試邏輯重置狀態(顧名思義)執行 TAP 邏輯的完全重置,包括確定引導加載程序是否啟用以及引導加載程序正在使用哪個接口的位(SPE 和 PSS[1:0])。因此,一旦進入引導加載程序模式,將TAP控制器設置為測試-邏輯-復位將重置設備并退出引導加載程序模式。演示應用程序中使用的JTAG例程(testLogicReset本身除外)都假定TAP控制器在例程開始時處于運行-測試-空閑狀態。在JTAG通信例程中,TAP控制器將切換各種狀態;在例程結束時,TAP 控制器將始終返回到運行-測試-空閑狀態。

;==============================================================================
;=
;=  testLogicReset
;=     clock0, clock1
;=
;=  Resets the JTAG/TAP controller to its starting state.
;=
;=  Inputs   : None
;=  Outputs  : None
;=  Destroys : LC[0]
;=

testLogicReset:
   call    clock1
   call    clock1
   call    clock1
   call    clock1
   call    clock1
   call    clock1
   call    clock1
   call    clock0            ; Brings us to Run-Test-Idle
   ret

寫入TAP指令寄存器

將值加載到 TAP 控制器的 IR 中是通過遍歷 TAP 狀態機向下移動到 Shift-IR 狀態并輸入新的 3 位值來完成的。在輸入 Update-IR 狀態之前,該值實際上不會從移位寄存器復制到指令寄存器。

與所有JTAG移位寄存器操作一樣,隨著新值的移入,寄存器的當前內容被移出(通過TDO)。但是,移出的值將始終是固定的(001b);這是JTAG標準強制要求的,用于測試JTAG接口的功能。

移入和移出任一移位寄存器(IR或DR)的過程是相同的;TAP 狀態機必須分別處于 Shift-IR 或 Shift-DR 狀態。輸入位(TDI處)由TAP控制器在每個TCK周期的上升沿采樣,而輸出位(TDO)在TCK周期的下降沿上被驅動。

;==============================================================================
;=
;=  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_bit1
shift_bit0:
   move    TDI, #0           ; Shift in zero bit
   jump    shift_bitEnd
shift_bit1:
   move    TDI, #1           ; Shift in one bit
   jump    shift_bitEnd
shift_bitEnd:
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    TCK, #1           ; Rising edge, TDI is sampled
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    TCK, #0           ; Falling edge, TDO is driven out
   move    LC[0], #JCLOCK
   djnz    LC[0], $
   move    C, TDO            ; Latch TDO value
   ret

對于傳輸中的每個位,除最后一位外,TMS必須保持低電平。這一點很重要,這樣,當每個位移入和移出時,狀態機將保持 Shift-IR 或 Shift-DR 狀態。在最后一個位周期,TMS必須被驅動為高電平,以便在最后一個位輸入和輸出時,TAP控制器將前進到Exit1-DR或Exit1-IR狀態。

例如,在表4中,JTAG主站將值100b(系統編程模式)移入IR寄存器。IR 寄存器開始編程為旁路值 011b;TAP 控制器以“運行-測試-空閑”狀態啟動。如下圖 4 所示,這些位從最低有效位開始,以最高有效位結束,移入(移出)TAP 控制器。因此,在第一個移位周期中,新值的位 0 移入,舊值的位 0 移出。

TCK TMS TDI TDO TAP State 移位寄存器 指令寄存器
位 2 位 1 位 0 位 2 位 1 位 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

用于執行此操作的例程 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/dec
   call    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 = s
   rrc                       ; sxxxxx21   c = 0
   call    shift             ; Shift in IR bit 0
   rrc                       ; ssxxxxx2   c = 1
   call    shift             ; Shift in IR bit 1
   rrc                       ; sssxxxxx   c = 2
   move    TMS, #1           ; Drive TMS high for last bit
   call    shift             ; Shift in IR bit 2 (Exit1 IR)
   call    clock1            ; (Update IR)
   call    clock0            ; (Run Test Idle)
   ret

寫入TAP數據寄存器

將值移入和移出TAP控制器的DR的方式與IR的加載/卸載類似。通常,僅當 IR 設置為以下兩個值之一時,才會執行此操作:100b(將 TAP 控制器置于系統編程模式)或 010b(將 TAP 控制器置于調試模式)。

當系統編程模式處于活動狀態時,加載和卸載 DR 寄存器的操作如下。

進出DR寄存器的移位寬度為3位。所有三位都表示有效數據。

當達到 Update-DR 狀態時,傳輸到 DR 寄存器的值將復制到從屬微控制器的內部系統編程寄存器中。這三個位的使用方式如下。

從機微控制器可訪問(讀/寫)位0作為寄存器位ICDF.1(SPE),也稱為系統程序使能位。復位后由實用程序ROM檢查此位,以確定是否應進入引導加載程序模式(SPE = 1)或正常程序執行模式(SPE = 0)。

位 1 和 2 可由從機微控制器作為寄存器位 ICDF.2-3 (PSS0-PSS1) 訪問(讀/寫),也稱為編程源選擇位。在支持多個引導加載程序接口的微控制器上,如MAXQ2000,這些位用于選擇當SPE = 1時激活哪個引導加載程序接口。當SPE = 0(正常程序執行模式)時,這些位的設置不起作用。

從 DR 寄存器傳出的值是系統編程寄存器的先前值(進入 Capture-DR 狀態時鎖存到移位寄存器中)。

當調試模式處于活動狀態時,加載和卸載 DR 寄存器的操作如下。

進出DR寄存器的移入寬度為10位。對于移出的數據,所有 10 位表示有效數據(<> 個數據位和 <> 個狀態位)。對于移入的數據,僅使用八個數據位的值;不使用這兩個狀態位。

然后,作為引導加載程序命令的一部分,將移入 DR 寄存器的值的高八位被卸載并由引導加載程序(從實用程序 ROM 運行)讀取。

從 DR 寄存器移出的 10 位值由引導加載程序加載的 8 位值(作為命令輸出的一部分)和 TAP 控制器設置的兩位狀態信息組成。

;==============================================================================
;=
;=  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/dec
   call    clock1            ; (Select DR Scan)
   call    clock0            ; (Capture DR)
   call    clock0            ; (Shift DR)
   move    TMS, #0           ; Drive TMS low                            
   move    C, TDO            ; xxxxx210   c = s
   rrc                       ; sxxxxx21   c = 0
   call    shift             ; Shift in DR bit 0
   rrc                       ; ssxxxxx2   c = 1
   call    shift             ; Shift in DR bit 1
   rrc                       ; sssxxxxx   c = 2
   move    TMS, #1           ; Drive TMS high for last bit
   call    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/dec
   move    A[15], A[0]       ; Cache input byte value for use by shiftDR_next
   sla2                      ; 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
   rrc                       
   call    shift             ; Shift in DR bit 0
   rrc                        
   call    shift             ; Shift in DR bit 1
   rrc                       
   call    shift             ; Shift in DR bit 2
   rrc                       
   call    shift             ; Shift in DR bit 3
   rrc                       
   call    shift             ; Shift in DR bit 4
   rrc                       
   call    shift             ; Shift in DR bit 5
   rrc                       
   call    shift             ; Shift in DR bit 6
   rrc                       
   call    shift             ; Shift in DR bit 7
   rrc                       
   call    shift             ; Shift in DR bit 8
   rrc                       
   move    TMS, #1           ; Drive TMS high for last bit
   call    shift             ; Shift in DR bit 9 (Exit1 DR)
   call    clock1            ; (Update DR)
   call    clock0            ; (Run Test Idle)

   push    Acc               ; sddd dddd 10xx xxxx
   sra4                      ; ssss sddd dddd 10xx
   sra2                      ; ssss sssd dddd dd10
   and     #0003h            ; ---- ---- ---- --10
   move    A[1], Acc         ; Return status bits only in A[1]
   pop     Acc
   and     #0FF00h           
   xch                       ; Return data bits only in A[0]
   ret

進入JTAG引導加載程序模式

將MAXQ2000置于JTAG引導加載程序模式需要以下步驟。

初始化 TAP 控制器,將其重置為測試-邏輯-復位狀態。

將指令寄存器 (IR) 設置為 100b 以啟用系統編程模式。

將數據寄存器 (DR) 設置為 001b。這將 SPE(系統編程啟用)位設置為 1 以啟用引導加載程序,并將 PSS[1:0](編程源選擇)位設置為 00b 以選擇 JTAG 接口。

保持低電平復位可復位MAXQ2000。

釋放重置。這導致MAXQ2000向矢量到實用程序ROM (8000h)中的標準復位點。然后,實用程序ROM代碼將檢查SPE和PSS位的值,并相應地激活JTAG引導加載程序。此時,引導加載程序正在運行并準備接受JTAG命令。

將指令寄存器 (IR) 設置為 010b 以啟用調試模式。這是用于與JTAG引導加載程序或調試引擎通信的模式;在這種情況下,我們將使用此模式與引導加載程序進行通信。

通過DR移動10位值,開始向JTAG引導加載程序發送命令。

#define  IR_DEBUG         010b      ; Debug Mode
#define  IR_BYPASS        011b      ; Bypass Mode (default)
#define  IR_SYSTEM_PROG   100b      ; System Programming Mode (activate loader)

; System Programming Register settings

#define  SP_EXECUTE       000b      ; Bootloader disabled
#define  SP_LOAD_JTAG     001b      ; Activate JTAG bootloader 
#define  SP_LOAD_UART     011b      ; Activate UART bootloader
#define  SP_LOAD_SPI      101b      ; Activate SPI bootloader (invalid on 2000)
#define  SP_RESERVED      111b      ; Reserved value

   ...

   call    initializeJTAG    ; Set up port pins for JTAG
   call    testLogicReset    ; Reset JTAG port (ending state: Run-Test-Idle)
   
   move    Acc, #IR_SYSTEM_PROG
   call    shiftIR3          ; Load the System Programming instruction into IR

   move    Acc, #SP_LOAD_JTAG
   call    shiftDR3          ; Enable the bootloader in JTAG interface mode

   move    RST, #1           ; Drive nRESET low
   move    Acc, #100         ; Delay for 100ms
   call    delayMS

   call    clock0            ; Remain in Run-Test-Idle

   move    RST, #0           ; Release nRESET
   move    Acc, #100         ; Delay for 100ms
   call    delayMS

   move    Acc, #IR_DEBUG
   call    shiftIR3          ; Enable access to the 10-bit debug shift register

   ;;;;  Bootloader commands may now be shifted through the DR register

   call    waitForPrompt     ; Verify that the bootloader is responding

   ...

與引導加載程序通信

引導加載程序運行后,實用程序 ROM 中的引導加載程序代碼將從從 DR 移位寄存器加載的內部寄存器讀取命令代碼。實用程序ROM還將結果數據寫入另一個內部寄存器,該寄存器可由JTAG主站通過DR寄存器移出。這樣,引導加載程序代碼和JTAG主站就可以交換信息。

但是,引導加載程序代碼和JTAG主站并不同步。只要JTAG時鐘的速率保持在MAXQ系統時鐘的最大值1/8以下,兩個時鐘的確切值對于通信目的無關緊要,因為JTAG是一個同步接口。但是,MAXQ系統時鐘速率和收到的引導加載程序命令的性質將決定引導加載程序接收命令和發送回復之間的延遲時間。例如,工作在2000MHz的MAXQ1比工作在2000MHz的MAXQ10需要更長的時間來響應給定的引導加載程序命令,即使兩個微控制器都可以使用100kHz的JTAG時鐘進行通信。僅讀取和返回信息的命令(例如返回ROM橫幅ID或從程序存儲器讀取的命令)也比包含諸如編程閃存等操作的命令花費更少的時間。

通過JTAG接口傳輸的數據不緩沖。如果在讀取上一個命令之前發送另一個 10 位命令,則前一個命令的結果將丟失。ROM代碼和TAP控制器確保在JTAG主站卸載先前的數據之前,引導加載程序不會發送額外的數據,但也需要反向同步。JTAG主站需要一種方法來判斷它轉移到DR中的前一個字節是否已被引導加載程序讀取。通過這種方式,JTAG主站可以知道何時發送下一個字節。知道這一點的方法源自 TAP 控制器通過引導加載程序的每個 8 位字節輸出發送的兩個附加狀態位。

pYYBAGP0ORCAfGDFAABC_Fle_jY390.gif?imgver=1

圖4.通過 DR 傳輸數據和狀態位。

如上圖4所示,在TAP調試模式下移入和移出DR的數據由2個數據位(位9至0)和1個狀態位(位<>和<>)組成。當JTAG主站移入數據時,僅使用<>個數據位。兩個狀態位(仍必須移入)不由TAP控制器使用,可以設置為零或任何其他值。

在從 TAP 控制器移出的 10 位值中,兩個狀態位提供有關引導加載程序或調試引擎狀態的信息。當引導加載程序運行時,通常只會遇到最后兩種狀態(調試繁忙或調試有效),因為其他兩種狀態值在引導加載程序模式下不會出現。(請參閱圖 4 中的狀態/條件。

如果狀態位設置為調試繁忙(10b)值,則引導加載程序尚未讀取由JTAG主站轉移到DR中的先前值。這也意味著移出的 8 位數據值毫無意義,因為引導加載程序尚未完成命令。當收到此值時,JTAG主站必須使用先前傳輸的字節值重新加載DR,以便引導加載程序可以訪問它。正確執行此操作的狀態序列如下所示。

在將最后一個位轉換為處于Shift-DR狀態的DR并轉換到Exit1-DR之后,JTAG主站應檢查這兩個狀態位。

如果收到“調試繁忙”值,請切換到暫停 DR 狀態,然后從那里轉換到 Exit2-DR,然后再次返回到 Shift-DR。重新加載以前的 DR 值(不是這次移動的值),然后通過 Exit1-DR 和 Update-DR,忽略第二次傳遞時的狀態位的值。

延遲一小段時間(取決于正在執行的命令),然后重試字節傳輸。

如果狀態位設置為調試有效 (11b) 值,則引導加載程序已讀取移入的最后一個字節并加載了回復字節。移出的 8 位值包含有效數據。

執行引導加載程序命令序列時,shiftDRshiftDR_next 例程會自動執行此同步。應該為序列中的第一個字節調用 shiftDR 例程;后續字節調用shiftDR_next。shiftDR_next例程的操作與 shiftDR 相同,只是它檢查兩個狀態位并在必要時如上所述重新傳輸前一個 DR 字節。sendCommand 例程將所有這些聯系在一起,并調用 shiftDRshiftDR_next 來傳輸命令序列,根據需要延遲和重新發送字節,直到命令完成。

;==============================================================================
;=
;=  sendCommand
;=
;=  Transmits a loader command by shifting bytes through DR.
;=
;=  Inputs   : DP[0] - Points to area of RAM which stores input bytes
;=                     for command and which will be filled with output.
;=             LC[1] - Number of bytes to transmit/receive
;=  Outputs  : C - Set on JTAG communication error
;=  Destroys : AP, APC, A[0], A[1], A[2], A[15], PSW, LC[0]
;=

sendCommand:
   move    APC, #80h         ; Acc => A[0], turn off auto inc/dec
   push    LC[1]
   call    waitForPrompt
   pop     LC[1]
   jump    C, sendCommand_fail

   move    Acc, @DP[0]       ; Read first byte to transmit
   call    shiftDR
   push    Acc
   move    Acc, A[1]
   cmp     #3                ; Should be valid status since we had a prompt
   pop     Acc
   jump    NE, sendCommand_fail

   move    @DP[0], Acc       ; Store first received byte
   move    NUL, @DP[0]++     ; Increment data pointer
   djnz    LC[1], sendCommand_loop
   jump    sendCommand_pass

sendCommand_loop:
   move    A[2], #10         ; Number of retries allowed
sendCommand_retry:
   move    Acc, @DP[0]       ; Get next byte to transmit
   call    shiftDR_next
   push    Acc
   move    Acc, A[1]
   cmp     #3
   pop     Acc
   jump    NE, sendCommand_stall

   move    @DP[0], Acc       ; Store received byte
   move    NUL, @DP[0]++     ; Increment data pointer
   djnz    LC[1], sendCommand_loop
   jump    sendCommand_pass

sendCommand_stall:
   move    LC[0], #8000      ; About a millisecond
   djnz    LC[0], $
   move    Acc, A[2]
   sub     #1
   jump    NZ, sendCommand_retry
   jump    sendCommand_fail

引導加載程序提供的函數

MAXQ微控制器上的引導加載程序功能通常遵循共享模式,這意味著許多命令和狀態碼在器件之間是相同的。不同的設備可以實現引導加載程序命令集的不同子集,具體取決于其內部程序存儲器的結構和其他要求。具體細節請參考您正在使用的MAXQ微控制器的用戶指南補充。在這種情況下,請參考MAXQ2000用戶指南補充文件中“在系統編程”部分中的引導加載程序命令。

與其他MAXQ引導加載程序一樣,MAXQ2000引導加載程序提供的命令分為0到15的命令系列。每個命令都以命令字節開頭,該字節是命令系列(前四位)和特定于命令的數字(低四位)的組合,如表 5 所示。作為一般規則,Family 0命令本質上是信息性的,由所有設備實現;其他命令系列是可選的。要確定特定MAXQ器件支持的命令系列,請參考器件的文檔。族 0 命令 05h(獲取支持的命令)返回一個位掩碼,指示該引導加載程序支持哪些其他命令系列。

MAXQ2000支持的引導加載程序命令系列如下。

族 0 - 信息和狀態。該系列中的命令可用于獲取MAXQ器件的基本信息,包括ROM/引導加載程序的身份和版本、最新命令的結果(狀態碼)以及程序和數據存儲器的大小。該系列還包括主擦除命令,該命令可清除設備上的所有程序和數據存儲器。

族 1 - 荷載可變長度。該系列中的命令可用于加載程序(閃存)或數據(RAM)存儲器。

族 2 - 轉儲可變長度。該系列中的命令可用于讀取程序或數據存儲器的內容。

系列 3 - CRC 可變長度。該系列中的命令可用于獲取在指定的程序或數據存儲器范圍內計算的CRC-16值。

族 4 - 驗證可變長度。該系列中的命令可用于驗證指定范圍的程序或數據存儲器是否與JTAG主站提供的數據相匹配。

族 5 - 加載并驗證可變長度。此系列中的命令將“加載”和“驗證”命令的功能合并到一個命令中。

族 6 - 擦除可變長度。在MAXQ2000上,此命令可用于將指定區域的數據RAM清零。

族 7 - 擦除固定長度。在MAXQ2000上,該命令可用于擦除閃存程序存儲器的單個頁面,而不是使用主擦除命令一次擦除所有閃存。

一旦MAXQ微控制器上的TAP控制器被置于JTAG加載器模式(所有MAXQ微控制器的過程都相同),第一步就是確定加載器是否響應。執行此操作的最快方法是重復傳輸引導加載程序命令代碼 00h(無操作)。每個引導加載程序命令完成后,引導加載程序會以提示符(“>”或 3Eh)字節進行響應。如果傳輸 00h 導致 3Eh 回復,則引導加載程序正在運行并準備好接受命令。

識別JTAG從屬微控制器

引導加載程序啟動并運行后,下一步是識別從MAXQ微控制器。族 0 命令 0Dh(獲取 ID 信息)返回一個可變長度的 ASCII 字符串(零端接),用于標識設備和實用程序 ROM 版本。

我們的示例程序獲取此信息,然后將其打印到串行端口作為演示的一部分。用于執行此操作的例程是getBanner

;==============================================================================
;=
;=  getBanner
;=     waitForPrompt
;=        shiftDR
;=           clock0, clock1, shift
;=
;=  Executes command 0Dh to retrieve the ROM (device ID) banner and prints
;=  the banner text out over the serial port.
;=
;=  Inputs   : None
;=  Outputs  : C - Set on JTAG communication error
;=  Destroys : AP, APC, Acc, PSW, LC[0]
;=

getBanner:
   call    waitForPrompt
   jump    C, getBanner_fail

   move    Acc, #CMD_GET_ROM_BANNER
   call    shiftDR
   move    Acc, #00h
   call    shiftDR

getBanner_loop:
   move    Acc, #00h
   call    shiftDR
   cmp     #0FFh             ; The banner is ASCII, so receiving this character
                             ; most likely indicates that the JTAG lines are
                             ; floating high and that no device is connected
   jump    E, getBanner_fail
   jump    Z, getBanner_done
   call    txChar
   jump    getBanner_loop

getBanner_done:
   call    txNewline
   jump    getBanner_pass

getBanner_fail:
   move    C, #1 
   ret
getBanner_pass:
   move    C, #0
   ret

擦除程序內存

MAXQ2000中包含的閃存程序存儲器必須先擦除(設置為0FFFFh),然后才能編程。JTAG演示應用程序通過發送02h(主擦除)引導加載程序命令來擦除閃存,指示引導加載程序擦除所有程序和數據存儲器。此命令還會清除密碼鎖定位,從而啟用所有受支持的命令系列。

根據MAXQ器件的不同,此02h(主擦除)命令可能需要幾秒鐘才能完成。由于這是一個單字節命令,因此確定何時完成的最簡單方法是發送無操作 (00h) 命令,然后連續 1 毫秒延遲,直到引導加載程序返回 3Eh,指示命令完成。此方法在下面的 masterErase 例程中顯示。

;==============================================================================
;=
;=  masterErase
;=
;=  Executes command 02h (Master Erase) to clear all program and data memory.
;=
;=  Inputs   : None
;=  Outputs  : C - Set on JTAG communication error
;=  Destroys : Acc, PSW, LC[0], LC[1]
;=

masterErase:
   call    waitForPrompt
   jump    C, masterErase_fail

   move    Acc, #CMD_MASTER_ERASE
   call    shiftDR
   move    Acc, #00h
   call    shiftDR

   move    LC[1], #5000      ; Number of retries before returning an error
masterErase_loop:
   move    Acc, #CMD_NOP
   call    shiftDR
   cmp     #3Eh
   jump    E, masterErase_pass
   move    LC[0], #8000      ; Delay for about a millisecond
   djnz    LC[0], $
   djnz    LC[1], masterErase_loop

masterErase_pass:
   move    C, #0
   ret
masterErase_fail:
   move    C, #1
   ret

檢索狀態信息

在 MasterErase(或幾乎任何其他引導加載程序命令)完成后,可以使用 04h(獲取狀態)命令來確定命令是否成功完成。“獲取狀態”命令返回兩個字節的數據:一個字節包含狀態標志(指示密碼鎖定設置/取消設置、字/字節模式處于活動狀態以及其他信息),第二個字節是單字節狀態代碼。

如果最后一個命令成功完成,則狀態代碼始終為 00h(無錯誤)。非零狀態代碼表示錯誤。狀態碼的詳盡列表見MAXQ2000用戶指南補充程序;此處列出了一些常見的錯誤代碼。

01h/02h - 不支持系列/命令無效。這些錯誤代碼通常表示與JTAG主機的通信故障或對齊錯誤。如果JTAG主站發送的字節數多(或少)于引導加載程序對給定命令代碼的預期,則引導加載程序會將其中一個數據字節解釋為新命令的開始。

03h - 無密碼匹配。此錯誤代碼通常表示JTAG主站嘗試使用受密碼保護的命令(通常包括不在族0中的任何命令),而沒有先清除密碼鎖。如果JTAG主站訪問已將代碼加載到字地址0010h – 001Fh中的部分,則會發生此錯誤。在這種情況下,部件必須被主擦除,或者必須使用密碼匹配命令 (03h) 來解鎖部件。

05h - 驗證失敗。加載/驗證或驗證命令上的驗證步驟失敗。此錯誤可能發生在通信故障之后,或者也因為嘗試重新編程先前編程的閃存而沒有先擦除它。

將代碼加載到程序存儲器中

為了演示JTAG引導加載程序的功能,演示應用需要通過JTAG連接將代碼加載到從機MAXQ2000中。在此示例中,加載的代碼將是啟動 LCD 控制器并在 LCD 顯示屏上顯示 4 位數字的簡單例程。

加載到從機MAXQ2000的代碼基于以下簡單的演示項目。

org 0
   ljump   main

org 20h

main:
   move    LCRA, #03E0h      ; xxx0001111100000
                             ;    00            - DUTY : Static
                             ;      0111        - FRM  : Frame freq
                             ;          1       - LCCS : HFClk / 128
                             ;           1      - LRIG : Ground VADJ
                             ;            00000 - LRA  : RADJ = Min

   move    LCFG, #0F3h       ; 1111xx11
                             ; 1111     - PCF  : All segments enabled
                             ;       1  - OPM  : Normal operation
                             ;        1 - DPE  : Display enabled

   move    LCD0, #LCD_CHAR_0
   move    LCD1, #LCD_CHAR_0
   move    LCD2, #LCD_CHAR_0
   move    LCD3, #LCD_CHAR_2
   move    LCD4, #00h

   sjump   $

但是,由于我們從演示應用程序而不是硬編碼的十六進制文件加載代碼字節(就像使用 MTK 或 MAX-IDE 加載代碼時一樣),演示應用程序將根據用戶輸入修改加載的應用程序。

在加載代碼之前,JTAG通信演示應用程序首先指示用戶輸入一個4位十進制數,然后修改正在加載的應用程序,如下所示。

液晶屏上顯示的數字是用戶輸入的 4 位數字。

密碼區域的前四個字節(從字地址 010h 開始)被編程為用戶輸入的四個字符的 ASCII 值。

應用程序代碼由演示使用對引導加載程序命令 10h(加載代碼,可變長度)的三次調用來加載。此命令的參數包括:要加載的字節數(加載代碼內存時必須是偶數以確保單詞對齊);起始地址;當然,還有數據本身。MAXQ存儲器是小端存儲器,因此應用必須首先發送每個程序字的最低有效字節。

  ;;;;
   ;;;;  First load - LJUMP 0020h at start of program memory
   ;;;;

   move    DP[0], #0
   move    @DP[0],   #CMD_LOAD_CODE_VARIABLE
   move    @++DP[0], #4        ; Length - 4 bytes
   move    @++DP[0], #00h      ; AddrL (byte address 0000h)
   move    @++DP[0], #00h      ; AddrH

   move    @++DP[0], #000h     ; 00 0B 20 0C - ljump 0020h
   move    @++DP[0], #00Bh
   move    @++DP[0], #020h
   move    @++DP[0], #00Ch
   move    @++DP[0], #000h     ; Padding
   move    @++DP[0], #000h     ; Padding
   move    @++DP[0], #55h
   move    LC[1], DP[0]
   move    DP[0], #0

   nop
   call    sendCommand
   nop
   jump    C, main_failJTAG
   call    getStatus
   jump    C, main_failJTAG
   move    Acc, A[3]         ; Check that loader status is 00h (no error)
   jump    NZ, main_failStatus

其余兩個代碼內存塊以類似的方式加載。

驗證程序存儲器中的代碼

加載代碼后,有幾種方法可以驗證它是否正確加載。

不要使用“加載代碼可變長度”命令 (10h),而是使用“加載并驗證代碼可變長度”命令 (50h)。后一個命令將代碼加載操作與驗證步驟相結合。

或者,可以通過調用驗證代碼可變長度命令 (40h) 單獨執行驗證。

JTAG主機可以通過使用轉儲代碼變量長度(20h)來驗證加載的代碼是否與發送的數據匹配,而不是讓引導加載程序驗證加載的代碼。

從程序存儲器轉儲代碼

加載完所有代碼后,JTAG演示的最后一步是在單個塊中讀出所有代碼。此讀取是通過將轉儲代碼可變長度 (20h) 命令發送到引導加載程序來完成的。此命令的參數是要開始轉儲(讀取)的地址和要轉儲的字節數。請注意,與所有JTAG引導加載程序命令一樣,每個字節讀回都必須發送一個字節。因此,此命令需要大量零鍵盤字節,每個字節將從程序存儲器讀取一個。

   ;;;;
   ;;;;  Dump program code
   ;;;;

   move    DP[0], #str_dumpCodeVariable
   call    txString

   move    DP[0], #0
   move    @DP[0],   #CMD_DUMP_CODE_VARIABLE
   move    @++DP[0], #1        ; Indicates single byte length (<256 bytes)
   move    @++DP[0], #00h      ; AddrL (byte address 0000h)
   move    @++DP[0], #00h      ; AddrH
   move    @++DP[0], #128      ; Length - 128 bytes

   move    LC[1], #128
main_loop1:
   move    @++DP[0], #00h
   djnz    LC[1], main_loop1   

   move    @++DP[0], #000h     ; Padding
   move    @++DP[0], #000h     ; Padding
   move    @++DP[0], #55h
   move    LC[1], DP[0]
   move    DP[0], #0

   nop
   call    sendCommand
   nop
   jump    C, main_failJTAG
   call    getStatus
   jump    C, main_failJTAG
   move    Acc, A[3]         ; Check that loader status is 00h (no error)
   jump    NZ, main_failStatus

JTAG演示應用程序在讀取這些代碼字節后,通過串行端口以十六進制格式輸出這些代碼字節。

退出引導加載程序

單字節系列 0 命令 01h(出口加載程序)使引導加載程序完成操作并退出,如下所示。

引導加載程序啟動內部復位,將 SPE 和 PSS 位清零并復位微控制器。

微控制器退出復位,并在8000h時開始在實用程序ROM中執行。

SPE 現在清除為零后,實用程序 ROM 代碼會導致執行跳轉到地址 0000h 處的用戶應用程序代碼的開頭。

由于出口加載程序命令會自動清除SPE和PSS位,并且由于隨后的復位將TAP控制器清除回旁路模式,因此JTAG主站無需執行這些操作中的任何一個。

;;;;
   ;;;;  Exit loader mode and allow program code to execute
   ;;;;

   call    waitForPrompt
   move    Acc, #CMD_EXIT_LOADER
   call    shiftDR
   move    Acc, #00h
   call    shiftDR
   move    Acc, #00h
   call    shiftDR
   move    Acc, #00h
   call    shiftDR

運行演示

運行JTAG引導加載程序演示需要以下硬件和軟件組件。

硬件

兩塊MAXQ2000評估板(MAXQ2000-K00 REV B);一個評估板作為MAXQ2000主評估板,另一個作為MAXQ2000從基板。

MAXQ2000 LCD子板 (MAXQ2000-K01 REV B)

兩根2×5JTAG接口電纜(包含在MAXQ2000評估板中)

串行轉JTAG接口板(MAXQJTAG-001 REV B)

DB9直通串行電纜

兩個 5V 穩壓 (±5%) 直流壁式電源,中心柱正極,CUI Inc. DPR050030-P6 或同等電源

兩個HC49US 8.00MHz晶體

2 × 5 個 0.100 英寸排針

軟件

JTAG演示軟件包

MAX-IDE開發環境MAXQ

用于MAXQ的微控制器工具包(MTK)

設置說明

如果尚未安裝MAX-IDE,請根據MAXQ2000評估板附帶的文檔下載并安裝。

如果尚未安裝MTK,請根據MAXQ2000評估板附帶的文檔下載并安裝。

將LCD子板連接到從機MAXQ3板上的接頭J2000,如上圖1所示。LCD子板應懸掛在MAXQ2000板的頂部。

在兩塊MAXQ8評估板上安裝00.2000MHz晶體(Y1)。

將2×5 JTAG接頭安裝在主MAXQ2000套件的原型設計區,引腳連接到主MAXQ2000引腳,如表1所示。

配置串行轉JTAG板和兩個MAXQ2000評估板上的跳線和DIP開關,如表2所示。

將 DB9 串行電纜從 PC 上的 COM1 端口連接到串行到 JTAG 板上的 J1。

將第一個5V電源連接到串行轉JTAG板上的J2。

將第二個5V電源連接到從MAXQ1評估板上的J2000。

將第一根JTAG電纜從串行轉JTAG板上的P2連接到主MAXQ4板上的J2000。紅線應通向兩個JTAG接頭上的引腳1。

將第二根JTAG電纜從主MAXQ2000板上的原型區JTAG接頭連接到從MAXQ4板上的J2000。紅線應通向兩個JTAG接頭上的引腳1。

編譯和加載JTAG演示

下載JTAG演示軟件包并將其解壓縮到工作目錄中。

啟動 MAX-IDE。

打開兩個 5V 電源的電源。

從菜單中選擇“項目打開項目”,然后選擇 maxqjtag.prj 項目文件將其打開。

從菜單中選擇“調試”。應顯示“生成成功”消息。

從菜單中選擇“調試”。應出現一系列“正在加載”消息,然后是“完成”。

從菜單中選擇“調試”。

關閉最大集成點。

關閉電源。

運行JTAG演示

關閉電源后,斷開DB9串行電纜與串行轉JTAG板的連接。

將DB9電纜連接到主MAXQ5套件板上的J2000。

啟動 MTK。在啟動對話框中選擇“啞終端”。

從菜單中選擇選項。在對話框中,將端口設置為 COM1,將速度設置為 9600 波特。

從菜單中選擇以 1 波特率的目標

打開電源。

如果應用程序已加載并且所有內容都已正確連接,則以下文本(圖5)將通過串行端口輸出。

poYBAGP0ORKAFNf0AABc1KxwXDw328.gif?imgver=1

圖5.演示應用程序,串行端口提示符。

現在輸入一個 4 位十進制數;之后無需按回車鍵。演示應用程序將完成其剩余操作(主擦除、加載代碼和轉儲代碼),并將輸出結果以及從程序內存轉儲的字節的十六進制值,如圖 6 所示。

pYYBAGP0ORiAC7BMAACUXXsWJIM361.gif?imgver=1

圖6.演示應用程序,串行端口輸出。

結論

通過使用一組標準化命令,MAXQ微控制器提供的JTAG引導加載程序允許外部JTAG主機輕松識別和編程任何MAXQ微控制器。本應用筆記中包含的代碼可作為構建功能齊全的JTAG引導加載程序主應用的起點,該應用能夠識別、初始化、加載和驗證任何支持標準化引導加載程序命令集的MAXQ微控制器的代碼和數據存儲器內容。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7552

    瀏覽量

    151423
  • JTAG
    +關注

    關注

    6

    文章

    400

    瀏覽量

    71687
  • 主機
    +關注

    關注

    0

    文章

    995

    瀏覽量

    35130
收藏 人收藏

    評論

    相關推薦

    MAXQ2000微控制器與MAX4397是如何連接的?

    MAX4397是什么?MAXQ2000微控制器與MAX4397是如何連接的?
    發表于 06-04 06:15

    利用MAXQ2000微控制器實現快速傅里葉變換

    利用MAXQ2000微控制器實現快速傅里葉變換
    發表于 12-13 17:24 ?19次下載
    利用<b class='flag-5'>MAXQ2000</b><b class='flag-5'>微控制器</b><b class='flag-5'>實現</b>快速傅里葉變換

    采用MAXQ2000進行音頻濾波

    集成了乘累加單元(MAC)和單周期內核的MAXQ2000非常適合用作通用微控制器MAXQ2000所具有的性能和I/O外設適合多種應用:如鬧鐘、手持醫療設備、數字讀取等需要低功耗、高
    發表于 12-25 23:24 ?34次下載

    選擇MAXQ2000微控制器和MAX1132 ADC接口的S

    選擇MAXQ2000微控制器和MAX1132 ADC接口的SPI時鐘模式 要:MAXQ2000可采用不同的時鐘模式與MAX1132接口,包括8位、16位或兩者組合。本應用筆記說明了如何選擇SP
    發表于 08-04 09:51 ?551次閱讀
    選擇<b class='flag-5'>MAXQ2000</b><b class='flag-5'>微控制器</b>和MAX1132 ADC接口的S

    MAXQ2000 業內最高MIPS/mA的16位、RISC微

    MAXQ2000 業內最高MIPS/mA的16位、RISC微控制器、低功耗LCD微控制器 MAXQ2000 概述
    發表于 02-06 13:35 ?760次閱讀

    MAXQ2000微控制器軟件I2C驅動

    摘要:I²C (內置于集成電路)是一種2線接口,實現集成電路之間的雙向通信。本應用筆記介紹MAXQ2000微控制器的軟件I²C驅動,它采用
    發表于 04-23 10:17 ?720次閱讀
    <b class='flag-5'>MAXQ2000</b><b class='flag-5'>微控制器</b>軟件I2C驅動

    利用MAXQ2000設計電壓表

    摘要:本應用筆記演示了如何配置MAXQ2000微控制器實現簡單的電壓表設計。該應用采用MAXQ2000評估板,其中包括4½位段式LCD顯示
    發表于 04-23 16:07 ?834次閱讀
    利用<b class='flag-5'>MAXQ2000</b>設計電壓表

    實現MAXQ2000微控制器JTAG加載主機

    摘要:MAXQ®微控制器提供的JTAG啟動加載程序使外部JTAG主機能夠利用一組標準命令
    發表于 04-23 16:22 ?1537次閱讀
    <b class='flag-5'>實現</b><b class='flag-5'>MAXQ2000</b><b class='flag-5'>微控制器</b>的<b class='flag-5'>JTAG</b><b class='flag-5'>加載</b>主機

    采用MAXQ2000進行音頻濾波

    摘要:集成了乘累加單元(MAC)和單周期內核的MAXQ2000非常適合用作通用微控制器(µC) 。MAXQ2000所具有的性能和I/O外設適合多種應用:如鬧鐘、手持醫療設備、數字讀取
    發表于 04-23 17:27 ?1076次閱讀
    采用<b class='flag-5'>MAXQ2000</b>進行音頻濾波

    采用MAXQ2000微控制器和MAX6970 LED驅動

    采用MAXQ2000微控制器和MAX6970 LED驅動顯示不同的LED排序 Abstract: This note shows an application circuit
    發表于 07-25 21:07 ?864次閱讀

    使用uIP堆棧將MAXQ微控制器聯網

    本應用筆記介紹如何使用uIP TCP/IP網絡堆棧將MAXQ?微控制器聯網。常用的SPI?轉以太網IC用作此應用的MAC/PHY。MAXQ2000作為微控制器示例。
    的頭像 發表于 01-11 20:32 ?1211次閱讀
    使用uIP堆棧將<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>聯網

    使用MAXQ2000和MAX7312進行LED打靶練習游戲

    本應用筆記提供了將MAXQ2000微控制器MAXQ20內核)連接至MAX7312 16位端口擴展所需的全部固件。應用示例是一個LED目標練習游戲。示例裝配
    的頭像 發表于 01-14 14:58 ?936次閱讀
    使用<b class='flag-5'>MAXQ2000</b>和MAX7312進行LED打靶練習游戲

    MAXQ2000數據存儲實現軟堆棧

    MAXQ2000微控制器與Maxim的RISC微控制器系列MAXQ器件一樣,都是基于MAXQ20內核。基于
    的頭像 發表于 02-14 18:20 ?809次閱讀

    使用MAXQ2000進行音頻濾波

    乘法累加單元(MAC)和單周期內核的組合使MAXQ2000多功能微控制器(μC)。MAXQ2000具有性能和I/O外設,非常適合許多應用:鬧鐘、手持醫療設備、數字讀數——任何需要低
    的頭像 發表于 03-02 14:13 ?925次閱讀
    使用<b class='flag-5'>MAXQ2000</b>進行音頻濾波

    使用MAXQ2000微控制器進行基于溫度的風扇控制

    MAXQ2000具有眾多的特性,可以創建多種有用的應用,例如通過脈寬調制(PWM)控制風扇的速度。MAXQ2000的眾多特性包括帶PWM和串行外設接口(SPI)的定時。?)和1-Wi
    的頭像 發表于 03-02 14:36 ?1036次閱讀
    使用<b class='flag-5'>MAXQ2000</b><b class='flag-5'>微控制器</b>進行基于溫度的風扇<b class='flag-5'>控制</b>
    主站蜘蛛池模板: 在线观看视频一区二区三区| 在线播放一区二区精品产| 99热免费| 男人的天堂在线精品视频| 一级片免费视频| 1024久久| 手机免费看大片| xxxxxxxx日本69| 色a在线| 曰本裸色私人影院噜噜噜影院| 97精品伊人久久大香线蕉| 午夜黄色福利| www.色播| 91中文在线| 拍真实国产伦偷精品| 天天草夜夜操| 女的扒开尿口让男人桶爽| 六月婷婷网| 加勒比精品视频| 五月亭亭免费高清在线| www.色99| 首页 亚洲 欧美 制服 丝腿| 欧美色图俺去了| 久久国产影视| 无遮挡很爽很污很黄很色的网站| 国产精品久久久久网站| 美国bj69video18| 99久热成人精品视频| 黄a级免费| 欧美日穴| 欧美三级影院| 国产午夜a理论毛片在线影院| 亚洲jjzzjjzz在线观看| 亚洲最新黄色网址| 老师下面很湿很爽很紧| 国产一卡二卡≡卡四卡无人| 欧洲色妇| 免费在线成人| 在线观看免费午夜大片| 欧美色图首页| 在线观看黄色x视频|