Slave FIFO模式下FLAGC不工作导致USB传输失败的解决方案
问题描述:FLAGC是一个可编程的Slave FIFO输出状态标志信号,报告空状态。FPGA在向USB芯片的EP6写数据时, FLAGC有时会不工作,一直为低电平,导致FPGA写入失败(上位机接收失败)。FLAGC不工作后在上位机使用Reset API函数也不能解决问题,需要在官方给出的应用程序CyConsole中点击bulkin的reset pipe并读出6个数据包才能继续工作。
可能的解决途径:1、修改68013固件程序,2、修改上位机程序。
参考资料:EZ-USB(R) Development Kit User Guide、EZ-USB(R) FX2LP Datasheet和EZ-USB(R) Technical Reference Manual
解决过程1(上位机方式):
1.官方提供的CyControl有c#源码但没有c++源码。CyControlCenter.pdf有关于reset pipe的信息。文件位置在c#文件夹的cyconsole示例中。
2.通过资料了解到:USB设备从来不会自动将数据发送到主机。EZ-USB固件或外部逻辑可以加载数据到一个EZ-USB端点缓冲区和’ arm ‘,它在任何时候传输。但是,在主机向EZ-USB端点发出IN请求之前,数据不会传输到主机。如果主机从不发送IN令牌,数据将无限期地保留在EZ-USB端点缓冲区中。
3.通过资料了解到:Reset Pipe, 用于清除选定端点上的停止条件。CyControlCenter例程中的Reset Pipe按钮事实上关键函数也只是 curEndpt.Reset();
4.通过资料了解到:Abort向USB设备发送一个IOCTL_ADAPT_ABORT_PIPE命令,端点地址作为参数。这会导致端点上挂起的IO事务中止。Reset方法重置端点,清除端点上的任何错误或STALL情况。挂起的数据传输不会被重置方法取消。调用Abort()以强制完成进程内的任何传输。
4.得到解决方案,在上位机软件的开始传送按钮中加入abort()API函数,保证每次传输开始时FLGC标志能够工作。
解决过程2(修改固件方式):
1.通过资料了解到:配置了OUT端点之后,需要armed它们以接受来自主机的数据包。如果端点是双缓冲的,就必须对端点进行两次arm。arm实际上释放了缓冲区,使它们可以接收来自主机的数据包。
2.通过资料了解到:当EZ-USB复位时,如果未提交的包在OUT端点缓冲区中,则该包不会自动提交给主机。为了确保重置后没有未提交的包在端点缓冲区中,EZ-USB固件的“端点初始化”例程应该通过写入跳过2、3或4个包(取决于为FIFO选择的缓冲深度),通过写OUTPKTEND和SKIP= 1。
3.通过资料了解到:如果需要刷新缓冲区中的数据包,则需要从自动模式切换到手动模式并重置FIFO。在自动退出模式下,如果固件需要刷新从主机接收到的包,而这些包没有被外部主/从机读取,则固件可以执行以下顺序:a)设置NAKALL位;b)切换到手动模式;c)重置fifo;d)使用OUTPKTEND ‘n’次来跳过未提交的包(FIFO ‘n’缓冲);e)切换到自动模式;f)释放NAKALL位.
4.得到解决方案,在USB固件中添加复位端点FIFO的代码,以刷新缓冲区的数据包,使FLAGC有效。