新闻中心

EEPW首页>模拟技术>设计应用> 实现MAXQ2000微控制器的JTAG加载主机

实现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)

识别从机控制器

启动加载程序启动并运行后,下一步是识别从机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 oncommunication 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 thelines 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

擦除程序存储器

在对包含的闪存程序存储器进行编程之前,必须擦除它(设置为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 (无错误)。非零状态码指示有错误。用户指南附录(English only)列出了所有的状态码;这里列出了几个常见错误码。
  • 01h/02h—不支持命令集/无效命令。这些错误代码通常指示JTAG主机出现通信干扰或者校准错误。如果对于某一命令代码,JTAG主机发送的字节多于(或者少于)启动加载程序预期的字节,启动加载程序会把数据字节之一理解为新命令开始。
  • 03h—密码不匹配。这一错误代码通常指示JTAG主机在没有清除密码锁定之前,试图使用受到密码保护的命令(一般包括不在命令集0中的命令)。如果JTAG主机访问的部分已经有装入字节地址0010h – 001Fh的代码,则会出现这一错误。在这种情况下,这一部分必须被主机擦除,或者使用密码匹配命令(03h)来解锁这一部分。
  • 05h—验证失败。对于装入/验证或者验证命令,验证步骤失败。通信干扰会导致这一错误,或者对以前已经编程过的闪存没有擦除就进行重新编程也会出现这一错误。

将代码装入程序存储器

为演示JTAG启动加载程序的功能,演示应用程序需要通过JTAG连接,把代码装入到从机中。在这个例子中,装入的代码是一个简单例程,它启动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位十进制数,然后修改要装入的应用程序,如下所示。
  • LCD上显示的数字是用户输入的4位数。
  • 密码区的前4个字节(从字地址010h开始)被设置为用户输入的4字符ASCII值。
演示应用程序三次调用启动加载程序命令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
以同样的方式装入其他两个存储器代码块。

验证程序存储器代码

一旦装入代码后,有几种方法来验证是否正确装入。
  • 没有使用装入代码可变长度命令(10h),而是使用装入和验证代码可变长度命令(50h)。后一命令结合了代码装入操作和验证步骤。
  • 或者,也可以调用验证代码可变长度命令(40h)来单独

评论


相关推荐

技术专区

关闭