<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          實現(xiàn)MAXQ2000微控制器的JTAG加載主機

          作者: 時間:2012-03-19 來源:網(wǎng)絡(luò) 收藏
          D>100xxxxC x hFamily C—Fixed-Length Verify11000000C0hVerify Code Fixed Length11000001C1hVerify Data Fixed Length1101xxxxD x hFamily D—Fixed-Length Load and Verify11010000D0hLoad/Verify Code Fixed Length11010001D1hLoad/Verify Data Fixed Length1110xxxxE x hFamily E —Fixed-Length Erase11100000E0hErase Code Fixed Length11100001E1hErase Data Fixed Length1111xxxxF x hFamily F—Reserved (device specific)

          識別從機控制器

          啟動加載程序啟動并運行后,下一步是識別從機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  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  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

          擦除程序存儲器

          在對包含的閃存程序存儲器進行編程之前,必須擦除它(設(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)碼指示有錯誤。用戶指南附錄(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連接,把代碼裝入到從機中。在這個例子中,裝入的代碼是一個簡單例程,它啟動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值。
          演示應(yīng)用程序三次調(diào)用啟動加載程序命令10h (裝入代碼,可變長度)來裝入應(yīng)用代碼。這一命令的參數(shù)包括:裝入的字節(jié)數(shù)(當裝入代碼存儲器時必須是偶數(shù),以保證字對齊);啟動地址;當然,還有數(shù)據(jù)本身。MAXQ存儲器為little-endian方式,因此,應(yīng)用程序必須首先發(fā)送每一程序字的最低有效字節(jié)。
             ;;;;;;;;  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)來單獨

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

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();