原文地址::U3V实现——CYUSB3014之GPIF总结_gpif接口_初一零一的博客-CSDN博客
相关文章
1、Infineon开发套件, 无线通信开发工具----CYUSB3KIT-003 | Infineon开发套件, 无线通信开发工具 | RS
2、基于CYUSB3KIT-003USB接口到微控制器的参考设计----基于CYUSB3KIT-003USB接口到微控制器的参考设计-电子电路图,电子技术资料网站
3、FPGA和USB3.0通信-UVC摄像机----FPGA和USB3.0通信-UVC摄像机 - 知乎
4、FPGA和USB3.0通信-SDK的安装----FPGA和USB3.0通信-SDK的安装
5、FPGA和USB3.0通信-联合测试(一)----FPGA和USB3.0通信-联合测试(一)
6、FPGA和USB3.0通信-联合测试(二)----FPGA和USB3.0通信-联合测试(二)
0 背景:
实现基于CYUSB3014传输的标准USB3 VisionDevice支持GenIcam过程中,控制节点实现已与eBus正常通讯,但是图像流传输,是接下来攻克的重点,本文档用于记录攻克数据流传输过程的难点问题,数据流传输主要使用的Cypress公司的GPIFII接口。
硬件拓扑结构是:
Sensor-->FPGA-->CyUSB3014-->pc
以下记录了从设计到问题解决的过程,包括关键词总结,使用方法步骤详述,和原理说明,参考资料来源。
(欢迎关注与支持,后期会不断更新创作)
1 总结:
概念描述:
1.1 套接字(socket):用于指向有效的DMA描述符,使能或者标记中断;
1.2 DMA描述符(descriptor):描述缓冲区地址,大小,下一个描述符的位置等;DMA节点分为DMA Producer和DMA Customer,生产者和消费者,生产者作为数据生成端口,消费者作为数据消耗端口。
1.3 DMA缓冲区(buffer):用于缓冲接口传输数据;
1.4 GPIF线程:赛普拉斯开发的USB SOC与USB上位机之间有32个endpoint节点,但是对外为可编程总线接口,可满足SD卡开发,传感器等并行可编程接口,Cypress称之为GPIF II。有专用的Cypress开发软件“GPIF II Designer”。
1.5 URB:USB Request Block;和USB传输包大小无关,多个Buck传输组成一个URB。BUShound抓取的是URB包,因此呈现出单个URB可以传输很大的数据量。(大家会疑惑,USB3.0 Buck传输官方手册说是1024Byte,在这里做阐述届时,大家看大Bushund抓取的包超过1024之后不要惊讶)。
2 使用方法:
2.1 打开"GPIF II Designer";
2.2 “File --> OpenProject --> fx3_uvc.cydsn”;
2.3 得到如下图示
图2.3.1
2.4 StateMachine示意如下:
图2.4.1
2.5 “File-->Save Project As”另存为本地路径下的新工程;
2.6 修改合适的“LD_DATA_COUNT”和“LD_ADDR_COUNT”修改方法是:预设的DMA缓冲区大小/(数据位宽/8)-1 得到所需修改的值。注意:由于状态机级数从0开始,因此计数起始值为0;
图2.6.1
2.7 保存,编译,编译all;得到Cypress的SOC下硬件配置“cyfxgpif2config.h”
2.8 替换eclipse工程路径下的“cyfxgpif2config.h”,即完成了GPIF II端的设计。
3原理说明:
3.1 传统设计中,FPGA端或者Sensor端常采用DVP接口,图像从Sensor或者FPGA传入到USB SOC上,由于前端的流数据不会与SOC中的CPU握手,因此无法控制Master端数据启停。同时由于USB繁忙度原因,如果采用如下简单数据流方式实现GPIF II状态机,则稳定性及数据传输的效率欠佳。如图状态机:
图3.1.1
3.2 为了适配各种不同分辨率,且不同分辨率下均不发生数据丢失问题,我们采用Ping-Pong设计,即:GPIF II接口作为Slave设备,接收来自FPGA或Sensor的VS/DE/Data信号,通过GPIF II Block的双线程,进而通过DMA套接字传输到DMA缓冲区,由于CPU在转接数据过程中有us及延时存在,因此如果不采用Ping-Pong设计,会导致GPIF端数据丢失引起的问题。因此结构如下:
3.3 关于USB3 Vision Device的Genicam协议要求的Stream流数据必须具备Leader + Payload + Trailer。但是Stream可以正常传输了,但是L/T如何传输?
如图2.4.1中,State19和State22中实现了Commit,Commit了0长度的包到CPU,此时CPU应该响应并向USB Endpoint的Buffer中写入预设的L/T信息,即可完成L/T传输。
具体应用见c代码设计。
3.4 GIPF II设计中的"INTR_CPU"实现了戳CPU的状态,同时此时CPU的c代码应该具备GPIF_CB callback响应此中断。否则状态机无法正常运行。
3.5 图示中的状态机设定由于是2个GPIF II线程对接消耗端,因此c代码中的DMA应该创建MANY_TO_ONE的模式,使用CyU3PDmaMultiChannelCreate。
3.6 dmaMultiConfig.size大小设定与“LD_DATA_COUNT”和“LD_ADDR_COUNT”设定值一致,但不用减1。
3.7 C代码中,启动Stream前需要写入cyfxgpif2config配置字到SOC寄存器内。
3.8 c代码中需要将状态机强制复位到起始位置。
3.9 c代码需要简历Stream的Callback函数Commit到上位机所需要的数据。
4 参考设计:
4.1 参考设计信息:
详见Infineon官方社区与论坛。
4.2 参考代码
“U3V_SM.cydsn”
“U3V_on_Fx3”
“cyfxuvc_an75779”
4.3 参考文档
《AN87216_Designing_a_GPIF_II_Master_Interface_Chinese.pdf》
《AN75779_How_to_Implement_an_Image_Sensor_Interface_with_EZ-U.pdf》
————————————————
版权声明:本文为CSDN博主「初一零一」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48244275/article/details/126825892