kingsabbit 发表于 2012-9-4 01:27:11

深夜了,解开JTAG困扰前进和孕龙逻辑分析仪解码插件BUG的分析

搞JTAG时序搞了大半个月,从刚开始消化资料到能通过JTAG读取取LPC1768的芯片ID,熟悉TAP状态机和TCK,TMS,TDI,TD之间的关系,虽然初步想法实现了,但也被目前JTAG解码问题一直困扰了很多天.

从平时周立功的解码插件和孕龙的解码插件来看,个人感觉都不成熟,像孕龙的插件,如果花几千块买到这样不成熟的插件分析数据会走不少弯路,今晚于是对孕龙插件存在问题的BUG从分析,希望厂家能处理,不要像几年前和周工在逻辑分析仪上原本不存在PS2的仪器上增加PS2为何不能实现的问题被周立功否决.那时某型号上没有PS2,结果和周立功的工程师沟通说无法支持,其实当时是想到周功的仪器是用硬件触发的,解码就不清楚是否和硬件有关,但我想到如果硬解频率达不到要求做不到,采集回来的数据为何就不能做,阿莫的开源项目不是取回来后软解吗?当时听到周工的工程师那种自高自大的语气,只有他才是最有权威的,再联想到仿年TKS停止开发,究其原因是JLINK山塞了周功的仪器卖不出去了没人用TKS了还是TKS软件开发过程中没听取别人意见自行自我的,让原来的用户转多去别的开发平台了呢?再想到几天前微博上周功的职员和某位技术牛人的对战,周功应该想想这个问题.题外话不说了.

JTAG TAP时序图(图1)


启动孕龙LA逻辑分析仪(图2)


连接线后获取数据设置解码插件(图3)


如下结果是通过JTAG读取LPC1768的ID(0x4BA00477)(图4)


孕龙解码插件解码结果(图5):


解码插件错误分析:
关于shift_IR BUG分析
Shift_IR程序测试代码(图6)


从图中可知发送出去的TDI数据为1110,16进制结果为0x0e
BUG1:孕龙解码插件解码结果(IR)如下(图7)


分析错误理由:
1.        进入Capture IR后在TMS=1时TCK的上升沿时进入shift-IR
2.        软件移出4bit其间,在第3bit时将TMS=1,在第4bit时移出数据的同时进入Exit-IR

3.        根据JTAG协议,TDI在TCK上升沿前输出,下降沿时TDO采集.上图中samplePoit的下降沿后才对TDO采集,因此得到的结果(图8),TDI结果为1110即0x0e,TDO结果为0001,即0x01.孕龙解码结果为TDI=0x1D,TDO=0x03是完全错误的分析结果

4.        同理孕龙的在Capture-DR到shift-DR同样出现该问题

BUG2:TDI解码时shift_DR或IR解码7bit当一字节,留下1bit当另一字节,TDO解码却没有些事发生(图9)


根据BUG的原理分析如下(图10)


正确的解码结果应该是TDI=0xff,TDO=0x4B,而孕龙的解码结果TDI=0xFF 0x01 TDO=0x4B是错误的

BUG3:既然存在上述BUG1的情况,为何在解码TDO数据时0x77解码是正确的原因分析
根据孕龙插件说明书册和官方JTAG分析的版本(图11)


分析,找到官方该版本的描述(图12)


TDO=0x77波形数据截取(图13)


根据当前V1.06.01版本的采样分板,孕龙在解码TDO数据时是如下的采样时间点(图14)


从分析可知在这种情况下,孕龙的错误解码在该特定数据格式下该结果为TDI=0xFF,TDO=0x77正确
正确的解码时间点应该为(图15)



所以在该特定数据下,恰好孕龙似乎是”解码正确”的,只不过恰好”巧合”,其实是完全不正确的

对于BUG2和BUG3的疑问,也许孕龙厂商和网友都在问我的读取数据代码是错误的,那就贴图让大家看看在采集TDO数据时的截力图(图16)



kingsabbit 发表于 2012-9-4 01:29:49

希望看的网友不要怪,俺语文水平太差了,定作能力不好!另外图片太小了,看起来会吃力,夜深了,该睡觉了

kingsabbit 发表于 2012-9-4 01:49:59

有人会问,在TCK时的TDO,都看不出来是0还是1,根据采集回来的结果:TDO是在TCK的下降沿发生后若干时间后才改变电平状态,即原来是高电平的,在TCK下降沿到来后若干时间后才变为高电时,所以此时读回来仍是0,原来是低电平的,在TCK下降沿到来后若干时间后变为高电平,所以此时读回来仍是1

高到低变化
attach://48384.jpg
低到高变化
attach://48385.jpg

alfred1 发表于 2012-9-4 02:30:28

微博上周功的职员和某位技术牛人的对战??

给共享个链接吧,谢谢

kingsabbit 发表于 2012-9-4 08:09:42

alfred1 发表于 2012-9-4 02:30 static/image/common/back.gif
微博上周功的职员和某位技术牛人的对战??

给共享个链接吧,谢谢

贴子内部部分被删了,周总知道的

kingsabbit 发表于 2012-9-4 08:18:55

今天早上安装了一个ZLG的软件,再来看看ZLG逻辑分析仪的正确解码插图:


TDO输出放大图:

aleyn 发表于 2012-9-4 08:38:29

楼主大牛!I Like!{:victory:}

wzavr 发表于 2012-9-4 08:39:12

支持技术贴,一直在郁闷,如果买了孕龙的LA,还要买那么多的插件,没钱诶

wye11083 发表于 2012-9-4 08:42:07

没明白LZ的意思,我自己做过JTAG烧录MIPS的程序,JTAG的数据锁存是在TCK上升沿,而不是下降沿;在Shift-IR/DR状态时,TMS为高时读入最后一个bit并进入Update-IR/DR状态。所以可能是LZ理解有误。我的JTAG程序经测试,可以正确读写IDCODE,Probe CMD之类的工作,并且搭配JTAG调试程序,可以调试MIPS处理器,没出过任何问题。即,TDI在TCK上升沿时被移入寄存器,然而TDO是直接和寄存器最低位连着的,即进入Shift-IR/DR状态,读出来的就是最低位。

loongsuns 发表于 2012-9-4 08:43:51

技术贴还是要支持的

chensi007 发表于 2012-9-4 09:02:55

wzavr 发表于 2012-9-4 08:39 static/image/common/back.gif
支持技术贴,一直在郁闷,如果买了孕龙的LA,还要买那么多的插件,没钱诶 ...

绝大多数常用插件都是免费的~太专业的可能会要钱咯~

kingsabbit 发表于 2012-9-4 10:31:25

本帖最后由 kingsabbit 于 2012-9-4 10:32 编辑

wye11083 发表于 2012-9-4 08:42 static/image/common/back.gif
没明白LZ的意思,我自己做过JTAG烧录MIPS的程序,JTAG的数据锁存是在TCK上升沿,而不是下降沿;在Shift-IR/ ...

TCK上升沿时锁存TDI,TCK下降沿时锁存TDO。我的读取也正确,只是俺觉得孕龙的解码插件解码存在错误,发出来让大家了解一下

kingsabbit 发表于 2012-9-4 10:34:13

把上述文档整理成PDF,方便直接下载,这样截图更清晰观察

ju748 发表于 2012-9-4 10:38:43

{:lol:}我是专程赶来顶贴的!

依心做学问一向是这么用心专注的!

赞!以后会用得到!{:lol:}{:lol:}{:lol:}

wye11083 发表于 2012-9-4 10:41:48

kingsabbit 发表于 2012-9-4 10:31 static/image/common/back.gif
TCK上升沿时锁存TDI,TCK下降沿时锁存TDO。我的读取也正确,只是俺觉得孕龙的解码插件解码存在错误,发出 ...

你理解还是有出入。记住TDO是和ShfitReg直接连接的,也就是说,你TCK拉高之后,立马就能从TDO中读出下一个bit。

kingsabbit 发表于 2012-9-4 10:49:39

wye11083 发表于 2012-9-4 10:41 static/image/common/back.gif
你理解还是有出入。记住TDO是和ShfitReg直接连接的,也就是说,你TCK拉高之后,立马就能从TDO中读出下 ...

对的,谢谢wye11083。我的数据采集也是在该时段读取TDO,但孕龙的解码插件就不一样了,它的TDO采集数据是在TCK下降沿半个时钟后读取,所以是错误的。前段时间就因为它的解码误导了我的测试过程和理解,后来通过不同的方式证实,因此就发表今天的贴子分析该插件解码的错误原因

