【红色飓风Nano二代测评】USB测试——固件总结
0赞
首先,USB开发有3个部分;
1、USB芯片配置部分(固件部分)
2、USB上位机部分
3、USB FPGA驱动部分
USB芯片配置部分是很重要的,芯片没有配置好,后面将会出现一系类蛋疼的问题,但是一旦配置好,它就是个死的,固定的。
USB上位机部分,有源代码可以参照,主要了解上位机中几个重要的语句即可!某些情况下,还要注意一下线程的问题。
FPGA驱动部分,注意时序问题。
最后,注意三者的“配合问题”
这次主要说下固件部分,我认为最重要的部分就是固件部分,因为他扮演的是一个枢纽的角色,联系着上位机和FPGA。
它是如何扮演这个枢纽的角色还请听我慢慢道来。
首先我要说整个固件部分的框架Cypress公司已经为我们打好了,
其次,固件部分的开发,是有两个部分的。
第一个部分关联着FPGA,第二个部分关联着上位机。
而我们只需要将这两个部分进行修改,就能完成固件的配置。往往第二个部分会被人们忽略。
首先在安装目录下找到这个KEIL工程,这个就是Cypress公司已经为我们打好的固件框架。(如何安装
Cypress的软件以及KEIL详见我之前转载的文章)
这个文件是不能直接修改的,请将其复制到别处,新建工程,在将其修改。
第一个需要修改的部分在:bulkloop.c中,我们看到一个叫TD_Init()这么一个函数:
示例程序已经展示了部分的程序,我们要做的就是修改这部分的程序。如何修改就要根据Nano2的原理图了:
1、USB的16位总线都引出来的了,所以可以将其设置为16总线模式(也可以是8位总线模式)
2、XTALN直接接到了24M晶振,所以FPGA不需要额外为其提供时钟。
3、USB_FASSR0和USB_FASSR1实现端口选择的两个已经也引出来了,所以选择(2,4,6,8)
哪个端口也是自由的,默认端口2,4默认输入端口6,8默认是输入端口。
4、FLAGB默认是满标志位,FLAGC默认是空标志位。至于是哪个端口的标志位,要看USB_FASSR0
USB_FASSR1指向哪个端口(00,01,10,11分别指向端口2,4,6,8)
最后介绍两个有关时钟的寄存器,这两个寄存器也是成败的关键。(有些中文文档把我坑的很惨啊,
看了英文文档才彻底明白的。)
寄存器CPUCS:
我们只用关注b4和b3:
刚才说到了XTALN直接接到了24M晶振,这里我选择24M。这个时钟直接关系到你
的USB芯片是否工作,如果没有这个时钟固件程序是不会运行的。
CPUCS |= 0x04;(或者直接写成CPUCS = 0x0a;)
接下来是寄存器IFCONFIG:
这个寄存器是设置USB芯片读写FIFO的时钟。
首先看最高位:
意思就是说IFCLK时钟即可以由外部时钟提供,也可以由内部时钟提供。如果该为1那么那么就选择的是
内部时钟,内部时钟的话也有两种选择30M和40M(根据bit6选择)。如果为0则需要提供外部时钟!
外部时钟就由原理图中USB_IFCLK输入。外部时钟的好处就是获得跟灵活的配置,时钟可以选择
5~48M。下图可以很好的说明这点:
bit6就不说了,再看bit5:
如果选择为内部时钟又选择同步时序的话(异步时序自然无所谓),这位应该为1,以为FPGA提供同步时钟读写FIFO。
如果选择外部时钟,这位因该选择0,以保证外部时钟的输入!
bit 3也是相当重要的一位:选是异步时序还是同步时序。0:同步; 1:异步;
注意到画红线的部分:就是说如果选择了异步时序,那么IFCLK引脚是必须没有clock信号输入的!
那么如果FPGA用的是异步时序,就别再傻傻的用PLL再去为他添加时钟了,只会适得其反而已~~
最后我的选择是,IFCLK选择内部时钟,且时序选择异步时序。
原因是:
1、如果是选择外部时钟的话需要PLL为其提供时钟但是Nano2的IFCLK虽然引出来了,
但是接的不是FPGA的全局时钟引脚,而Xilinx的PLL引出又比较讲究~~~此处省略100字(以后再说)
2、个人觉得异步时序跟稳定靠谱,且无需引入外部时钟,最快也是48M,但是最低可以是超脱5M的极限
达到更低的速度,不过这个似乎没啥了不起的,呵呵!)(据说200khz都是可以的)
嘴都说干了,总结起来就下面这一句精华了:
IFCONFIG = 0xCB;//选择为48M内部时钟,且为异步slaveFIFO模式。
第一部分就说到这里了,其他的话自己看看寄存器也就清楚了,提示一下,很多东西默认就好了。比如说:
FLAGB默认是满标志位,FLAGC默认是空标志位。这个部分我认为是主要建立USB芯片与FPGA的关系。
而第二部分主要是建立与上位机的关系。
接下来是第二部分:dscr.a51
第二部分就是修改它了,他也在刚才提高的KEIL工程里。
我们一起来看看它是如何和上位机建立关系的。
1、实现自定义VIP VID就是需要在里面修改
2、你要用到FIFO的哪个端口(2,4,6,8)方向是输入还是输出
也是在里面修改的,你只“第一部分”里改,上位机是不会认账的!
以上是默认的程序,我们看到默认是开启4个端口的,其中端口2,4是默输出;4,6是输入。
且默认都是块(BULK)传输方式。
如何改,这里举个例子,比如说你的开发板由于设计问题,只用到端口2,且必须为输入。
那么,这么改:
;; Interface Descriptor
db DSCR_INTRFC_LEN ;; Descriptor length
db DSCR_INTRFC ;; Descriptor type
db 0 ;; Zero-based index of this interface
db 0 ;; Alternate setting
db 1 ;; Number of end points //启用一个端口
db 0ffH ;; Interface class
db 00H ;; Interface sub class
db 00H ;; Interface sub sub class
db 0 ;; Interface descriptor string index
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 82H ;; Endpoint number, and direction//设置端口2,为输入
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB)
db 02H ;; Max packect size (MSB)
db 00H ;; Polling interval
其他的直接屏蔽或者删除就好了,这样上位机就只能检测到为输入的端口2了,
且他识别到的端口号就0x82(最高位即端口方向,低四位表示是哪一个端口)
3、
这里最后一句是调整USB电流大小的,50~250,根据电脑USB供电能力进行调整,这个试试玩的。
某个人,之前写的250,出现各种问题,随后改成100就好了,呵呵~~
4、
最后,设备的名称也是在这里改的:
温馨提示:每个字符就算是空格也必须有,如果单引号里啥都没有,也会悲剧的,不信你就试试,呵呵。
技术讨论欢迎加群~~电子技术协会 362584474