Cypress技术论坛
直播中

风之峰

13年用户 5经验值
擅长:模拟与电源 数字及可编程逻辑
私信 关注

CYPRESS FX3是怎么做到能正确接收USB host发送过来的任意长度数据的?

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。

回帖(2)

路在足下

2017-11-22 21:06:19
请教一下您的问题解决了吗?我也遇到了类似的问题,DMA设置的是自动通道,burstLen是16,buffer大小为16KB,数据没有作处理,现在的情况是传输大于8K的数据时,用vivado抓到的数据是16KB的,后面8KB的数据貌似是重复的,小于8KB的数据时并没有传输。
举报

路在足下

2017-11-25 16:08:44
当传输的数据是1KB、2KB、3KB等整数时,DMA并不知道数据有没有传完,然后我在上位机的bulk out代码部分加了一句,当所有数据发送结束的时候,再给FX3 DMA buffer发送一个空的数据包作为结束,这样就OK了!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分