實現(xiàn)MAXQ2000微控制器的JTAG加載主機
識別JTAG從機控制器
啟動加載程序啟動并運行后,下一步是識別從機MAXQ微控制器。命令集0的命令0Dh (獲得ID信息)返回一個長度可變的ASCII字符串(以零結(jié)束),確定器件和程序ROM版本。作為演示的一部分,我們的實例程序獲得該信息,然后打印輸出至串口。用于實現(xiàn)該功能的例程是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 waitForPromptjump C, getBanner_failmove Acc, #CMD_GET_ROM_BANNERcall shiftDRmove Acc, #00hcall shiftDRgetBanner_loop:move Acc, #00hcall shiftDRcmp #0FFh ; The banner is ASCII, so receiving this character; most likely indicates that the JTAG lines are; floating high and that no device is connectedjump E, getBanner_failjump Z, getBanner_donecall txCharjump getBanner_loopgetBanner_done:call txNewlinejump getBanner_passgetBanner_fail:move C, #1 retgetBanner_pass:move C, #0ret
擦除程序存儲器
在對MAXQ2000包含的閃存程序存儲器進行編程之前,必須擦除它(設(shè)置為0FFFFh)。JTAG演示應(yīng)用程序發(fā)送02h (主機擦除)啟動加載程序命令,指示啟動加載程序擦除所有的程序和數(shù)據(jù)存儲器,從而擦除閃存。該命令還清除了密碼鎖定位,使能所有支持的命令集。取決于MAXQ器件,這一02h (主機擦除)命令可能需要幾秒鐘的時間來完成。由于這是一個單字節(jié)命令,確定該命令什么時候完成的最簡單方法是不斷發(fā)送無操作(00h)命令,其后是1毫秒的延遲,直到啟動加載程序返回3Eh,表明命令已經(jīng)完成。下面的 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 waitForPromptjump C, masterErase_failmove Acc, #CMD_MASTER_ERASEcall shiftDRmove Acc, #00hcall shiftDRmove LC[1], #5000 ; Number of retries before returning an errormasterErase_loop:move Acc, #CMD_NOPcall shiftDRcmp #3Ehjump E, masterErase_passmove LC[0], #8000 ; Delay for about a milliseconddjnz LC[0], $djnz LC[1], masterErase_loopmasterErase_pass:move C, #0retmasterErase_fail:move C, #1ret
重新獲得狀態(tài)信息
MasterErase (或者任何其他啟動加載程序命令)完成后,可利用04h (獲得狀態(tài))命令來確定命令是否成功完成。獲得狀態(tài)命令返回兩個數(shù)據(jù)字節(jié):一個字節(jié)含有狀態(tài)標志(說明密碼鎖定設(shè)置/解除設(shè)置、字/字節(jié)模式有效以及其他信息),第二個字節(jié)是單字節(jié)狀態(tài)碼。如果最后一條命令成功完成,狀態(tài)碼總是00h (無錯誤)。非零狀態(tài)碼指示有錯誤。MAXQ2000用戶指南附錄(English only)列出了所有的狀態(tài)碼;這里列出了幾個常見錯誤碼。
- 01h/02h—不支持命令集/無效命令。這些錯誤代碼通常指示JTAG主機出現(xiàn)通信干擾或者校準錯誤。如果對于某一命令代碼,JTAG主機發(fā)送的字節(jié)多于(或者少于)啟動加載程序預(yù)期的字節(jié),啟動加載程序會把數(shù)據(jù)字節(jié)之一理解為新命令開始。
- 03h—密碼不匹配。這一錯誤代碼通常指示JTAG主機在沒有清除密碼鎖定之前,試圖使用受到密碼保護的命令(一般包括不在命令集0中的命令)。如果JTAG主機訪問的部分已經(jīng)有裝入字節(jié)地址0010h – 001Fh的代碼,則會出現(xiàn)這一錯誤。在這種情況下,這一部分必須被主機擦除,或者使用密碼匹配命令(03h)來解鎖這一部分。
- 05h—驗證失敗。對于裝入/驗證或者驗證命令,驗證步驟失敗。通信干擾會導(dǎo)致這一錯誤,或者對以前已經(jīng)編程過的閃存沒有擦除就進行重新編程也會出現(xiàn)這一錯誤。
將代碼裝入程序存儲器
為演示JTAG啟動加載程序的功能,演示應(yīng)用程序需要通過JTAG連接,把代碼裝入到從機MAXQ2000中。在這個例子中,裝入的代碼是一個簡單例程,它啟動LCD控制器,在LCD顯示屏上顯示一個4位數(shù)。裝入MAXQ2000的代碼基于下面的簡單演示工程。
org 0ljump mainorg 20hmain:move LCRA, #03E0h ; xxx0001111100000; 00 - DUTY : Static; 0111 - FRM : Frame freq; 1 - LCCS : HFClk / 128; 1 - LRIG : Ground VADJ; 00000 - LRA : RADJ = Minmove LCFG, #0F3h ; 1111xx11; 1111 - PCF : All segments enabled; 1 - OPM : Normal operation; 1 - DPE : Display enabledmove LCD0, #LCD_CHAR_0move LCD1, #LCD_CHAR_0move LCD2, #LCD_CHAR_0move LCD3, #LCD_CHAR_2move LCD4, #00hsjump $然而,由于我們是從演示應(yīng)用程序中裝入代碼字節(jié),而不是從硬件編碼的十六進制文件中裝入(當采用MTK或者MAX-IDE裝入代碼時會有這種情況),因此,演示應(yīng)用程序會根據(jù)用戶輸入來修改裝入的應(yīng)用程序。
在裝入代碼前,JTAG通信演示應(yīng)用程序首先告訴用戶輸入一個4位十進制數(shù),然后修改要裝入的應(yīng)用程序,如下所示。
- LCD上顯示的數(shù)字是用戶輸入的4位數(shù)。
- 密碼區(qū)的前4個字節(jié)(從字地址010h開始)被設(shè)置為用戶輸入的4字符ASCII值。
;;;;;;;; First load - LJUMP 0020h at start of program memory;;;;move DP[0], #0move @DP[0], #CMD_LOAD_CODE_VARIABLEmove @++DP[0], #4 ; Length - 4 bytesmove @++DP[0], #00h ; AddrL (byte address 0000h)move @++DP[0], #00h ; AddrHmove @++DP[0], #000h ; 00 0B 20 0C - ljump 0020hmove @++DP[0], #00Bhmove @++DP[0], #020hmove @++DP[0], #00Chmove @++DP[0], #000h ; Paddingmove @++DP[0], #000h ; Paddingmove @++DP[0], #55hmove LC[1], DP[0]move DP[0], #0nopcall sendCommandnopjump C, main_failJTAGcall getStatusjump C, main_failJTAGmove Acc, A[3] ; Check that loader status is 00h (no error)jump NZ, main_failStatus以同樣的方式裝入其他兩個存儲器代碼塊。
驗證程序存儲器代碼
一旦裝入代碼后,有幾種方法來驗證是否正確裝入。- 沒有使用裝入代碼可變長度命令(10h),而是使用裝入和驗證代碼可變長度命令(50h)。后一命令結(jié)合了代碼裝入操作和驗證步驟。
- 或者,也可以調(diào)用驗證代碼可變長度命令(40h)來單獨
評論