实现MAXQ2000微控制器的JTAG加载主机

时间:2012-03-19来源:网络
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)

识别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    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包含的闪存程序存储器进行编程之前,必须擦除它(设置为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    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

重新获得状态信息

MasterErase (或者任何其他启动加载程序命令)完成后,可利用04h (获得状态)命令来确定命令是否成功完成。获得状态命令返回两个数据字节:一个字节含有状态标志(说明密码锁定设置/解除设置、字/字节模式有效以及其他信息),第二个字节是单字节状态码。

如果最后一条命令成功完成,状态码总是00h (无错误)。非零状态码指示有错误。MAXQ2000用户指南附录(English only)列出了所有的状态码;这里列出了几个常见错误码。

将代码装入程序存储器

为演示JTAG启动加载程序的功能,演示应用程序需要通过JTAG连接,把代码装入到从机MAXQ2000中。在这个例子中,装入的代码是一个简单例程,它启动LCD控制器,在LCD显示屏上显示一个4位数。

装入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   $
然而,由于我们是从演示应用程序中装入代码字节,而不是从硬件编码的十六进制文件中装入(当采用MTK或者MAX-IDE装入代码时会有这种情况),因此,演示应用程序会根据用户输入来修改装入的应用程序。

在装入代码前,JTAG通信演示应用程序首先告诉用户输入一个4位十进制数,然后修改要装入的应用程序,如下所示。 演示应用程序三次调用启动加载程序命令10h (装入代码,可变长度)来装入应用代码。这一命令的参数包括:装入的字节数(当装入代码存储器时必须是偶数,以保证字对齐);启动地址;当然,还有数据本身。MAXQ存储器为little-endian方式,因此,应用程序必须首先发送每一程序字的最低有效字节。
   ;;;;;;;;  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
以同样的方式装入其他两个存储器代码块。

验证程序存储器代码

一旦装入代码后,有几种方法来验证是否正确装入。

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版