最近使用fx3-usb-3.0调试slave fifo的传输,期间遇到许多难以理解的问题。在这里分享给大家,希望可以少走一些弯路,我自己是这样走过来的。
1,首先去官网下载原始的参考设计,并安装所提供的SDK软件:FX3SDKSetup_1.3.4.exe
2,接着把参考设计文档AN65974阅读一遍,分别创建新的SDK工程和FPGA工程。如果使用的原厂的开发板,那么可以按照文档提示,可以很顺畅的跑完整过测试。否则需要匹配自己的硬件,做针对性的更改和移植,而我走的是后一条路,于是开始了漫长的调试之路。
3,创建完SDK和FPGA工程之后,我认为需要把串口打通,再添加一个指示灯,这样便于观察调试信息。于是我做了如下更改。
4,编译完毕之后,就是使用control center进行下载调试,下载到FX3 RAM里面去,程序就会自动启动。需要注意把电路板上的boot模式设置为RAM模式,这样才可以看到如下的界面。
5,然后下载编译好的FPGA升级文件,去在线查看3014的FLAG标志,很遗憾的是发现没有任何改变,一动不动。通过打印可以看到总传输4次就死掉了,后来知道是因为U2P的buffer数目刚好设置为4个。如下:
6,经过一轮排查之后,发现是FPGA的输出时钟引脚不正确,把K15弄错成了L15。改正之后FLAG标志信号终于跳动起来了,但是不论是stream in还是stream out还是无法正常跑起来,如上面的图片所示stream out发送四次就死掉了。于是使用gpif II designer查看配置,发现原厂的demo和自己的引脚顺序不一样,同时自己的板子少了许多连线,例如没有oe使能脚,没有rd管脚,没有flagd管脚。于是进行如下修改,这里反复试错许多次,不断尝试。如下:
7,拷贝新的配置文件cyfxgpif2config.h到工程目录,编译后调试,发现系统老是容易卡死,只能传输一次,类似于FLAG标志信号没有正常运转起来。后来在网上看到可以实时查看gpif的状态函数,添加之后可以看到实时情况,如下:
8,从打印信息就可以知道目前处于什么状态,以及为什么状态没有改变,其状态定义以及状态转换图是这样定义的。
9,经过一番鼓捣之后,使用BULT OUT可以传输数据了,但是使用STREAM OUT就会卡死。原来应该把DMA模式设置为AUTO模式,即注释掉MANNUAL宏定义,原因是只有跨过CPU的干预效率才会足以支持高效传输。
10,再次编译下载后,stream out可以正常跑起来,但是GPIF模块显示读错误,后来才知道是watermark设置不正确引起的。
11,于是专门改用不同的watermark的数值去测试,发现刚好为5的时候,数据传输正常。并且得到一个经验就是这个slavefifo允许读空,也不允许里面有残留的数据内容,如果有残留那么FX3就会死机。例如本本次测试中将水印值设置为4的时候就是读空错误,6的时候就死机了FLAG标志完全错乱。同时将FPGA里面的stream out状态机条件修正一下,运行会更加稳定,在USB2.0接口下面速率可以达到40MB/s。如下:
总结:要做成功一件事情需要花费许多精力,需要克服许多问题,需要走许多弯路。要把一件事情弄死只要干一次就足够了。现在把调试中的错误进行归类:
一类错误 |
1,将slave fifo的时钟输入管脚接错 |
2,忽视了和原厂demo板的硬件差异,缺少许多IO |
二类错误 |
3,不了解水印值设置偏大之后会引起FX3死机,以至于带偏了节奏。 |
4,不会查看GPIF的状态转换图,不知道程序的运行机制,如黑盒子一般。 |
三类错误 |
1,原以为FPGA输出的时钟频率偏大; |
2,原以为时钟输出额相位不正确; |
3,原以为FPGA的逻辑代码有错误; |
4,原以为FX3的测试工具没有使用正确 |