kingsabbit 发表于 2012-9-24 18:01:43

JTAG 协议规范 IEEE1149


McuPlayer 发表于 2012-11-5 23:25:15

本帖最后由 McuPlayer 于 2012-11-5 23:26 编辑

技术贴啊,挖出来

孕龙的解码模块注册,在DLL中验证的,我在尝试XXOO

zhonggp 发表于 2012-11-6 08:03:23

我也是用孕龙的,好像他们的解码包对时间要求很高,我前不久用了最新的necIr的时候发现连个信号变化基本一致,只不过时间长度差30ms以内.结果就不能解析出来了.只能自己分解,

kingsabbit 发表于 2012-11-18 23:58:52

zhonggp 发表于 2012-11-6 08:03 static/image/common/back.gif
我也是用孕龙的,好像他们的解码包对时间要求很高,我前不久用了最新的necIr的时候发现连个信号变化基本一致, ...

它的插件解码不是为何,会把时间都算进去,有时解码I2C和SPI,发觉它这样做解码出来的准确率还不如Slaese,就像I2C,经常出现解释地址错误,原来以为真是数据受干扰了,结果那个slaese抓一下包,地址好好的,没错

zhonggp 发表于 2012-11-19 08:55:47

kingsabbit 发表于 2012-11-18 23:58 static/image/common/back.gif
它的插件解码不是为何,会把时间都算进去,有时解码I2C和SPI,发觉它这样做解码出来的准确率还不如Slaese,就 ...

我常用来抓I2C的数据,到目前为止还没有发现有这个问题,不知道是不是我I2C的速率比较低的原因.100K以内的.

kingsabbit 发表于 2012-11-26 18:31:54

zhonggp 发表于 2012-11-19 08:55 static/image/common/back.gif
我常用来抓I2C的数据,到目前为止还没有发现有这个问题,不知道是不是我I2C的速率比较低的原因.100K以内的. ...

估计也是吧,我抓的是400K的,有时地址解释错误,这样才发觉它的波形的时间有问题

mangoes 发表于 2012-11-26 18:40:58

只要孕龙的解码插件有问题,提出客诉,一定会帮你处理的,可能1~2周吧,也可能会更长一些.

mangoes 发表于 2012-11-26 18:55:55

kingsabbit 发表于 2012-11-18 23:58 static/image/common/back.gif
它的插件解码不是为何,会把时间都算进去,有时解码I2C和SPI,发觉它这样做解码出来的准确率还不如Slaese,就 ...

一般采样率在信号频率的10倍左右不容易出问题..还有I2C这个解码插件是还存在一些BUG..

john_patson 发表于 2012-11-26 19:58:53

本帖最后由 john_patson 于 2012-11-26 20:07 编辑

我是在孕龙工作的,前几个月接手了你这个问题,因为这个模组是之前离职工程师所写的模组,在此之前测试时我并不知道他是如何验证通过的,根据你发现的BUG跟我们反应后,我们马上查找了问题并修改了,最新版的dll添加了一个百分比取样位置,分别在上升沿或下降沿处的百分比进行取样数据。你试着用最新版的的试一试。这个是软件那边在解码时解错了,之前测试时没有发现出来。因为根据我们的规格书:
TDI是在上升沿时取样数据,第一个时钟周期为进入是判断是否进入了SHIFT-IR/DR状态,而后接着的第二个时钟的上升沿时才取样数据。
TDO是在下降沿时取样数据,在第一个时钟周期同样是判断是否进入SHIFT-IR/DR状态,接着的下降沿才是取样数据,为了兼固用户在测试时缺少最后一个退出SHIFT-IR/DR状态数据,TDO在退出SHIFT-IR/DR状态时加多采样一位即在EXIT那一位取多了一位。数据封包是以8位为一字节进行封包处理。


关于你在TDO解码为0x03这个数据也是根据这样原理解码得出。因为TDI解码出错时,是因为把第一个时钟周期的上升沿的数据采样进去了。导致数据变成0x1D,解码错误了。最新版的dll中更改了TDI这个问题后已经能够正确解码。如果有什么问题可以跟告知孕龙客服,我们会第一时间查找问题并更改,因为任何一个软件不可能没有bug的,只是我们没有发现到,我只能做到在模组发布之时严格测试并尽量查找软件的bug,发现一个bug,立马修改一个bug。



