通过SPI I2C IIC或GPIO模拟JTAG接口对LATTICE XO2 XO3 CPLD FPGA在线升级的开发笔记及源码分析
本文主要是介绍单片机MCU ARM DSP怎样通过SPI I2C IIC 或GPIO模拟JTAG接口对LATTICE XO2 XO3 CPLD FPGA进行固件代码程序升级的开发技术及调试经验分享。
对LATTICE XO2 XO3 CPLD FPGA在线升级的命令代码流程
无论通过哪种接口对LATTICE XO2 XO3 CPLD FPGA进行升级的流程的都是一样的,发送一样的命令序列,也就是说业务协议层和数据链路层是一样的,只是物理层不一样。可以理解为数据只是最终通过I2C SPI JTAG不同接口发送出去而已,数据始终还是那些数据。LATTICE官方的流程图主要参考RD1204(注意XO2、XO3分别有不同的RD1204,里面是有一些差异的),但是里面的流程足足有五六页,很复杂,当然严格按照LATTICE官方文档的流程来是最稳妥的。但是实际上我们要做的升级工作只是LATTICE官方文档流程的一个子集,以I2C接口为例简化流程如下(如上文所述,其它接口的流程亦如下图):
读取流程
写入流程
对LATTICE XO2 XO3 CPLD FPGA在线升级的操作流程
工程设置
- 对于模拟JTAG编程这种方式不需要对工程作额外支持,默认JTAG是一直开启的,除非JTAG_EN脚被禁能。
- 对于SSPI编程,默认情况下XO2默认是使能了SSPI的、XO3是禁能了SSPI的,但是这个不能作为生产依据,也就是说你最好检查一下工程中这个选项的设置,如果你通过JTAG或者SSPI误烧了禁用SSPI端口的bitstream,那么就不再能通过SSPI升级了,只能通过JTAG口重新烧录启用了SSPI端口的固件。具体设置位置如下图:
- IIC方式进行升级一样要在spreadsheet的global prefereneces中打开IIC选项,具体操作如下图:
确定器件需要升级的行数
由于不同的器件有不同的逻辑容量,对器件进行编程是按行进行的,因此需要知道所用器件有多少行,这个资料在RD1024中有描述。下图是XO2系列不同器件的可编程行数
JED文件转HEX以及转BIN或者转C数组的流程
-
通过deploy将JED转成HEX。
-
由于转出来的HEX是十六进制文本,因此如果转为BIN文件需要将十六进制字符串转化成二进字,这部分工作可以在电脑上做,也可以在MCU中做,我有写一个小工具,有需要联系我吧。如果是转成C数组,那么可以使用Tcl脚本完成这种转换,这个Tcl脚本我已经上传到了chipdebug,具体操作参见【chipdebug.com】网站的说明
-
转C数组的情况,再有些编译器会报过大的整型数据这种错误 ,因此需要将数组里的数据按字节进行分割进行。
通过SSPI对LATTICE XO2 XO3 CPLD FPGA进行在线升级的开发经验分享
通过SSPI进行升级,首先需要在工程设置中使能SSPI。基本上只要能够成功读取ID值,基本上就成功一大半了。
通过GPIO模拟JTAG对LATTICE XO2 XO3 CPLD FPGA进行在线升级的调试经验分享
通过JTAG进行调试,其实没什么可说的,因为实在不清楚,可以抓PC软件通过JTAG下载线进行下载的波形,也可以直接查看SVF文件,一步步生成,关于SVF文件的生成和语法格式,可以在【chipdebug.com】网站上找到。
通过I2C对LATTICE XO2 XO3 CPLD FPGA进行在线升级注意事项
I2C调试需要注意的是READ ID之后是NAK而不是ACK,同样在校验时也是NAK结尾,即读操作最后一bit之后都要以NAK结尾,详见时序图。
SPI源码分析
采用SPI进行升级的是最简单的方法,速度也快,我比较推荐这种。
模拟JTAG源码分析
模拟JTAG采用普通的GPIO就可以了,唯一比较麻烦是需要实现JTAG 1149的协议,主要是一个状态机。关于JTAG模拟在【chipdebug.com】网站中有一篇详细的文章,跟SVF格式解析在同一篇文章里。
I2C升级源码分析
升级速度优化
1.优化代码
2.代码时序
3.减少不必要的操作。
具体后面展开,未完待续。
IIC操作流程笔记下载: