CY68013FPGA通讯联调小结

摘要: 1. 介绍CY68013是一款USB 2.0集成ic,常见作fpga与pc的插口集成ic,其硬件配置能够全自动解决USB协议书,还可以在里边免费下载相匹配的固定件程序,由固定件程序来进行USB协议书的通讯。...

1. 介绍

CY68013是一款USB 2.0集成ic,常见作fpga与pc的插口集成ic,其硬件配置能够全自动解决USB协议书,还可以在里边免费下载相匹配的固定件程序,由固定件程序来进行USB协议书的通讯。大家只关注USB数据信息的传送,协议书的未作细究,可用就可以了。

2. 开发设计 2.1 CY68013 2.1.1 CY68013材料摘抄

关键参照文本文档:


CY7C68013A.pdf fx2的电气设备特点,非常于DataSheet,slave fifo每个操纵数据信号的时钟频率图在这里份文本文档中有写
圈圈教你玩USB.pdf 这一是一款东芝的USB PHY集成ic的参照书,USB协议书必须自身解决,有利于于了解USB的技术专业专业术语的含意及协议书
CySuiteUSB_3_4_4_B184.exe

一个是开发设计固定件程序的,里边内置了一个简单化版的Keil;另外一个是开发设计上位机手机软件的,还包括了Cypress默认设置的驱动器程序、API库这些。安裝的情况下最好默认设置都安裝在C盘下,会省许多不便。

cy7c68013 完成slave fifo: AN61345 + 例程demo

AN63787 - EZ-USB FX2LP GPIF and Slave FIFO Configuration Examples Using an 8-Bit Asynchronous Interface

AN58069 - Implementing an 8-Bit Parallel MPEG2-TS Interface Using Slave FIFO Mode in FX2LP

AN63620 - Configuring a Xilinx Spartan-3E FPGA Over USB Using EZ-USB FX2LP

CrazyBingo系列产品:
Crazy Bingo CY68013开发设计例程
连接详细地址将会禁止,立即百度搜索就可以,AET和非在网上都是有
(1)01:USB+FPGA拍摄头优化算法解决-不断升级中
(2)02:CY7C68013特点详细介绍
(3)03: CY7C68013A有关驱动器版本号表明
(4)04: CY7C68013 Slave FIFO及PCB设计方案
(5)05: CY3684 68013开发设计模块安裝手册
(6)06: USB 68013驱动器程序的安裝
(7)07: USB68013 Driver数据资格证书一说
(8)08: USB 68013 自定VID PID、版本号、生生产商等信息内容
(9)09: USB 68013调节专用工具的应用之CyConsole小助手的应用
(10)10: USB 68013调节专用工具的应用之Streamer USB传送限速
(11)11: USB 68013调节开发设计之各种各样EEPROM免费下载解决方法及其为何??
(12)12:USB68013 Firmware开发设计手册之 CY3684固定件例程剖析
(13)13:USB68013 Firmware开发设计手册之Keil UV4工程项目配备选择项
(14)14:USB68013 Firmware开发设计手册之8051 SFR寄放器表明

2.1.2 Firmware开发设计 2.1.2.1 CY68013驱动器安裝

Cypress出示了官方网驱动器,win7 x64 32全是适用的
安裝上驱动器之后,可使用库涵数来和fx2集成ic开展通信。
必须改动 cyusb.inf 文档来安裝相匹配的驱动器

 ;for all platforms
 ;在这里里提升相匹配的 VID 和 PID 机器设备
 [Device]
 %VID_XXXX PID_XXXX.DeviceDesc%=CyUsb, USBVID_XXXX PID_XXXX

CYUSB_Company = Cypress Semiconductor Corporation CYUSB_Description = Cypress Generic USB Driver CYUSB_DisplayName = Cypress USB Generic CYUSB_Install = Cypress CYUSB Driver Installation Disk VID_XXXX PID_XXXX.DeviceDesc= Cypress USB Generic Driver (3.4.7.000) CYUSB.GUID= {AE18AA60-7F6A-11d4-97DD-B959} CYUSB_Unused = .
2.1.2.2 程序免费下载

Cypress 出示了开发设计专用工具包里的 CyConsole 和 CyUSB Center,能够用于免费下载程序
程序免费下载分二种,

2.1.2.2.1 立即免费下载到RAM中运作

假如联接了eeprom,上电会从eeprom里边起动,早已配备了寄放器;
起动后再免费下载程序到RAM中运作,寄放器又被配备了一遍,可是那样将会会遭受第一次配备的危害,USB通讯出現难题。
通常为用哪一名就配备哪一名,其他的寄放器的bit保存原值。

regVal |= bmBIT0;

那样其他像 bit7- 1 全是保存原值,将会会被第一次配备影响。

曝出
error code 997,具体上是last error = 997

cy7c68013都配搭有eeprom,eeprom里边存的程序,上电起动的情况下,先把程序从eeprom载入到內部ram中,即0000-0x3FFF的地区,随后才刚开始运作;留意与USB有关的寄放器配备及其EP buffer都会上边0xE200-0xFFFF地区!!!这一地区不容易有程序,换句话说程序免费下载的情况下不容易遮盖到这规划区域。原始程序起动后,对usb有关寄放器开展了配备,随后连上usb,驱动器相互配合脚本制作全自动免费下载固定件,这一固定件被免费下载到0x0000-0x3FFF地区去实行,不容易遮盖0xE200-0xFFFF地区的USB紧促安琪和EP buffers,免费下载期内不容易关闭电源。新免费下载的固定件起动实行,对USB regs 和EP buffers开展实际操作,可是仅仅更改特定位的数据信息,别的设定保存eeprom中原始程序的USB寄放器设定,因此会发觉,新固定件的编码作用并沒有取现出去或是说歪斜常!!! 立即把程序烧提到eeprom便可以了!!!

2.1.2.2.2 免费下载到附加配套设施的eeprom集成ic里

上电从eeprom载入程序执行

免费下载程序到eeprom中导致USB通讯出现异常的实例
① 状况叙述:
一刚开始的情况下,向CY68013的eepron里免费下载程序,能和pc通讯上,仅仅数据信息一些歪斜常;
改动程序之后,再次免费下载程序到CY68013的eeprom中,再上电,pc提醒没法鉴别的usb机器设备

无法识别的USB设备

机器设备管理方法器上显示信息 unknown device
设备管理器显示

VID / PID 也没有显示信息
设备管理器查看VID PID
usb压根沒有通讯上!!!!

② 处理方法
推断缘故
最终一个版本号的程序免费下载进来不太好,即eeprom里的程序不太好,
随后又每一次是根据eeprom来起动,
载入程序执行,随后每一次枚举类型也不取得成功,因此显示信息不明机器设备

最重要的是要擦除eeprom里的原程序,随后升级为新程序就可以。

还行,在Crazy Bingo的blog上寻找掌握决计划方案:
crazybingo/p/34531
CrazyBingo CY68013 eeprom设计QTI1NikuPC9zdHJvbmc+PGJyIC8+CglFRVBST01zIHdpdGggZGVuc2l0aWVzIHVwIHRvIDI1NiBieXRlcyByZXF1aXJlIG9ubHkgYSBzaW5nbGUgYWRkcmVzcyBieXRlOyBsYXJnZXIgRUVQUk9NcyByZXF1aXJlIHR3byBhZGRyZXNzIGJ5dGVzLiBUaGUgRVotVVNCIG11c3QgZGV0ZXJtaW5lIHdoaWNoIEVFUFJPTSB0eXBlIGlzIGNvbm5lY3RlZCAmbWRhc2g7IG9uZSBvciB0d28gYWRkcmVzcyBieXRlcyAmbWRhc2g7IHNvIHRoYXQgaXQgY2FuIHByb3Blcmx5IHJlYWQgdGhlIEVFUFJPTS48L3A+Cgk8cD5UaGUgRVotVVNCIHVzZXMgdGhlIEVFUFJPTSBkZXZpY2UtYWRkcmVzcyBwaW5zIEEyLCBBMSwgYW5kIEEwIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNlbmQgb3V0IG9uZSBvciB0d28gYnl0ZXMgb2YgYWRkcmVzcy4gQXMgc2hvd24gaW4gVGFibGUgMTMtMTEsIHNpbmdsZSBieXRlIGFkZHJlc3MgRUVQUk9NcyBtdXN0IGJlIHN0cmFwcGVkIHRvIGFkZHJlc3MgMDAwLCA8c3Ryb25nPndoaWxlIGRvdWJsZSBieXRlIGFkZHJlc3MgRUVQUk9NcyBtdXN0IGJlIHN0cmFwcGVkIHRvIGFkZHJlc3MgMDAxLjwvc3Ryb25nPjwvcD4k高清PC9ibG9ja3F1b3RlPgo8cD48aW1nIGFsdD0="CY68013 TRM eeprom配备表明" src="uploadfile/files/2016/1028/205347.png" title=""pro/pkqt/" target="_blank" >hmeDLWu8jPIDAwMSC1xLXY1rejrDwvc3Ryb25nPjxiciAvPgo8c3Ryb25nPta70qq4xLHkwctlZXByb221xLXY1rejrGVlcHJvbb7Nu+HKp9Cno6xmeDK+zc7et6i002VlcHJvbbzT1NizzNDyo6zWu8Tc07K8/rvYuLR1c2LH68fzPC9zdHJvbmc+PC9wPgo8cD48ZW0+MaOpz8i2zMK3SjEzo6zKubXDQTCx5LXNPC9lbT48YnIgLz4k高清PGVtPjKjqXVzYsGsvdO1vXBjo6y87LLitb11c2LJ6LG4o6zH/bavzt63qNfUtq+wstewPC9lbT48YnIgLz4k高清PGVtPjOjqcrWtq+wstewttTTprXEY3lwcmVzcyB1c2LH/bavPC9lbT48YnIgLz4k高清PGVtPjSjqbbPv6pKMTOjrMq5QTCx5LjftefGvTwvZW0+PGJyIC8+CjxlbT41o6m08r+qQ3lDb25zb2xlo6zPwtTYs8zQ8rW9ZWVwcm9to6xva6OsdXNizajQxbvWuLQ8L2VtPjwvcD4k高清PGg0IGlkPQ=="2123-a51文档的功效">2.1.2.3 .a51文档的功效

留意,.a51的文档叙述符是用于汇报给pc机的,用库涵数获得到的叙述符全是从这一.a51里来的
非常于这一文档决策了跟pc汇报说是我什么节点,及其节点的尺寸
.a51文档务必和fx2真实在运作时配备的节点一致才能够,不然会导致,上位机启用库涵数和fx2通信不了

HighSpeedConfigDscr里边必须改为4个节点的,并且下边要写4个节点的叙述符!!
.a51配置

2.1.2.4 Max PktSize含意

较大只有发那么多

节点尺寸 和 Max PktSize不是一样的
节点尺寸是缓存文件区的尺寸,2和6能够配备为512 和 1024二种
4 和 8就只有配备为512

Max PktSize能够设定为64,较大usb包长为64

2.1.2.5 集成ic没法手机软件复位!!!!

假如节点fifo满了,依然持续推送,集成ic会挂点,手机软件复位沒有用,务必再次上电,hard reset!!!
清除FIFO,在TD_Poll()中开展FIFO_RESET,严苛来讲是在outpkt_end后入行FIFO_RESET,随后再bulkout就不成功了!!!!不知道道是什么原因!!!

 //FIFO复位
 SYNCDELAY;
 FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions
 SYNCDELAY; // see TRM section 15.14
 FIFORESET = 0x02; // reset, FIFO 2
 SYNCDELAY; //
 FIFORESET = 0x04; // reset, FIFO 4
 SYNCDELAY; //
 FIFORESET = 0x06; // reset, FIFO 6
 SYNCDELAY; //
 FIFORESET = 0x08; // reset, FIFO 8
 SYNCDELAY; //
 FIFORESET = 0x00; // deactivate NAK-ALL
 SYNCDELAY; //

