宋桓公

【红色飓风Nano二代测评】USB测试——固件总结

0
阅读(2618)

首先,USB开发有3个部分;
1、USB芯片配置部分(固件部分)
2、USB上位机部分
3、USB FPGA驱动部分

USB芯片配置部分是很重要的,芯片没有配置好,后面将会出现一系类蛋疼的问题,但是一旦配置好,它就是个死的,固定的。


USB上位机部分,有源代码可以参照,主要了解上位机中几个重要的语句即可!某些情况下,还要注意一下线程的问题。


FPGA驱动部分,注意时序问题。


最后,注意三者的“配合问题”

这次主要说下固件部分,我认为最重要的部分就是固件部分,因为他扮演的是一个枢纽的角色,联系着上位机和FPGA。

它是如何扮演这个枢纽的角色还请听我慢慢道来。

首先我要说整个固件部分的框架Cypress公司已经为我们打好了,

其次,固件部分的开发,是有两个部分的。

第一个部分关联着FPGA,第二个部分关联着上位机。

而我们只需要将这两个部分进行修改,就能完成固件的配置。往往第二个部分会被人们忽略。

首先在安装目录下找到这个KEIL工程,这个就是Cypress公司已经为我们打好的固件框架。(如何安装

Cypress的软件以及KEIL详见我之前转载的文章)

image

这个文件是不能直接修改的,请将其复制到别处,新建工程,在将其修改。

第一个需要修改的部分在:bulkloop.c中,我们看到一个叫TD_Init()这么一个函数:

image

示例程序已经展示了部分的程序,我们要做的就是修改这部分的程序。如何修改就要根据Nano2的原理图了:

image

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:

image

我们只用关注b4和b3:

image

刚才说到了XTALN直接接到了24M晶振,这里我选择24M。这个时钟直接关系到你

的USB芯片是否工作,如果没有这个时钟固件程序是不会运行的。

CPUCS |= 0x04;(或者直接写成CPUCS = 0x0a;)

接下来是寄存器IFCONFIG:

image

这个寄存器是设置USB芯片读写FIFO的时钟。

首先看最高位:

image

意思就是说IFCLK时钟即可以由外部时钟提供,也可以由内部时钟提供。如果该为1那么那么就选择的是

内部时钟,内部时钟的话也有两种选择30M和40M(根据bit6选择)。如果为0则需要提供外部时钟!

外部时钟就由原理图中USB_IFCLK输入。外部时钟的好处就是获得跟灵活的配置,时钟可以选择

5~48M。下图可以很好的说明这点:

image

image

bit6就不说了,再看bit5:

image

如果选择为内部时钟又选择同步时序的话(异步时序自然无所谓),这位应该为1,以为FPGA提供同步时钟读写FIFO。

如果选择外部时钟,这位因该选择0,以保证外部时钟的输入!

image

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就是需要在里面修改

image

2、你要用到FIFO的哪个端口(2,4,6,8)方向是输入还是输出

也是在里面修改的,你只“第一部分”里改,上位机是不会认账的!

image

以上是默认的程序,我们看到默认是开启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、

image

这里最后一句是调整USB电流大小的,50~250,根据电脑USB供电能力进行调整,这个试试玩的。

某个人,之前写的250,出现各种问题,随后改成100就好了,呵呵~~

4、

最后,设备的名称也是在这里改的:

image

温馨提示:每个字符就算是空格也必须有,如果单引号里啥都没有,也会悲剧的,不信你就试试,呵呵。

image

技术讨论欢迎加群~~电子技术协会 362584474

Baidu
map