新闻中心

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

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

作者: 时间:2012-03-19 来源:网络 收藏
移出时,状态机保持在Shift-IR或者Shift-DR状态。在最后一个比特周期,TMS必须被驱动为高电平,这样,随着最后一位的输入和输出,TAP控制器将进入Exit1-DR或者Exit1-IR状态。

作为一个例子,在表4中,主机将数值100b (系统编程模式)移入到IR寄存器中。IR寄存器开始设置旁路值011b;TAP控制器最初为Run-Test-Idle状态。如下面的图4所示,比特以最低有效位在前、最高有效位在后移入(移出)TAP控制器。因此,在第一个移位周期,新数值的第0位被移入,旧数值的第0位被移出。

表4. 指令寄存器移位实例
TCK TMS TDI TDO TAP State Shift Register Instruction Register
bit 2 bit 1 bit 0 bit 2 bit 1 bit 0
0 1 x x Run-Test-Idle x x x 0 1 1
1 1 x x Select-DR-Scan x x x 0 1 1
0 1 x x Select-DR-Scan x x x 0 1 1
1 1 x x Select-IR-Scan x x x 0 1 1
0 0 x x Select-IR-Scan x x x 0 1 1
1 0 x x Capture-IR 0 0 1 0 1 1
0 0 x x Capture-IR 0 0 1 0 1 1
1 0 x x Shift-IR 0 0 1 0 1 1
0 0 0 x Shift-IR 0 0 1 0 1 1
1 0 0 x Shift-IR 0 0 1 0 1 1
0 0 0 1 Shift-IR 0 0 0 0 1 1
1 0 0 1 Shift-IR 0 0 0 0 1 1
0 1 1 0 Shift-IR 0 0 0 0 1 1
1 1 1 0 Exit1-IR 0 0 0 0 1 1
0 1 x 0 Exit1-IR 1 0 0 0 1 1
1 1 x 0 Update-IR 1 0 0 1 0 0
0 0 x x Update-IR 1 0 0 1 0 0
1 0 x x Run-Test-Idle x x x 1 0 0

下面是执行这一操作的例程shiftIR3。

;==============================================================================;=;= shiftIR3;= clock0, clock1, shift;=;= Shifts a 3-bit value into the IR register.;=;= Inputs : A[0] - Low three bits contain value to shift into IR;= Outputs : None;= Destroys : AP, APC, A[0], PSW, LC[0];=shiftIR3:move APC, #80h ; Acc => A[0], turn off auto inc/deccall clock1 ; (Select DR Scan)call clock1 ; (Select IR Scan)call clock0 ; (Capture IR - loads 001b to shift register)call clock0 ; (Shift IR)move TMS, #0 ; Drive TMS low move C, TDO ; xxxxx210 c = srrc ; sxxxxx21 c = 0call shift ; Shift in IR bit 0rrc ; ssxxxxx2 c = 1call shift ; Shift in IR bit 1rrc ; sssxxxxx c = 2move TMS, #1 ; Drive TMS high for last bitcall shift ; Shift in IR bit 2 (Exit1 IR)call clock1 ; (Update IR)call clock0 ; (Run Test Idle)ret

写入TAP数据寄存器

数值移入或者移出TAP控制器DR的操作与装入/卸载IR的方式相似。通常,只有当IR被设置为两个数值之一时才能进行这一操作:100b (使TAP控制器进入系统编程模式)或者010b (使TAP控制器进入调试模式)。

激活系统编程模式后,装入和卸载DR寄存器的操作如下。
  • DR寄存器移入和移出宽度为3比特。所有三个比特都代表有效数据。
  • 当到达Update-DR状态时,送入DR寄存器的数值被复制到从机的内部系统编程寄存器中。这三个比特的用法如下。
    • 从机可访问第0位(读/写),它作为寄存器位ICDF.1 (SPE),也被称为系统编程使能位。复位后,程序ROM检查该位,确定应进入启动加载程序模式(SPE = 1)还是正常程序执行模式(SPE = 0)。
    • 从机可访问第1位和第2位(读/写),它作为寄存器位ICDF.2-3 (PSS0-PSS1),也被称为编程源选择位。对于能够为启动加载程序提供多个接口的微控制器,例如,这些位用于当SPE = 1时应选择哪一启动加载程序接口。当SPE = 0 (正常程序执行模式)时,这些位的设置不起作用。
  • DR寄存器传送出去的数值是系统编程寄存器以前的数值(当进入Capture-DR状态后,锁存到移位寄存器中)。
激活系统编程模式后,装入和卸载DR寄存器的操作如下。
  • DR寄存器移入和移出宽度为10比特。对于移出数据,所有10个比特都代表有效数据(8个数据位和2个状态位)。对于移入数据,只使用了8个数据位;没有使用两个状态位。
  • 然后,将移入DR寄存器的高8位卸载,作为启动加载程序命令的一部分,被启动加载程序(从程序ROM中运行)读取。
  • 移出DR寄存器的10个比特含有8位由启动加载程序装入的数值(作为命令输出的一部分),以及由TAP控制器设置的两个状态信息位。
;==============================================================================;=;= shiftDR3;=;= Shifts a 3-bit value into the DR register. This operation should only be;= performed when IR =100b (System Programming Mode).;=;= Inputs : A[0] - Low 3 bits contain value to shift into SPB (PSS1:PSS0:SPE);= Outputs : None;= Destroys : AP, APC, A[0], PSW, LC[0]shiftDR3:move APC, #80h ; Acc => A[0], turn off auto inc/deccall clock1 ; (Select DR Scan)call clock0 ; (Capture DR)call clock0 ; (Shift DR)move TMS, #0 ; Drive TMS low move C, TDO ; xxxxx210 c = srrc ; sxxxxx21 c = 0call shift ; Shift in DR bit 0rrc ; ssxxxxx2 c = 1call shift ; Shift in DR bit 1rrc ; sssxxxxx c = 2move TMS, #1 ; Drive TMS high for last bitcall shift ; Shift in DR bit 2 (Exit1 DR)call clock1 ; (Update DR)call clock0 ; (Run Test Idle)ret;==============================================================================;=;= shiftDR;= clock0, clock1, shift;=;= Shifts a 10-bit value into and out of the DR register. This operation ;= should only be performed when IR = 010b (Debug/Loader Mode).;=;= Inputs : A[0] - Byte value (input) to shift into DR;= Outputs : A[0] - Byte value (output) shifted out of DR;= A[1] - Low two bits are status bits 1:0 shifted out of DR;= A[15] - Byte value shifted in, cached for use by shiftDR_next;= Destroys : AP, APC, PSW, LC[0]shiftDR:move APC, #80h ; Acc => A[0], turn off auto inc/decmove A[15], A[0] ; Cache input byte value for use by shiftDR_nextsla2 ; Add two empty bits (for status)call clock1 ; (Select DR Scan)call clock0 ; (Capture DR)call clock0 ; (Shift DR)move TMS, #0 ; Drive TMS low move C, TDO ; xxxxxxxx76543210 c = s
        
        
        

评论


相关推荐

技术专区

关闭