//清除usb残余,不许usb残余递交到slave fifo插口处 //那样fpga端在接受的情况下不容易接到乱七八糟的数据信息 //加了下边这几句话,再在这里个后边实行FIFORESET也不能bulkout了,不知道为什么 OUTPKTEND = 0x82; // Arm both EP2 buffers to prime the pump SYNCDELAY; OUTPKTEND = 0x82; SYNCDELAY; OUTPKTEND = 0x84; SYNCDELAY; OUTPKTEND = 0x84; SYNCDELAY;

左右每段换一下先OUTPKTEND 随后再 FIFORESET便会出現上边说的难题

2.2 fpga 2.2.1 slve fifo 插口操纵通信

参照文本文档:

AN61345.pdf
CY69013A.pdf

截屏所有源自CY7C68013A的datasheet,并不是TRM,TRM里边沒有标明来時间
IFCLK是fx2键入脚的IFCLK,的确是升高沿去取样的,

2.2.1.1 基本联接



2.2.1.2 时钟频率剖析

这儿只选用同歩读写能力的方法!!!
读:



ToeOn 之后的数据信息才算是合理的数据信息。

写:


最坏状况下,载入之后,满的FLAGS必须13.5ns才可以出去,超出周期时间的一半了,得直到降低沿之后才可以检验到IN FIFO满

2.2.1 试验调节亲身经历 2.2.1.1 stream_in 2.2.1.1.1 上电后fpga推送了许多0x00回家

PC端从USB处收到很多的0x00
一刚开始认为是fifo里边有缓存文件,并且由于配备的是512 x4尺寸,因此接到了512 x4的 0x00 具体上是fpga具体一直操纵在写00 00
用万用表来精确测量fx2的slwr脚一直显示信息为0V!!!
之后发觉,fpga管脚锁不对!!!!!!沒有把slwr脚锁到相匹配的fx2的slwr脚,导致了slave fifo的出现异常载入
心里干万只草泥马咆哮而过

2.2.1.1.2 fpga的短包推送出現难题

推送短包要降低pkt_end数据信号脚,但何时降低,某不知道名网民说:

pkt_end = slwr_n

但是,

pkt_end = slwr_n 解决短包,結果错误,彻底错误!!!

才发至001D,就写了0x1D数量,flagd就降低了,显示信息fifo满了,可是fifo但是512bytes x4尺寸的!!!

试着pkt_end = 1 每一次等齐512字节数全自动推送得话,那样子,flagd便是一切正常的。
估算是pkt_end的实际操作不太好

再次翻看时钟频率图:

短包推送时钟频率图

也有TRM里的一句表明

then pulse the PKTEND pin,便是slwr_n提到fifo里边,随后都完毕了,再降低PKTEND一个周期时间便可以了。

改动后再次免费下载,试验結果合乎预估,可以一切正常接到短包数据信息,每一次七个16bit数据信息;
Bulk in failed是有意试着只让fpga发一次,pc机上恳求载入2次中的第二次,回到不成功是一切正常的,由于fifo里的确沒有数据信息了。

此外留意一点,EP6FIFOCNT看上去一直为0,具体上含意不一样,要是pkt_end之后,EP6FIFOCNT便会被清0,说这种数据信息早已挨打包出来了,可是具体還是占有室内空间的,FIFO的flag该是Full還是full,因此会出現EP6 为Full,可是EP6FIFOCNT= 0。

超出512bytes用pktend推送出現难题:
打开短包推送,可是fpga推送超出512字节数给pc的情况下出現难题,会接到2个512字节数数据信息,后边的512字节数是一串错码
缘故:
fx2程序中开过autoin,随后fpga推送端又有pkt_end降低一个周期时间导致的分歧,来到512字节数早已autoin推送了,随后由pkt_end推送一遍,第二遍的情况下推送的不知道道是啥数据信息

