打印

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

[复制链接]
1106|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ou永峰|  楼主 | 2016-11-22 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
沙发
歇树;,、?| | 2016-11-22 16:54 | 只看该作者
你的PC上可以识别出是以USB super speed方式连接的吗?我下载的是官方的固件程序和驱动,识别出来的是USB high speed,不知道怎么回事,请教下你的是怎么识别出来的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