Boundary Scan 初次研究
1 本文用简单直白的方式介绍了边界扫描的原理,用途,实现方法。
2 使用STM32做了一个简单的JTAG时序模拟器。
3 能够测试BYPASS指令,读出ID,以及IO状态。
4 上位机目前空白,有时间在写吧,串口发送实在痛苦。
想必玩过FPGA的都知道FPGA有一个调试的接口叫JTAG,玩过单片机的都知道有个东西叫JLINK,这两个又有啥关系呢 JLink 是个在线仿真器,平时用来烧个程序,在线调试个程序啥的,这其中用的接口协议叫JTAG,(STM有个专用接口叫SWD),现在觉得这个接口调试程序还挺方便的,不过最初设计这个接口的目的可不是这个,有点无心插柳柳成荫的感觉。早年随着大规模集成电路的出现,PCB板制造工艺向小,微方向发展,传统的ICT测试已经没有办法满足这类产品的测试要求。由于芯片的引脚多,元器件体积小,板的密度特别大,根本没有办法用探针进行测试。一种新的测试技术产生了,联合测试行为组织(Joint Test Action Group)简称JTAG, 定义这种新的测试方法即边界扫描测试。就是我们今天要讲的Boundary scan。
借用网上的图来说明
如上图,如果一个芯片的引脚很多,用的还是BGA封装,那么传统方法将无法扎针测量,于是测试人员就想起来了,在芯片内部设计一个移位电路,将所有引脚的状态通过移位方式读出来。那么这样就可以用很小的成本实现可测性。只需两个引脚TDI TDO.
由于移位电路的特性,即使多个芯片也只需将TDI和TDO串联在一起即可,多发几个时钟而已。
于是科研人员就专门制定了标准和接口,所有的IC都按照这个标准执行,接口叫JTAG。 IEEE1149.1标准就是由JTAG这个组织最初提出的,最终由IEEE批准并且标准化的。而实现Boundary Scan 是通过TJAG接口由IC内部的TAP 控制器来实现各种操作。
JTAG接口由四根线组成:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线,(还有可选引脚TRST——测试复位,输入引脚,低电平有效)
TAP Controller 是一个有限状态机,扫描测试的每个环节都由它来控制。TAP Controller 由TMS在时钟上升沿触发,主要有以下三方面的功能:
1 加载Instruction 指令
2 产生控制信号,移入和移出数据
3 执行测试操作,如捕获,转移,更新
BYPASS
IDCODE
EXTEST
SAMPLE/PRELOAD
首先介绍
BYPASS指令
所有的芯片都必须支持这个指令,因为在测试系统中,通常会出现多个芯片,如果仅仅只是想与一个芯片通信,根据移位原理,需要移所有个脚数量的时钟,显然是比较浪费的,通过跳过不测试的芯片用于节省时钟,提高速度,这就是Bypass的功能,但是你会发现这个基于硬件的最小回路(短接)是由移位寄存器实现的,因此不同于直连,需要消耗一个时钟才能将数据移入或移出,这点在后续的数据处理中尤其重要。我也在此处花了很长时间才搞明白。这里留个问题,是否可以通过移入数据和移出数据对比来判断回路中连个多少个IC呢?
IDCODE 指令
顾名思义,这个指令是用来获取被链接芯片的唯一序列号的。注意他是32位的,包含
内容包括IC的生产厂商,芯片类型,版本等,并且在执行这个指令时,并不会影响CPU的正常执行。这里也留一个问题,是否可以通过读出的这个唯一值来判断电路中接的IC是那个型号以及链路中的位置呢?
SAMPLE 指令
这个就是Boundary scan关键的指令用来监控当前引脚的状态。注意执行他的时候并不会影响CPU的正常运行
EXTEST 指令c
这个也是Boundary scan关键的指令用来控制指定引脚的状态。注意执行它的时候会影响CPU的运行,也就是说CPU这时无法控制输出了,而是由发送的命令来控制,当然有点“危险”需要谨慎操作。如外部电路接到了地,本来是输入脚,误被命令配置成了输出拉高,将造成不可逆的损伤,当然这部分会有上位机软件严格来配置执行。
接下来将重点说说TAP ,先来展示一张经典的TAP状态图
先别看这么复杂,其实这里面的 0和1 指的是TMS引脚的状态,在每次TCLK的上升沿通过改变TMS的高低来切换不同状态。而DR指的是数据寄存器,IR指的是指令寄存器。
这里面有个重点就是数据的位宽并不是我们通常C里面的8位 16位这些,而是在BSDL文件中定义的。这个在后续写程序中也尤其重要。
那什么是BSDL文件呢,这个是每一个IC的身份文件,用来描述引脚的位置,数量,排列以及支持哪些命令等等信息,可以在官网免费下载的到。我们以STM32为例,可以在如下网址下载
Search - STMicroelectronics
打开后有没有点似曾相识,他其实就是一份VHDL写的硬件描述信息,最开始定义引脚信息,往后看到了
这个就是
这个就是它所支持的命令,看到了吧。位宽只有5位。用单片机发这玩意就是折腾。
本人熟悉单片机想着先用单片机试试写个简单的时序来玩玩。于是找来了两个STM32F103的核心板。简单的用杜邦线搭起来。写个时序。
顺便把逻辑分析仪也加上,初次验证似乎不太顺利。
发了命令怎么回的乱七八糟的,一堆0101的看不懂。仔细翻看协议,原来是要先发送LSB.
先试下读ID吧
完全没看懂,不过似乎读出的值没变,但解析出来的值,怎么看着都不对
根据手册中的值,应该是0x16410041呀。难道命令发错了。于是又试了下BYPASS指令
随便发了点数据,总算发现规律了原来,数据发生了移位。但为啥移了两位不是以为吗?
再仔细看手册,原来STM32内部可不是一个TAP控制器,还有个SWD的,要两个时钟才能移出原数据,这下对上了。
在回去看下读ID的命令,
将数据左移移位,然后在高低bit反转,果然解析出来的数据就是0x16410041。
命令找到了,数据位也对上了。接下来就是正常的发命令读写就是了。
不过这玩意最好还是搞个上位机,数据量太大了。
本文所用到的源工程, 源文件,参考PDF和BSDL文件,上传CSDN,供大家学习参考。共同交流。文章来源:https://www.toymoban.com/news/detail-615306.html
下载网址 https://download.csdn.net/download/snail_dongbin/87695314文章来源地址https://www.toymoban.com/news/detail-615306.html
到了这里,关于[] 边界扫描(Boundary Scan) 初次研究的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!