2.2.1.2 stream_out 2.2.1.3 bulk_loopback

配备状况
fpga内配备1024 x16bit的fifo
fx2 配备为
EP2OUT 512 x4
EP6IN 512 x4

持续发9个512byte以往,随后接到的数据信息其实不详细,接到第5包,后边的数据信息就沒有了(工程项目关掉ep6 autoin,不管是长包還是短包,全是用pkt_end来驱动器推送的)
t 一直为2
根据chipscope观查,发觉死在了read_sig情况
qqGjPC9zdHJvbmc+PC9wPgo8cD7Q3tX9uvOjrNa7xNy2wbW9N7D8yv2+3aOs1+6688G9uPbK/bu5sru21KOsseSzycHLMDg8YnIgLz4k高清PGltZyBhbHQ9"" src="uploadfile/files/2016/1028/207372.png" title="" />

发觉第7包的前2个字节数会丢
在第七包只发过2个字节数4C4B的状况下,甚么也收不上
chipscope

dout可以看到有4C4B表明的确这一值是载入到fpga的fifo中的,可是从fifo中读取随后载入到fx2的slave fifo中是不太好的。

重要的重要是,EP6IN fifo满的情况下,依照检验flagd随后操纵rden,又由fifo回到的valid数据信号来驱动器slwr_n, 便会导致少载入一数量据到EPIN6 FIFO里边,可是这一数据信息早已从fpga內部fifo中读取来啦,就导致了遗失一数量据。归根结底,是由于valid数据信号和rd_en数据信号有一个数字时钟周期时间的廷时。
以便填补这一数量据,必须在fx2中设定EP IN full的标示位提早一个企业告之FIFO FULL,
EP6FIFOCFG = 0x41; // AUTOIN=0, WORDWIDE=1 , ZEROLENIN=0, INFM1 = 1,那样也不会漏数据信息了。

数据信息通路剖析:
EP2OUT 到 fpga內部fifo:
在往fpga內部fifo写的情况下,fpga內部fifo会提早一个模块得出fifo满数据信号,那样会造成有一个模块的数据信息,这儿相匹配2bytes数据信息,残余在EPOUT FIFO中,得直到pc把EPIN fifo的数据信息读掉一些,随后fpga內部fifo释放出来出去一些室内空间,才会把EPOUT的残余数据信息读取来载入fpga內部fifo。可是这一其实不危害最后pc接受的状况,由于看上去還是和原先一样512bytes取下来。

fpga內部fifo 到EP6IN:
便是前边重要的重要剖析的

2.2.2 fpga小窍门 2.2.2.1 同歩电源电路外边加一层逻辑性电源电路维护,确保不容易曲解出去随后没有人接受 2.2.2.2 inout口解决

