使用基于UVC协议传输方式,使用到接口主要包含FV,LV,PCLK和DQ0~DQ15等,如果不想使用UVC协议,但是想继续使用这种接口怎么实现,怎样能转为类似于Slave fifo模式,同时保留使用这种接口方式(FV,LV,PCLK和DQ0~DQ15),谢谢!
已解决! 转到解答。
我对你的需求始终无法明确理解。比如说,你是否继续用 UVC?
FX3 对于从 sensor 传输过来的数据,只是添加了 UVC 的头部信息,通过 DMA 通道提交给 host,并没有做其他修改。我不是很理解你所说的 “使用UVC传输上位机虽可以取到图像但是无法取到原始数据” 是什么意思。
如果说,你就是想实现sensor 输出了什么数据,FX3 就原封不动传输给 主机,那你就不要用 UVC 协议,做成 vendor 设备,绑定Cypress提供的驱动即可。你也可以参考下面的链接。当然,你需要基于 Cypress 提供的 API 库编写自己的主机程序。
FX3 / CX3 Firmware for Streaming RAW Image Data using Cypress Driver
上一条回复有误,以此条回复为准。
你可以参考 AN65974,这是FX3 做 Slave FIFO的例子。
谢谢,但是你上面提及的这个例子用的接口里除了FV,LV,PCLK和DQ0~DQ15wait,还用了FLAGA、FLAGB、FLAGC、FLAGD、SLRD、SLCS、SLWR、SLOE、A[1:0]、PKTEND等,多出了十一根线,我不想使用这种接口方式,希望使用UVC+Salve fifo的结合方式,使用UVC方式中的数字接口,然后再使用slave fifo的数据上传传输方式。请问有什么方法吗,能实现吗?
你可以思考一个问题:什么叫 Slave FIFO?
之所以叫 Slave,是因为还有一个master。 在 AN65974 中,这个master 就指的是 FPGA。 既然有 FPGA,使用 Slave FIFO,就要按照 Slave FIFO 的时序进行读写。因此有上述你提到的其他引脚做控制。
回到你的问题,从硬件上讲,你计划怎么实现 FX3 的接口?从你的表述上看,我认为你 最接近你的需求的是 GPIF master 的Demo。
你可以参考下 SDK 目录下的 GpifToUsb这个工程。
我这边硬件上还是使用UVC那一种的接口。该接口仅仅包含FV、LV、DQ[0-15]、PCLK。因为使用UVC传输上位机虽可以取到图像但是无法取到原始数据,所以才想到其他的方式实现,但是我的接口又已经固定了没法改,所以就想到保留现有接口(FV、LV、DQ[0-15]、PCLK),然后使用slave fifo传输数据到上位机这种方式来解决。
我对你的需求始终无法明确理解。比如说,你是否继续用 UVC?
FX3 对于从 sensor 传输过来的数据,只是添加了 UVC 的头部信息,通过 DMA 通道提交给 host,并没有做其他修改。我不是很理解你所说的 “使用UVC传输上位机虽可以取到图像但是无法取到原始数据” 是什么意思。
如果说,你就是想实现sensor 输出了什么数据,FX3 就原封不动传输给 主机,那你就不要用 UVC 协议,做成 vendor 设备,绑定Cypress提供的驱动即可。你也可以参考下面的链接。当然,你需要基于 Cypress 提供的 API 库编写自己的主机程序。
FX3 / CX3 Firmware for Streaming RAW Image Data using Cypress Driver
谢谢指导,我这边不适用UVC了,只想使用这个接口(包含FV、LV、DQ[0-15]、PCLK),然后完成数据的传输即可,想问下如何实现比较好
你提的这个问题,其实我前面已经回复过了,希望你再理解一下。
你可以先动手做起来,如果有新的问题,可以继续来讨论。
是的,谢谢指导,昨天按照您说的试了FX3 / CX3 Firmware for Streaming RAW Image Data using Cypress Driver里面的FX3_RAWData_Cypress Driver and Descriptors.zip这个non-UVC工程,确实能够实现数据传输,但是目前还是存在两个问题1、传输速率很慢,我使用该工程测试,测得usb 3.0接口传输速率大概为10000kB/s(约10MB/s),远远低于usb 3.0的理论传输速率640MB/s。2、数据传输一段时间后就会停止传输,显示失败,streamer软件上Failures会一直报数,表明数据传输失败。
我进行了以下尝试,试图去解决上述问题:
1、增加DMA的缓存buffer数量(dmaMultiConfig.count)和dmaMultiConfig.size 。
2、DMA通道类型由CY_U3P_DMA_TYPE_MANUAL_MANY_TO_ONE改CY_U3P_DMA_TYPE_AUTO_MANY_TO_ONE
3、修改状态机文件(cyfxgpif2config.h)
4、修改dmaMultiConfig.cb = CyFxUvcApplnDmaCallback中的CyFxUvcApplnDmaCallback,按照类似于UVC那种方式去获取数据然后再发送到上位机。
最终发现上述几种方式都不能解决问题,我觉得应该是什么地方自己忽视了,所以请您指导下,万分感谢!
我从大的方向上给出点建议。
首先你需要了解这个固件的框架,明白固件都做了那些事情。
其次,这个应用本身没有什么复杂的,很简单,就是 摄像头产生数据,之后FX3 采样并通过 DMA 提交给host。所以,既然数据传输出了问题,就从信号的源头上查起。先检查信号源是否还正常,测量下波形进行检查。如果正常就检查 FX3 侧,看看 GPIF 是不是工作正常, DMA 是不是收到了数据包,收到的数据包是不是都正确发送出去了。这些信息都可以从 UART 端口打印出来查看。
通过这些手段去检查,数据传输是在哪一步出错,出错的原因是什么,找到原因也就能有对应的解决方法。