还有一个问题其它网友提到解码有时正确有时不正确的问题,可能是你的取样频率不足,最低要求就是取样频率最少是目标频率的4倍,假如我目标讯号通讯频率为10M,那样我逻辑分析仪的取样频率就要最少为40M或更高,那样采样出来的数据才不会遗漏。

aleyn 发表于 2012-11-27 08:28:15

john_patson 发表于 2012-11-26 19:58 static/image/common/back.gif
我是在孕龙工作的,前几个月接手了你这个问题,因为这个模组是之前离职工程师所写的模组,在此之前测试时我 ...

竟然碰到孕龙的工程师,哈。{:biggrin:}

McuPlayer 发表于 2012-11-27 08:31:04

楼主因为这个问题和我在QQ上也讨论了很多次,终于有孕龙的人跟进了。

zhiyuan1106 发表于 2012-11-27 10:23:31

孕龙的采样率如果不足4倍,数据是会出错的。我验证过的。不过后来买了其他家的逻辑分析仪。

kingsabbit 发表于 2012-12-8 14:09:41

john_patson 发表于 2012-11-26 19:58 static/image/common/back.gif
我是在孕龙工作的,前几个月接手了你这个问题,因为这个模组是之前离职工程师所写的模组,在此之前测试时我 ...

感觉和孕龙沟通费了不少力气,估计是公司流程慢吧,也因为你们公司这个BUG让我写了一个不同的算法和费时一个月去证明你们的BUG确实存在时才发表声明和提出问题,最近发现在SWD协议就没时间去和你们沟通了。建议你们能把一些协议文档公开出来或者把DLL打成包供下载,单个协议实在是太大了,没有必要用时都不购买和下载

john_patson 发表于 2012-12-9 17:27:43

kingsabbit 发表于 2012-12-8 14:09 static/image/common/back.gif
感觉和孕龙沟通费了不少力气,估计是公司流程慢吧,也因为你们公司这个BUG让我写了一个不同的算法和费时 ...

公开协议文档的话,我个人觉得公司不可能会采纳这个建议了,你这个问题我会跟我们的主管建议一下直接提供DLL文件了,我也觉得直接提供DLL文件更方便了,一个DLL文件也不大,最大也不超5M了。不像现在那样提供安装包,太大太麻烦了,这个SWD协议是本人负责编写规范文档的,软件DLL部份编写的人员前个星期刚走了,如果有什么问题可以直接跟我提问,SWD协议我建议你采样频率最少是目标通讯频率的4倍或以上了。因为我在测试时用2倍的采样频率也会解码错误,最少也要是4倍或以上。

kingsabbit 发表于 2012-12-9 23:49:51

john_patson 发表于 2012-12-9 17:27 static/image/common/back.gif
公开协议文档的话,我个人觉得公司不可能会采纳这个建议了,你这个问题我会跟我们的主管建议一下直接提供 ...

有空和你讨论一下SWD的问题

McuPlayer 发表于 2013-4-26 18:22:16

我最近再做一个类似JTAG的模块,又搜到这个帖子了,又仔细看了一遍群主的文字

孕龙解码的早期版本译码错误,
TDI 出错,进入Shift状态的那个上升沿所对应的TDI是不能采样的,否则就会多一个bit了
TDO出错:TDO也应该在上升沿采样,但采样的是上升沿前面的TDO数值,也就是说上升沿之后TDO就该变化了,从细分角度看,应该是在上升沿来之前采样TDO

JTAG协议中所说,TDO在下降沿采样,指的是被测试器件的TDO在下降沿更新,但测试仪器而言,应该是上升边沿采样了
这个2个边沿之间的时间差,是给setup time用的
至于要提前于这个上升沿来采样,是为了足够的hold time时间
楼主的PDF最后一个i图,TDO的改变稍微落后于TCK的下降沿,这个差可以理解为setup time
这个和SPI的时序是类似的

晕龙对TDO采样错,是因为在上升边沿之后采样
其实应该是上升沿之前,也要保证下降沿之后的时间距离,简单说就是setup time和hold time都要满足
页: [1]
查看完整版本: 深夜了,解开JTAG困扰前进和孕龙逻辑分析仪解码插件BUG的分析