fdata_in专业作为键入,真正值 或是 0
data_out专业作为輸出,真正值 或是 0

 --fdata_in做为键入
 process (sloe)
 begin
 if (sloe) --键入
 fdata_in = fdata;
 else
 fdata_in = conv(0, 16);
 end if;
 end process;
 data = fdata_in --之后键入就从fdata_in去取就可以了
 --data_out做为輸出
 process (sloe)
 begin
 if (sloe = 0 ) --輸出
 fdata = data_out;
 else
 fdata = (whenothers= z 
 end if;
 end process;
 data_out = xxxxxxxxxx --之后輸出都给到data_out就可以了 
2.2.2.3 高矮字节数序 从pc到fpga:

fpga fifo
din 16
dout 64

din 按序载入0xabcd, 0xefgh,0xijkl, 0xmnop
dout 0xabcd_efgh_ijkl_mnop (即先存进的为高16bit)

一数量 Num = 0x00708;
所有是以高字节数在堡垒址来画的报表,字节数数增大時间在后


读取来 Num2 = 0x0102

Num2 和 Num1 的关联为,高矮字节数倒序排序,随后每16bit內部两字节数互换。
要想键入Num 和 读取来的 Num2相同,
务必先向 Num 作 高矮字节数倒序排序,随后每16bit內部两字节数互换

从fpga 到 pc

fpga fifo
din 32
dout 16

din 0xab_cd_ef_gh
dout 按序读取 0xabcd, 0xefgh

同样的,reg fifo out dout为32位, Num = 0x;
byte3为最大字节数


2.2.2.4 用modelsim模拟仿真的情况下会出現鲜红色直线

鲜红色直线表明非平稳情况,标值情况为不明,将会的缘故以下
① 数据信号未授予原始值
② inout口解决不善,两边同时开展out輸出导致不平稳情况

2.2.2.5 chipscope没法捕捉数据信号

滞留在转圈圈的情况,提醒 waiting for core to be armed,slow or stopped clock

这一难题毫无疑问是由于败给chipscope的数字时钟沒有跑起來!!!
有一些复位数据信号的缘故,外界复位数据信号沒有锁住都没有取值,将会就收到pll的rst上,造成一直在复位,数字时钟就沒有跑起來

数字时钟最好从pll的bufg以后收到chipscope上!!!

奇奇怪葩的难题:
今日遇到一个很怪异的状况,原先的工程项目死活也不行,fpga程序一烧进来,就接到一大坨数据信息,EP6立即满了,EP8也是有数据信息,非常怪异!!!之后换了一个工程项目就行了

2.3 上位机 2.3.1 开发设计自然环境配备

fx2上位机开发 vs2013配置1

fx2上位机开发 vs2013配置2

剩余的便是

#include CyAPI.h

便可令其用了

2.3.2 Cypress 库涵数的应用

Cypress C++库涵数参照文本文档

CyAPI.pdf

关键涵数

2.3.2.1 open()
 Example
 CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
 // Attempt to open device #0
 if (USBDevice- DeviceCount() !USBDevice- Open(0)) {
 USBDevice- Reset();
 USBDevice- Open(0);
 }
2.3.2.2 EndPointOf( )
 Example
 UCHAR eptAddr = 0x82;
 CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
 CCyUSBEndPoint *EndPt = USBDevice- EndPointOf(eptAddr);
 if (EndPt) EndPt- Reset( );
2.3.2.3 XferData( )

这一涵数 IN 和 OUT节点都可以以用的, bulkin得话便是接受,bulkout便是推送

 Example
 CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
 unsigned char buf[] = hello world 
 LONG length = 11;
 if (USBDevice- BulkOutEndPt)
 USBDevice- BulkOutEndPt- XferData(buf, length);
2.3.2 调节 1)操纵节点实际操作不了功

一个是由于详细地址错误,另外一个是由于长短错误,length务必是LONG,随后假如有持续的涵数套入,务必把长短设成可变更的引入,LONG lenth,不然会回到不成功。

2)上位机短包推送限定

每个短包具体上占有了一个buffer缓存,512x4 16bit的节点配备,一共就只有推送4次短包便会满
以下图所显示:

每一次推送12字节数,只有推送4次,再推送就不成功了!!!!
并且一旦出現推送不成功,不管是手机软件复位還是别的甚么的也不管用!!!务必再次上电才能够!!!

3)尺寸端次序

要留意,不管是发回是收,全是小端序。
PC机先发0x03,再发0x04, 在slave_fifo里读取来是0x0403
此外pc机內部因此小端序,因此

u8 outbuf[2];
*(u16*) (outbuf[0]) = 0x0403; //outbuf[0]= 0x03, outbuf[1]= 0x04

随后outbuf推送,在fpga端接到的便是0x0403,恰好和推送的情况下的数据信息是一样的!!!

fpga推送 0x0304, pc上先接到0x04,后接到0x03

 u8 inbuf[2];
 regVal = *(u16*) (inbuf[0]); //inbuf[0]= 0x04, inbuf[1]= 0x03; regVal = 0x0304
3. 关键编码

==It s a secret!!!==



联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503