JTAG
JTAG 简介
JTAG(Joint Test Action Group)联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持 JTAG 协议,如 DSP、FPGA 器件等。标准的 JTAG 接口是4线:TMS 、 TCK 、TDI 、TDO ,分别为模式选择、时钟、数据输入和数据输出线。
JTAG 最初是用来对芯片进行测试的,基本原理是在器件内部定义一个 TAP (Test Access Port:测试访问口)通过专用的 JTAG测试工具对进行内部节点进行测试。JTAG 测试允许多个器件通过 JTAG 接口串联在一起,形成一个 JTAG 链,能实现对各个器件分别测试。现在,JTAG 接口还常用于对FLASH等器件进行编程。
JTAG 编程方式是在线编程,传统生产流程中先对芯片进行预编程实现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用 JTAG 编程,从而大大加快工程进度。JTAG 接口可对 PSD 芯片内部的所有部件进行编程。
JTAG 接口定义
- Test Clock Input (TCK)
TCK 在 IEEE1149.1 标准里是强制要求的。TCK 为 TAP 的操作提供了一个独立的、基本的时钟信号,TAP 的所有操作都是通过这个时钟信号来驱动的。
- Test Mode Selection Input (TMS)
TMS 信号在 TCK 的上升沿有效。TMS 在 IEEE1149.1 标准里是强制要求的。TMS 信号用来控制 TAP 状态机的转换。通过TMS 信号,可以控制 TAP 在不同的状态间相互转换。
- Test Data Input (TDI)
TDI 在 IEEE1149.1 标准里是强制要求的。TDI 是数据输入的接口。所有要输入到特定寄存器的数据都是通过 TDI 接口一位一位串行输入的(由 TCK 驱动)。
- Test Data Output (TDO)
TDO 在 IEEE1149.1 标准里是强制要求的。TDO 是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过 TDO 接口一位一位串行输出的(由TCK驱动)。
- Test Reset Input (TRST)
这个信号接口在 IEEE 1149.1 标准里是可选的,并不是强制要求的。TRST 可以用来对 TAP Controller 进行复位(初始化)。因为通过 TMS 也可以对TAP Controll 进行复位(初始化)。所以有四线JTAG与五线JTAG之分。
-VTREF
接口信号电平参考电压一般直接连接 Vsupply 。这个可以用来确定 ARM 的 JTAG 接口使用的逻辑电平(比如3.3V还是5.0V)
- Return Test Clock ( RTCK)
可选项,由目标端反馈给仿真器的时钟信号,用来同步 TCK 信号的产生,不使用时直接接地。
- System Reset (nSRST)
可选项,与目标板上的系统复位信号相连,可以直接对目标系统复位。同时可以检测目标系统的复位情况,为了防止误触发应在目标端加上适当的上拉电阻。
- USER IN
用户自定义输入。可以接到一个 IO 上,用来接受上位机的控制。
- USER OUT
用户自定义输出。可以接到一个 IO 上,用来向上位机的反馈一个状态
由于JTAG经常使用排线连接,为了增强抗干扰能力,在每条信号线间加上地线就出现了这种20针的接口。但事实上,RTCK、USER IN、USER OUT一般都不使用,于是还有一种14针的接口。对于实际开发应用来说,由于实验室电源稳定,电磁环境较好,干扰不大。
ARM J-link仿真器
JTAG仿真器
JTAG 工作原理
jtag如何用于芯片测试呢?其中用到的最主要部件就是边界扫描链。命名为边界扫描链,是由于它位置处于处理器的边界上。我们知道cpu是通过引脚与外围交流的,所有的数据都会通过引脚输入或者输出,而jtag就是通过监控引脚的信号达到芯片测试的目的。而边界扫描链就是在引脚上的一个部件。如下图:
通过边界扫描链,当有信号输入的时候,边界扫描链就能获取信号,当cpu要输出信号的时候,边界扫描链也能获取要输出的信号。另外也可以通过边界扫描链来直接向外部输出信号。无论是信号的抓取还是输出,都需要有接口来保存这些信号,TDI跟TDO就是做这样一些工作的。
边界扫描链保存着引脚上的信号,当通过TDI引脚输入我们自己的信号的时候,会发生沿上面红线方向的移位操作,TDI ——〉边界扫描链 —— 〉 TDO 就能从 TDO 获取边界扫描链上的信号,我们从TDI输入的信号也会到边界扫描链上去
一个完整的软件断点调试示意图如下:
ARM JTAG 调试原理
长按二维码关注公众号后台回复【ARM_JTAG】可获取PDF
参考链接
- JTAG基本原理与调试
https://www.cnblogs.com/TaigaCon/archive/2012/12/20/2826941.html
- JTAG各类接口针脚定义及含义
https://www.cnblogs.com/jeakon/archive/2012/10/07/2813683.html
- JTAG - Insight into JTAG(这篇讲的最透彻)
https://www.cnblogs.com/iamlvshijie/archive/2012/04/14/2486189.html
扫码关注 一起畅聊
深耕在FPGA 扎根于视频领域
卓越于神经网络
- 【Go 语言社区】一个WebSocket的简单Echo例子
- Java基础-day10-代码题-继承&抽象类
- 闪回区空间不足引发的SQL问题分析(r10笔记第32天)
- JavaScript Window - 浏览器对象模型
- 纯CSS实现的圆角折叠菜单特效代码
- MySQL和Oracle中的半连接测试总结(一)(r10笔记第31天)
- 【Go 语言社区】关于select和channel数组的配合使用--转
- Java基础-day09-代码题-对象;类;封装
- MySQL replace into的使用细则(r10笔记第48天)
- Win10下用Anaconda安装TensorFlow
- 【Go 语言社区】跨域问题解决方案:jsonP客户端和服务器代码
- 图;代码轻松理解,代理
- 巧用闪回数据库来查看历史数据 (r10笔记第47天)
- 【Go 语言社区】Golang内存分配
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 剑指Offer LeetCode 面试题40. 最小的k个数
- 剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字
- 解决Ajax发送DELETE请求时后台无法接收到参数的问题(Restful风格)
- 解决layui的table数据重载reload where参数会保留上次条件的问题
- 终于弄懂了Layui表格重载数据
- 剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
- 剑指Offer LeetCode 面试题17. 打印从1到最大的n位数
- 剑指Offer LeetCode 面试题15. 二进制中1的个数
- 剑指Offer LeetCode 面试题11. 旋转数组的最小数字
- 剑指Offer 面试题09. 用两个栈实现队列
- 剑指Offer 面试题06. 从尾到头打印链表
- 剑指Offre 面试题05. 替换空格
- Datatables获取选中行的某一列的数据
- 终于懂了建造者模式
- (力扣)面试题04. 二维数组中的查找