Dears,
最近在开发FX3作为PC与FPGA开发板间数据传输通路。
欲实现功能:PC通过1个Bulk endpoint out 各种长度的数据至FPGA。
实现过程中发现host发送与USB3.0 endpoint max length成整数倍的长度数据时,FX3识别不出host发送数据结束了,有FX2/FX3开发经历的前辈请指导下这个问题:
FX3是怎么做到能正确接收USB host发送过来的任意长度数据的?
以下是我的代码实现的一些关键内容和分析:
关键的一些配置信息如下,
USB3.0 这个endpoint配置:
Max length:1024B
burst:16
transfer type:Bulk
从这个endpoint搬运数据至GPIF socket的DMA Channel配置:
buffer size:32KB
buffer count:4
dma mode:CY_U3P_DMA_MODE_BYTE
notification:CY_U3P_DMA_CB_PROD_EVENT
DMA channel配置为Manual type
通过以上配置想通过Manual DMA channel的CY_U3P_DMA_CB_PROD_EVENT来进入callback处理接收到的data,CY_U3P_DMA_CB_PROD_EVENT产生的条件我了解到的有2个:
1、host发送了一个shortpacket,我的endpoint配置下就是<1024B的data length就是个shortpacket
2、DMA channel的32KB buffer被filled,即buffer被填满了
如果是使用CY_U3P_DMA_CB_PROD_EVENT来做数据接收的notification,会有一个问题:
如果host刚好发送的data length是1KB的倍数且不满32KB,如就发2KB,那FX3根本不知道host发完2KB了。
然后我继续探索能让FX3识别到host发送过来的任意长度的数据,找到一个CY_U3P_DMA_CB_XFER_CTRL,即把DMA channel的notification配置为:
notification:CY_U3P_DMA_CB_XFER_CTRL
这个CY_U3P_DMA_CB_XFER_CTRL的作用是如果producer接收到的数据长度与CyU3PDmaChannelSetXfer()函数配置的Xfer值一致时就会产生CY_U3P_DMA_CB_XFER_CTRL notification,我就可以进入这个 notification的cb处理接收到的数据,但是我实测并没有产生,我把CyU3PDmaChannelSetXfer()函数的源码看了看,源码里写到如果Xfer size == 0或者DMA channel type是Manual channel,那么producer并不会引起产生CY_U3P_DMA_CB_XFER_CTRL notification |