實(shí)現(xiàn)MAXQ2000微控制器的JTAG加載主機(jī)
識(shí)別JTAG從機(jī)控制器
啟動(dòng)加載程序啟動(dòng)并運(yùn)行后,下一步是識(shí)別從機(jī)MAXQ微控制器。命令集0的命令0Dh (獲得ID信息)返回一個(gè)長(zhǎng)度可變的ASCII字符串(以零結(jié)束),確定器件和程序ROM版本。作為演示的一部分,我們的實(shí)例程序獲得該信息,然后打印輸出至串口。用于實(shí)現(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
擦除程序存儲(chǔ)器
在對(duì)MAXQ2000包含的閃存程序存儲(chǔ)器進(jìn)行編程之前,必須擦除它(設(shè)置為0FFFFh)。JTAG演示應(yīng)用程序發(fā)送02h (主機(jī)擦除)啟動(dòng)加載程序命令,指示啟動(dòng)加載程序擦除所有的程序和數(shù)據(jù)存儲(chǔ)器,從而擦除閃存。該命令還清除了密碼鎖定位,使能所有支持的命令集。取決于MAXQ器件,這一02h (主機(jī)擦除)命令可能需要幾秒鐘的時(shí)間來(lái)完成。由于這是一個(gè)單字節(jié)命令,確定該命令什么時(shí)候完成的最簡(jiǎn)單方法是不斷發(fā)送無(wú)操作(00h)命令,其后是1毫秒的延遲,直到啟動(dòng)加載程序返回3Eh,表明命令已經(jīng)完成。下面的 masterErase例程說(shuō)明了這一方法。
;==============================================================================;=;= 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 (或者任何其他啟動(dòng)加載程序命令)完成后,可利用04h (獲得狀態(tài))命令來(lái)確定命令是否成功完成。獲得狀態(tài)命令返回兩個(gè)數(shù)據(jù)字節(jié):一個(gè)字節(jié)含有狀態(tài)標(biāo)志(說(shuō)明密碼鎖定設(shè)置/解除設(shè)置、字/字節(jié)模式有效以及其他信息),第二個(gè)字節(jié)是單字節(jié)狀態(tài)碼。如果最后一條命令成功完成,狀態(tài)碼總是00h (無(wú)錯(cuò)誤)。非零狀態(tài)碼指示有錯(cuò)誤。MAXQ2000用戶(hù)指南附錄(English only)列出了所有的狀態(tài)碼;這里列出了幾個(gè)常見(jiàn)錯(cuò)誤碼。
- 01h/02h—不支持命令集/無(wú)效命令。這些錯(cuò)誤代碼通常指示JTAG主機(jī)出現(xiàn)通信干擾或者校準(zhǔn)錯(cuò)誤。如果對(duì)于某一命令代碼,JTAG主機(jī)發(fā)送的字節(jié)多于(或者少于)啟動(dòng)加載程序預(yù)期的字節(jié),啟動(dòng)加載程序會(huì)把數(shù)據(jù)字節(jié)之一理解為新命令開(kāi)始。
- 03h—密碼不匹配。這一錯(cuò)誤代碼通常指示JTAG主機(jī)在沒(méi)有清除密碼鎖定之前,試圖使用受到密碼保護(hù)的命令(一般包括不在命令集0中的命令)。如果JTAG主機(jī)訪(fǎng)問(wèn)的部分已經(jīng)有裝入字節(jié)地址0010h – 001Fh的代碼,則會(huì)出現(xiàn)這一錯(cuò)誤。在這種情況下,這一部分必須被主機(jī)擦除,或者使用密碼匹配命令(03h)來(lái)解鎖這一部分。
- 05h—驗(yàn)證失敗。對(duì)于裝入/驗(yàn)證或者驗(yàn)證命令,驗(yàn)證步驟失敗。通信干擾會(huì)導(dǎo)致這一錯(cuò)誤,或者對(duì)以前已經(jīng)編程過(guò)的閃存沒(méi)有擦除就進(jìn)行重新編程也會(huì)出現(xiàn)這一錯(cuò)誤。
將代碼裝入程序存儲(chǔ)器
為演示JTAG啟動(dòng)加載程序的功能,演示應(yīng)用程序需要通過(guò)JTAG連接,把代碼裝入到從機(jī)MAXQ2000中。在這個(gè)例子中,裝入的代碼是一個(gè)簡(jiǎn)單例程,它啟動(dòng)LCD控制器,在LCD顯示屏上顯示一個(gè)4位數(shù)。裝入MAXQ2000的代碼基于下面的簡(jiǎn)單演示工程。
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é),而不是從硬件編碼的十六進(jìn)制文件中裝入(當(dāng)采用MTK或者M(jìn)AX-IDE裝入代碼時(shí)會(huì)有這種情況),因此,演示應(yīng)用程序會(huì)根據(jù)用戶(hù)輸入來(lái)修改裝入的應(yīng)用程序。
在裝入代碼前,JTAG通信演示應(yīng)用程序首先告訴用戶(hù)輸入一個(gè)4位十進(jìn)制數(shù),然后修改要裝入的應(yīng)用程序,如下所示。
- LCD上顯示的數(shù)字是用戶(hù)輸入的4位數(shù)。
- 密碼區(qū)的前4個(gè)字節(jié)(從字地址010h開(kāi)始)被設(shè)置為用戶(hù)輸入的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以同樣的方式裝入其他兩個(gè)存儲(chǔ)器代碼塊。
驗(yàn)證程序存儲(chǔ)器代碼
一旦裝入代碼后,有幾種方法來(lái)驗(yàn)證是否正確裝入。- 沒(méi)有使用裝入代碼可變長(zhǎng)度命令(10h),而是使用裝入和驗(yàn)證代碼可變長(zhǎng)度命令(50h)。后一命令結(jié)合了代碼裝入操作和驗(yàn)證步驟。
- 或者,也可以調(diào)用驗(yàn)證代碼可變長(zhǎng)度命令(40h)來(lái)單獨(dú)
評(píng)論