1

如何用DSP模拟lattice的JTAG下载程序?

我现有一块DSP+CPLD的板子,DSP是28335,cpld是lattice的LAMXO640。CPLD的JTAG端口直接连接到了DSP的GPIO,并且JTAG没有预留出来,所以我猜测CPLD的程序是通过DSP下载进去的,那么DSP就要模拟JTAG才能实现。我查找资料,找到lattice的官方嵌入式编程手册《Programming Tools User Guide》,了解到可以通过
JTAG Full VME Embedded;
JTAG Slim VME Embedded;
Slave SPI Embedded;
I2C Embedded;
sysCONFIG Embedded;
这几种方式进行编程,其中能实现的可能有JTAG Full VME Embedded和JTAG Slim VME Embedded,查看安装目录下embedded_source提供的源码,发现vmembedded类型要读取lattice的嵌入式系统.VME文件,但是DSP是不支持文件IO的,所以用JTAG Full VME Embedded方法行不通。

    if ( cRetCode < 0 ) {

        /***************************************************************
        *
        * VME file version failed to match the supported versions.
        *
        ***************************************************************/

        fclose( g_pVMEFile );
        g_pVMEFile = NULL;
        return VME_VERSION_FAILURE;
    }

接着我想用JTAG Slim VME Embedded方法,使用其中的slim_vme_8051程序进行移植,此方法要求用Deployment Tool工具将lattice的.xcf配置文件生成HEX(.C)文件,我按照步骤生成了.c文件
11.png

22.png
33.png
44.png
得到了impl1_algo.c算法文件和impl1_data.c数据文件
55.png
66.png
通过查看源代码slim_pro.c发现生成的算法数组和数据数组是对应的

xdata const unsigned char g_pucAlgoArray[]= {0};
xdata const unsigned char g_pucDataArray[]= {0};
xdata const int g_iAlgoSize = 0;
xdata const int g_iDataSize = 0;

但是调试程序的时候发现出错,在解析算法数组的时候发现前面部分数组的元素都符合程序的解析,直到g_pucAlgoArray[ 483 ] 数组出现多个连续的0xFF便出错
77.png
在slim_pro.c里面连续多个0xFF是错误的,根本不能解析数组。
88.png
请问一下:
1、我用slim_vme_8051的程序移植到28335的DSP上能否实现?
2、将.VME文件转换得到的.C算法文件是正确的还是错误的?为什么根本解析不了?
3、有没有其他方式能实现DSP模拟JTAG,通过GPIO下载程序到CPLD,读取CPLD的文件是像Lattice一样转换成数组还是通过串口下载进去,如果DSP没有预留串口只有CAN接口能实现吗?
望有经验的人或做过的人能提供思路或解答,万分感谢!

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除
hmf1235789 头像
想向站长提问,微信扫码立刻加入! shawn的FPGA圈.png
1
  答案登陆可见 做站不容易,小伙伴支持一下我们吧!
编辑 标为违禁 删除 链接 更多选项...
comehope 头像

评论

非常感谢你的回答,我还有一些疑问,可以再解答一下吗?新的问题在本提问下面。

hmf1235789 头像hmf1235789 ( 2019-03-15 14:33:54 +0800 )编辑
2

可以参考这里 《MCU模拟JTAG接口对LATTICE CPLD进行在线编程加载》

编辑 标为违禁 删除 链接 更多选项...
shawn 头像

评论

非常感谢你的回答,我还有一些疑问,可以再解答一下吗?新的问题在本提问下面。

hmf1235789 头像hmf1235789 ( 2019-03-15 14:34:00 +0800 )编辑
0

LATTICE详细调试咨询可以微信扫码加下面的圈子

LATTICE FPGA HIFPGA 知识星球.png

非常感谢你的解答!
参照《MCU模拟JTAG接口对LATTICE CPLD进行在线编程加载》我已近研究了lattice生成的svf文件,也明白了SIR和SDR的数据的含义,及svf文件所包含的器件程序流程。另外查看JTAG协议文档也明白了JTAG的状态表。
Svf文件流程中检查器件ID、编程BSCAN 寄存器、使能编程…….等对于每个生成的文件都是相同的,差异性在于Program Fuse Map编程的内容和Program USERCODE校验的内容。
11.png

我用lattice的deploy工具将jed文件转成hex文件,得到如下数据
22.png

在用你给的.tcl文件将hex变成.C数组数据,就是把hex的数据变成数组,而且数据也是能一一对应的上。
33.png

但是这个bitmap数组中的元素代表什么意思呢?(或者说hex文件中的每一行代表什么意思?),它就是CPLD要编程到地址的数据吗?是SVF文件中Shift in Row = 1中TDI写入的数据吗?
我分析发现,svf中要编程的TDI数据行数目和生成的bitmap数组元素数目是一样的,如我的文件都是551行数据,当时数据却对应不上,如
Svf的Shift in Row = 1数据为:

SDR    236    TDI  (FFF7BFF3DEFFCDEBFF3DFFFFF7FFFFDFFFFF7FFFF7AFFCF7FFFFDEFFCFF);``

Bitmap数组元素的第一个元素为:

FF3FF7BFFFFEF3FF5EFFFFEFFFFFBFFFFEFFFFFBFFFFEF3FF7BCFFDEFFFF

所以我是以bitmap数据为准,把他写入Shift in Row = 1中就可以了吗?还是它还包含了其他信息,把SIR/SDR命令或步骤都包含在里面了?
另外如果我把这个bitmap数组直接包含在工程中编译,那么写入的就是一次的cpld程序。如果我把这个数组在上位机上通过串口传入dsp,那么我只要更新数组就可以写入不同的cpld程序是这样吗?
本人天生愚钝,还望再次解答,万分感谢!

编辑 标为违禁 删除 链接 更多选项...
hmf1235789 头像

评论

bitmap里面生成的就是直接写入CPLD的数据,是的你如果DSP更新bitmap,就可以更新程序。

shawn 头像shawn ( 2019-03-15 18:14:50 +0800 )编辑
0

我也在调这个,用的是STM32,感觉看官方的文档一头雾水

编辑 标为违禁 删除 链接 更多选项...
Airkids_zz 头像
登录/注册后进行回答