在如图架构中, fireware用的是cypress提供的SlaveFifoSync.img,把cypress的control center工具略作修改,在PC机上不断进行BULK IN 传输测试,总是报BULK IN transfer failed with Error Code:997. 然后再也收不到任何数据,CYUSB3014的FLAG标志FLAGA=0、FLAGB=1。
易发生错误时的情况是:
1、当FPGA里fifo变空时必报;
2、上电后,FPGA里fifo有数据,刚开始BULKL IN测试偶尔报,
3、当出错是,示波器观察发现总是BULK IN 3次后停止,但PC机未收到任何成功的数据
文档AN65974里说添加CyU3PUsbLPMDisable()函数,但SlaveFifoSync固件工程里已经添加这个函数了。
文档FX3_SDK_TroubleShooting_Guide.pdf的2.3的II建议添加CyU3PDmaChannelResume (chHandle, CyFalse, CyTrue)和
CyU3PDmaChannelSetSuspend (chHandle,CY_U3P_DMA_SCK_SUSP_NONE, CY_U3P_DMA_SCK_SUSP_EOP),添加后也没有效果,不知添加的位置是否正确。
请问这是什么原因呢?Error Code的含义是什么?在哪里能查到?谢谢
附件是SlaveFifoSync工程。
已解决! 转到解答。
找到原因了。
在c#中,host在每次BULK IN时调用 XferData(ref buffer, ref bytes)后,都会修改bytes值,导致bytes值可能小于512。所以在调用XferData(ref buffer, ref bytes)之前,先让bytes=512就解决了
error code 997 一般会在Control center 工具没有成功获取到数据,有可能是FX3的buffer里面没有数据。如果你的FPGA只向FX3写了1024 byte的数据,那么在这1024数据被control center读取后,如果没有新的数据进来而control center又读数据,就会出现997的错误
我PC机用的是USB2.0的接口,SlaveFifoSync.img固件定义的FLAGA=0表示FX3 full,FLAGB=0表示FX3 partial full。
我的FPGA是否向FX3写数据,靠判断FLAGA标志。当FLAGA=1且FLAGB=1,启动写操作,当FLAGB=0、或者FPGA的fifo空、或者写字节大于500个,则结束写操作,同时给出pktend标志(cypress例程也是这样,只是没有字节大于500个结束写操作这个条件)
这几天的实验发现,刚上电的第一次BULK IN容易出错,点击control center的reset按钮复位后继续操作,发现:
当FPGA向FX3写的过程中,如果将每次BULK IN写的字节数由512向0的方向减小,直到变为0都不会出错;如果将每次BULK IN写的字节数由0向大的方向增加,每增加一次就一定会出错。
出错现象就是报error code 997,在 control center 中 C# 代码增加打印信息:
OutputBox.Text += "Bulk IN ......" + " Error Code: " + FxDev.BulkInEndPt.LastError + "\r\n";
OutputBox.Text += CyUSBDevice.UsbdStatusString(FxDev.BulkInEndPt.UsbdStatus) + "\r\n";
显示:
Bulk IN ...... Error Code: 997
[state=HALTED status=UNKNOWN]
出错后FX3的FLAGA=0,FLAGB=1,由于写操作的条件不满足,所以这个时候FPGA无法再向FX3写数据了
不是问题在哪里?谢谢
找到原因了。
在c#中,host在每次BULK IN时调用 XferData(ref buffer, ref bytes)后,都会修改bytes值,导致bytes值可能小于512。所以在调用XferData(ref buffer, ref bytes)之前,先让bytes=512就解决了
Xferdata里的参数 “长度” 是个返回值,调用后会把实际获取到的数据长度填充到里面。