新闻中心

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

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

作者: 时间:2012-03-19 来源:网络 收藏
示。TAP状态机中有16个分立状态。根据TMS信号值,在TCK的上升沿从一个状态向下一个状态转变。例如,如果TAP控制器处于Select-DR-Scan状态,TCK出现了上升沿:
  • 如果TMS = 1,TAP控制器将转换到Select-IR-Scan状态。
  • 如果TMS = 0,TAP控制器将转换到Capture-DR状态。
通过这种方式,TAP控制器能够同步到任何需要的状态。对状态图(图2)需要注意两点:
  • 5个'1'转换(保持TMS高电平,同步TCK 5个周期)总是使状态机回到Test-Logic-Reset,而不论起始状态如何。这表明,如果不确定TAP控制器当前的状态,或者在某些情况下主机和从机间的通信中断,总是可以通过同步5个'1'转换,使TAP控制器回到已知状态。
  • 即使TCK时钟继续运行,也可以暂停通信,不确定地保持在Run-Test-Idle、Pause-DR或者Pause-IR状态,而不影响TAP控制器的状态。
实现MAXQ2000微控制器的JTAG加载主机
图2. 测试访问端口(TAP)状态机

TAP控制器的状态机提供对两个控制寄存器的访问,而寄存器提供启动加载程序接口、调试接口以及其他功能。
  • IR (指令寄存器)宽度总是3位。该寄存器可以用作指数寄存器,控制DR的功能(参见下面)。
  • DR (数据寄存器)是TAP控制器中几个寄存器的访问点。当比特移入或者移出DR时实际访问的寄存器取决于IR当前值。
实现MAXQ2000微控制器的JTAG加载主机
图3. TAP控制器中的寄存器访问

如图3所示,DR根据IR值而指向三个内部寄存器之一。
  • 如果IR = 011b,TAP控制器处于Bypass模式。在这一模式下(这是TAP控制器的默认模式),通过TDO,移入到DR (通过TDI)的数据被直接移回送出。通过TAP控制器移动数据并没有改变内部寄存器。
  • 设置IR = 100b,使TAP控制器处于System Programming模式。在这种模式下,移入DR中的数据被移入到3位系统编程寄存器中。该寄存器(也可以通过MAXQICDF寄存器的[3:1]位进行访问)控制MAXQ复位后进入正常程序执行模式还是启动加载程序模式。如果使能启动加载程序模式,它还控制启动加载程序使用哪一接口(、串口或者SPI)。
  • 设置IR = 010b,使TAP控制器进入Debug模式。在这一模式下,移入DR的数据被移入到内部10位调试寄存器中,可以被启动加载程序读取。启动加载程序输出的数据也通过该寄存器,在TDO上被移回送出(以及两个状态位)。该寄存器被用于启动加载程序模式和在线调试模式时的数据传送。
在上面讨论的三种模式中,Bypass模式是"非工作"模式;它并不使用我们感兴趣的启动加载程序功能。System Programming模式虽然有这样的名称,但实际上并不用于启动加载程序的通信,只是使能对它的访问。一旦激活启动加载程序,开始进行通信,不再使用TAP模式。Debug模式可以访问10位输入/输出寄存器,用于实现启动加载程序的所有通信功能。一旦使能了启动加载程序,在加载部分完成之前,只使用这一TAP控制器模式。

控制JTAG端口和复位线

从机(TMS, TCK, TDO和TDI) JTAG/TAP端口的四条线以及nRESET线分别连接至主机的一个端口引脚。控制JTAG接口的第一步是正确配置这些线。
#define TCK PO0.0 ; Test Clock - Master output#define TDO PI0.1 ; Test Data Out - Slave output, master input#define TMS PO0.2 ; Test Mode Sel - Master output#define TDI PO0.3 ; Test Data In - Master output#define RST PD0.4 ; Reset - Master open-drain output (on 1)
四条JTAG线工作在标准驱动模式下。从主机角度看,TMS、TCK和TDI总是被驱动为输出,而TDO (由从机驱动)总是为输入。JTAG线的方向固定,不是双向的。nRESET线是特殊情况,被配置为主机侧开漏输出。通常,从机将自己的nRESET线拉至高电平,因此,主机只能将该线拉低(复位从机时),或者完全释放它(在其他所有时间)。主机不应将从机的nRESET线驱动为高电平。
;==============================================================================;=;= initializeJTAG;=;= Sets up the port pins for the JTAG interface.;=;= Inputs : None;= Outputs : None;= Destroys : None;=initializeJTAG:move PD0.0, #1 ; TCK - master outputmove PO0.0, #1 ; Drive highmove PD0.1, #0 ; TDO - master inputmove PO0.1, #1 ; Weak pullup onmove PD0.2, #1 ; TMS - master outputmove PO0.2, #1 ; Drive lowmove PD0.3, #1 ; TDI - master outputmove PO0.3, #1 ; Drive highmove PD0.4, #0 ; RST - open drain when 1, tristate when 0move PO0.4, #0 ; Weak pullup offret
端口引脚初始化之后,采用例程clock0和clock1来同步TMS线上的静态0和1,使TAP控制器从一个状态转换到另一状态。只要JTAG时钟速率保持低于从机系统时钟速率1/8的最大值,JTAG时钟可以采用任何频率。这里不需要考虑主机的系统时钟速率;它不需要和从机系统时钟速率相匹配。主机可以比从机运行的快或者慢,而不会导致出现JTAG通信问题。

