USB基本知识
- 概念:USB是一种通用串行总线。
- USB系统:一定是由一个PC和外围设备组成。外设称为USB设备,PC为主机。主机里有USB主控制器,负责完成主机和USB设备之间的物理数据传输。USB主控制器分为两种,具体哪两种这与FPGA开发无关,在此不细说。USB设备分为集线器和功能设备两种,集线器可以让一个USB端口连接多个设备。功能设备指的是功能性的设备,例如鼠标键盘。
- USB信号线:一共四根线,两根差分NRZI编码线。两根电源线,电压5V,最大电流100mA,500mA。
- USB事务处理:主机和USB设备之间的数据传输最基本的单位。它是有特定格式的信息包。主机和USB设备之间的通讯需要多个事务处理包才能完成。
- USB的传输类型:控制传输、批量传输、中断传输、同步传输。具体如下表。
同时,USB接口和FPGA的通讯大都采用的是68013芯片的FIFO模式。根据FIFO的传输特性,满足大量、速度恒定、有周期性的要求,所以应该是同步传输模式。这种通讯类型等特性的选择可以通过固件配置。
- USB的描述符:这个东西的定义晦涩难懂,对于FPGAer来说,把它看成了用来定义USB各个性能参数的寄存器。
- USB的设备请求:大概定义了USB各类请求格式。对于FPGAer而言,依旧不知道它干啥的,应该也不用知道。
CY7C68013芯片
- 简介:他是第一款支持USB2.0协议的微处理器。支持12Mb/s全速传输(即USB0)和480Mb/s(即USB2.0)高速传输。上文提到的四个传输类型该芯片都支持,但是和FPGA通讯所采用的FIFO模式,是其中的同步传输模式。具体框架如下图:
大概的接口图如下:
- 显著特点:
- USB单芯片解决方案,集成了USB2.0,串行接口引擎,和增强型51内核。
- 可以软件配置RAM(即配置固件),方式多种:USB口下载、E2PROM(有专门的烧写软件)、或者外围的存储(只限于部分封装)。
- 可编程GPIF。
- 集成的81内核。
- 智能串行接口引擎。
- 中断矢量
- I2C接口
- 4个集成的FIFO轻松和外部FPGA/DSP等连接
- FIFO模式
该模式是与FPGA/DSP等芯片连接的一种常见模式。之前版本的USB芯片,微处理器(51内核的)都要参与数据的处理。在速率不高的时候,12Mb/s全速传输模式下没有问题,但是到了480Mb/s的时候,微处理器就成为了瓶颈。
而此版本的68013直接解除了微处理器对数据处理的干预。
68013的通讯类型等特性可以通过固件配置。根据FIFO的传输特性,满足大量、速度恒定、有周期性的要求,所以应该是同步传输模式。
最高是96MByte/s。以8bit为例,则传输速率是96Mhz,一共四个FIFO,可以同时工作,所以fifo最高速率是24Mhz。(FPGA和FIFO的通讯同时只能和一个fifo)
- 增强型8051核
画重点:外接24Mhz,内部分频,产生480MHZ供USB2.0使用。(疑问:这里的480MH的时钟就是为上文中480Mb/s高速传输模式提供的源吗)
8051的内存:由下图而知,从下至上主要分为了8K的主RAM(地址0000·1FFF),用于缓存代码和数据,同时这部分的内存可以通过EA角进行外扩内存。(地址E000·E1FF)作为临时RAM,不能跑程序。(地址E400·E47F)用于存储GPIF的波形。(地址E600·E6FF)用于保存控制状态寄存器。(地址E740·E7FF)和(F000-FFFF)都是用于数据缓冲的内存。分别称之为端点0/1/2/4/6/8。 其中端点0和端点1仅能由固件程序访问。2/4/6/8端点是FIFO的空间。
对于FPGA开发者而言,唯一需要了解的是,FIFO模式下读写的数据(端点2/4/6/8)缓存的地方其实就是8051的内存区F000-FFFF。
- IO系统:IO功能分为了三类,第一类就是普通的IO口,第二类就是FIFO模式下的数据读写口,第三类是GPIF接口。
Slave FIFO模式调试(USB设备为FPGA)
- 1.基本要素:虽然基于FX2(68013)芯片的设备可以直接使用FX2的内核8051传输数据,但是大部分环境下,还是将FX2用做USB和外部逻辑芯片(DSP或者ASIC等)的一种连接通道。
USB数据通过可以通过FX2的内置FIFO让数据在主设备(PC)和逻辑设备(FPGA)间传输。
GPIF和slave fifo模式其实都是属于FX2芯片的fifo模式。
对于那些逻辑芯片里没有标准fifo接口的,FX2里面内置的GPIF可以作为主控,在这种模式下(GPIF模式下)我们称之为主fifo模式,FX2本身就是FIFO的主控设备。当FIFO被外部的设备控制时(外部设备主控),例如,和FPGA相连,就是处在Slave FIFO模式。
Slave FIFO模式下,包括了四个FIFO。他们能够工作在16位和8位模式。大概的系统框图如下:
其中硬件配置涉及的部分寄存器如下:
- 2.引脚:
FX2的复位只能在普通的IO模式下进行,在fifo模式下是不可以进行复位的,所以你看在slave模式下是没有复位信号的。
如果想把芯片配置到SLAVE fifo模式下,需要对IFCONFIG 这个寄存器进行设置,fifo和外部主控的信号连线如下图:
SLOE:FD数据信号是双向的,可以通过SLOE信号线进行选择。低有效。
FIFOADR:选择哪一个FIFO挂到FD总线上。低有效。
SLRD、SLWR:读写信号。分为了同步和异步两种模式。低有效。
FD:总线。可以配置为8bit和16bit模式。8模式下,用的是PORT B。16模式下,用的是PORT B和 PORT D。(PORT的概念可以去FX2手册中找)。上电默认是16位模式。其中,如果改成8位模式的时候,PORT D可以作为普通IO使用。
IFCLK:可以使用内部时候和外部时钟。内部时钟的时候,时钟频率30/48可以选择。外部时钟的时候,5到48MHZ时钟可以调整。上电默认是内部时钟48MHZ。
FLAG(FLAGA, FLAGB, FLAGC, FLAGD):这些信号主要用于监测FIFO状态,具体功能可以配置。FLAGA, FLAGB, and FLAGC 这些都可以工作在indexed和fixed两个模式。FLAGD 只能工作在FIXED模式。
Indexed模式下,flag只能显示所选择的fifo的状态,FLAGA/B/C分别代表“programmable-level” ,full,empty。Fixed模式下,flag显示特定fifo的状态,而无论是否选择了该FIFO。full,empty默认是低有效,也可以用寄存器进行配置。
上电默认是Indexed模式。
FIFOADR:选择哪一个FIFO。
PKTEND:无论设置的数据长度是多少,有效该信号则代表数据传输的结束。一般用于长度比较短的数据。例如,如果通过寄存器设置的数据长度是512byte.当一次传输的数据长度短于512时,由于数据低于设置的长度,一般主控有两个方法让数据发送。一个就是发送虚拟的数据满足最终的长度。或者有效PKTEND脚,这样就能直接写短长度的数据。
SLCS:FIFO选通信号。该信号有效,则所有控制才有效。
3.时序
引脚的控制时序:控制管脚主要是SLOE(输出使能),SLED(读使能),SLWR(写使能),PKTEND(包尾),FIFOADR(FIFO选择)。这里的读写都是以外部的主设备角度讲的。
读时序:SLOE使能FD总线脚。 同步模式,SLRD在时钟上升沿有效,SLRD有效同时FIFO计数加一个。异步模式则在SLRD变化时有效。他们默认都是低有效。
写时序:同步模式,SLWR上升沿有效。默认都是低有效。
写案例:
典型写过程(相对于主机):
典型读过程(相对于主机):
注意:读过程比写过程多了对SLOE信号的使能。
异步时序暂时不做讨论。可以参照官方文档。
调试记录
(读):
(写):
Rd和oe的关系:按照官方推荐sloe是需要提前slrd有效的
主要的参考资料:
1.《USB+FPGA开发文档》(某开发板资料)
2.《FX2开发手册》官方手册
3.《GPIF开发手册》本文中未做参考,有需要的可以看看
所有资料均在本人的CSDN的资源页面。