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

模拟技术 时间:2012-03-19来源:网络
示。TAP状态机中有16个分立状态。根据TMS信号值,在TCK的上升沿从一个状态向下一个状态转变。例如,如果TAP控制器处于Select-DR-Scan状态,TCK出现了上升沿: 通过这种方式,TAP控制器能够同步到任何需要的状态。对状态图(图2)需要注意两点: 实现MAXQ2000微控制器的JTAG加载主机
图2. 测试访问端口(TAP)状态机

TAP控制器的状态机提供对两个控制寄存器的访问,而寄存器提供启动加载程序接口、调试接口以及其他功能。 实现MAXQ2000微控制器的JTAG加载主机
图3. TAP控制器中的寄存器访问

如图3所示,DR根据IR值而指向三个内部寄存器之一。 在上面讨论的三种模式中,Bypass模式是"非工作"模式;它并不使用我们感兴趣的启动加载程序功能。System Programming模式虽然有这样的名称,但实际上并不用于启动加载程序的通信,只是使能对它的访问。一旦激活启动加载程序,开始进行通信,不再使用TAP模式。Debug模式可以访问10位输入/输出寄存器,用于实现启动加载程序的所有通信功能。一旦使能了启动加载程序,在加载部分完成之前,只使用这一TAP控制器模式。

控制JTAG端口和复位线

从机MAXQ2000 (TMS, TCK, TDO和TDI) JTAG/TAP端口的四条线以及nRESET线分别连接至主机MAXQ2000的一个端口引脚。控制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通信问题。

由于这一例子中的从机MAXQ2000安装了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必须保持低电平。这非常重要,因为当每一位移入和
1 2 3 4 5 6 7

关键词: MAXQ2000 微控制器 JTAG

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

或用微信扫描左侧二维码

相关文章

查看电脑版