由于这一例子中的从机安装了8MHz时钟晶振,主机能够驱动JTAG时钟达到1MHz,而不会出现问题。对于这个例子,100kHz JTAG时钟足够了。
#define JCLOCK 40 ; 100kHz : (((10us / (1/8MHz)) / 2);==============================================================================;=;= clock0;=;= Clocks a zero TMS bit into the JTAG interface.;=;= Inputs : None;= Outputs : None;= Destroys : LC[0]clock0:move TMS, #0 ; Drive TMS lowmove LC[0], #JCLOCKdjnz LC[0], $move TCK, #1 ; Clock rising edgemove LC[0], #JCLOCKdjnz LC[0], $move TCK, #0 ; Clock falling edgemove LC[0], #JCLOCKdjnz LC[0], $ret;==============================================================================;=;= clock1;=;= Clocks a one TMS bit into the JTAG interface.;=;= Inputs : None;= Outputs : None;= Destroys : LC[0]clock1:move TMS, #1 ; Drive TMS highmove LC[0], #JCLOCKdjnz LC[0], $move TCK, #1 ; Clock rising edgemove LC[0], #JCLOCKdjnz LC[0], $move TCK, #0 ; Clock falling edgemove LC[0], #JCLOCKdjnz LC[0], $ret
利用这两个例程,我们可以增加另一个例程来初始化TAP控制器,迫使它回到Test-Logic-Reset状态。注意Test-Logic-Reset状态,正如其名称的含义,它对TAP逻辑进行彻底复位,包括确定启动加载程序是否使能以及启动加载程序使用哪一接口位(SPE和PSS[1:0])。因此,一旦进入启动加载程序模式,设置TAP控制器为Test-Logic-Reset,对器件进行复位,退出启动加载程序模式。演示应用程序中使用的JTAG例程(除了testLogicReset本身之外)都假定TAP控制器在例程启动时处于Run-Test-Idle状态。在JTAG通信期间,TAP控制器在不同状态间转换;例程最后,TAP控制器总是返回到Run-Test-Idle。
;==============================================================================;=;= testLogicReset;= clock0, clock1;=;= Resets the JTAG/TAP controller to its starting state.;=;= Inputs : None;= Outputs : None;= Destroys : LC[0];=testLogicReset:call clock1call clock1call clock1call clock1call clock1call clock1call clock1call clock0 ; Brings us to Run-Test-Idleret

写入TAP指令寄存器

TAP状态机向下转换到Shift-IR状态,同步输入一个新的3位数值,将数值装入TAP控制器的IR。在进入Update-IR状态之前,该数值并没有实际从移位寄存器复制到指令寄存器中。

对于所有的JTAG移位寄存器操作,随着新数值的移入,寄存器的当前内容被移出(由TDO)。但是,移出的数值总是固定的(001b);这是由JTAG标准在测试JTAG接口功能时决定的。

比特移入和移出移位寄存器的过程(IR或者DR)是一样的;TAP状态机必须分别处于Shift-IR或者Shift-DR状态,TAP控制器在每个TCK周期的上升沿对输入比特(在TDI)进行采样,而在TCK周期下降沿驱动输出比特(在TDO)。
;==============================================================================;=;= shift;=;= In a shift register state, clocks in a TDI bit and clocks out a TDO bit.;=;= Inputs : C - Bit to shift in to TDI.;= Outputs : C - Bit shifted out from TDO.;= Destroys : PSW, LC[0];=shift:jump C, shift_bit1shift_bit0:move TDI, #0 ; Shift in zero bitjump shift_bitEndshift_bit1:move TDI, #1 ; Shift in one bitjump shift_bitEndshift_bitEnd:move LC[0], #JCLOCKdjnz LC[0], $move TCK, #1 ; Rising edge, TDI is sampledmove LC[0], #JCLOCKdjnz LC[0], $move TCK, #0 ; Falling edge, TDO is driven outmove LC[0], #JCLOCKdjnz LC[0], $move C, TDO ; Latch TDO valueret
对于传送的每一位,除了最后一位之外,TMS必须保持低电平。这非常重要,因为当每一位移入和


评论


相关推荐

技术专区

关闭