USB方向:
由于主机是唯一主控者,因此OUT是主机到设备,IN是设备到主机,FX2的术语采用这个约定
USB设备枚举:
每个USB设备内部都有一个设备描述表,表中包含了设备全部要求和特性。USB设备插入主机后,主机会执行认证程序(设备枚举)
① 使用预设地址0取得设备描述符
② 设定设备新地址
③ 使用新地址取得设备描述符
④ 取得配置描述符
⑤ 设定配置描述符
设备枚举就是通过连接主机与设备之间的控制传输来辨识和配置新连接上的USB设备的过程。
成功后,Windows系统注册表中就会发现相应的VID和PID
串行接口引擎SIE:
每个USB设备都有SIE
SIE的功能是对信息包PID进行译码,利用传输的CRC位进行错误检测,并传输下载数据到USB设备
SIE从设备接收字节及控制信号,并为数据做格式化,通过D+和D-传输出去,另外还自动做"位填充"动作
FX2中的增强的SIE可完全独立的完成设备枚举工作,也可下载固件代码到RAM、对CPU进行复位操作。
设备重枚举:
EZ-USB系列新品有个非常重要的特性,就是以"软"为主,包含了内部程序、数据RAM,可通过USB总线下载运行,赋予设备新的特性。
而正是由于采用"软"方案,故同一个芯片可扮演多重特性:
首次插入USB时,自动进行设备枚举,下载固件程序和USB设备描述表;
之后再次枚举(重枚举),根据第一次枚举中下载的信息进行设备定义,在初次枚举后立即进行,不做提示。
当然,也可以与一般的USB接口芯片一样,从外界EEPROM中下载固件并自动运行。
USB连接框图
为适应USB2.0的增强带宽,FX2端点FIFO和从属FIFO端点统一采取措施,省去内部传输所花费时间
FIFO可通过外部主控制器控制,用外部时钟信号同步运行,或工作在异步方式。
FIFO也能够由内部FX2时序生成器控制,即通用可编程接口(GPIF),GPIF的时钟可以是内部时钟,也可以是外部时钟。
FX2芯片工作在3.3V电压,可用USB的5V转换
EX-USB FX2中的CPU有两个职责:
1、负责USB2.0协议中"USB设备固件"中所定义的协议标准,这个已经被智能SIE简化了
2、剩余的代码空间可满足CPU基本工作,并完成对设备的操作
CPU用来设置和控制数据收发器,但CPU一般不参与高带宽传输,不在数据通道上,参与高带宽传输的是FIFO。
为了使接口通用,引入了可编程时序生成器(GPIF),满足FIFO与外部电路的接口。
无EEPROM或EEPROM无效:
这种最简单的情况下,FX2枚举为缺省USB设备(VID:0x04B4,PID:0x8613),根据ID号,操作系统确定哪一个驱动程序被装载。
这种配置是最受制约的,这种配置下,利用Cypress软件工具,仅仅能用于程序代码的开发(需要编写自动下载固件的驱动,或者每次上电手动下载固件),不适用于真正的基于FX2芯片设计的USB外围设备产品发布。
"C0"EEPROM引导加载(仅加载ID码)
初始枚举时,如果检测到EEPROM连接到I2C总线,且地址0的值为0xC0,则FX2将自动从EEPROM赋值VID、PID、DID替换缺省的ID(同时8个EEPROM字节还包含I2C总线频率和断开极性设置)。
接着进行重枚举,加载新的ID对应的驱动程序。
如果只想改变I2C总线的速度(而不需要改变断开极性),则改变控制寄存器相应位即可实现,EEPROM没有也可以
"C2"EEPROM引导加载(加载固件至内部ROM)
上电时,FX2检测到EEPROM连到I2C
————————————————————————————————————
开发套件安装时采用默认路径可以省却不少麻烦,主要在于一些内置的路径引用,如果自己改了路径会出问题
自己定义的USB通信策略:
上位机程序用Labview开发。原因:含有丰富的测试测量控件,可以据此开发出功能强大的上位机显示、处理程序
Labview通过CYUSB.dll库调用底层的通用USB驱动cyusb.sys(均为官方提供)
手动下载slave.hex到CY7C68013A的RAM中,将其配置为从属FIFO模式,供FPGA控制
FPGA用verilog开发USB主控模块,与CY7C68013A接口
注:
不采用开机自动将固件程序下载至芯片RAM的方式
原因:需要结合CYPRESS开发包EZ-Loader Drivers以及HEX2C和Windows DDK生成所需要固件自动下载程序.sys文件(自己开发驱动,难度大)
PS:CyLoad文件夹下的驱动可以自动下载固件,应好好看一下
不采用EEPROM上电自动加载固件的方式
原因:自带的24LC0B大小只有2K,装不下hex文件
————————————————————————————————————
AN61345所附的slavefifo固件解析:
readme.txt翻译(此readme有问题,与代码颇有不符之处,可不看)
This directory contains 8051 firmware for the Cypress Semiconductor EZ-USB FX2
chip.
此目录包含Cypress半导体EZ-USB FX2芯片的8051固件
The purpose of this code is to demonstrate how to utilize EZUSB FX2 Slave Sync Mode
(in a back to back application - FX2 in SLAVE FIFO Sync).
本代码的目的是演示如何使用EZ-USB FX2的从属同步模式(在点对点(两个FX2相连)应用中——FX2处于从属FIFO同步模式)
The code is written in C and uses both the EZ-USB FX library and the FrameWorks.
此代码用C语言编写,使用了EZ-USB库和框架
It configures FX2 as follows:
01). EP2 512 4x BULK OUT - 16-bit sync AUTO mode
02). EP6 512 4x BULK IN - 16-bit sync AUTO mode
它将FX2配置为如下模式:
EP2 4X512字节 批量输出——16位同步自动模式
EP6 4X512字节 批量输入——16位同步自动模式
.....from the slave (in this case is FX2 in Slave FIFO mode)
01). 512 byte buffer for EP2 OUT (master) -> EP6 IN data (slave)
02). 512 byte buffer for EP6 IN (master) -> EP2 OUT data (slave)
04). peripheral interface functions in 16-bit sync mode
从从属端看(在这个例子中是运行于Slave FIFO模式的FX2)
(主控端)512字节缓冲区EP2 OUT——>EP6 IN 数据(从属端)
(主控端)512字节缓冲区EP6 IN——>EP2 OUT 数据(从属端)
外部接口功能处于16位同步模式
.....from "the user":
01). EP2 512 4x BULK OUT data is sent to EP6 512 4x BULK IN
02). EP6 512 4x BULK IN data is received from EP2 512 4x BULK OUT
从使用者角度
EP2数据发送到EP6
EP6数据从EP2处接受
NOTE: we'll initially test using 16-bit mode so the host application/driver doesn't need to pad odd data sizes, say 8191 bytes... etc.
注:我们最开始使用16位模式以便主机应用/驱动不需要填补零散的数据大小,比如8191字节……等等
The "slave_sync.hex" file loads into internal memory.
...issue "build -i" at the command prompt...
This example is for illustrative purpose(s) and unless you have an ext. slave that emulates the testing environment this example won't actually produce expected results when downloaded via Control Panel. The external slave in this case is EZUSB FX2 running in Slave FIFO mode
这个例子起演示作用,除非你有一个ext slave可以模仿测试环境,否则这个例子无法通过Control Panel下载得到正确的结果
external slave是指运行于Slave FIFO模式的EZUSB FX2
In this implementation the master to slave pin assignments are as follows:
在这个实现中,对slave的主控端的引脚配置如下:
slave(FX Slave FIFO SYNC mode) master(FX GPIF SYNC mode)
==================== =========================
SLRD <---- CTL0
SLWR <---- CTL1
SLOE <---- CTL2
FIFOADR0 <---- PA6
FIFOADR1 <---- PA7
FLAGA_PF ----> PA4
FLAGB_FF ----> RDY1
FLAGC_EF ----> RDY0
PA0 ----> INT0#
IFCLK <---> IFCLK
Control Panel 应用程序可能需要使用
The Control Panel Application may be used to drive this example as described in the tutorials.
___________________________________________________
FX2在复位后,IO引脚默认配置在"端口"模式,而不是Slave FIFO,
文档解读:
AN61345_Designing with EZ-USB FX2LP Slave FIFO Interface using FPGA
FX2LP-FPGA接口主要用于高速USB连接数据获取、工业控制或监控以及图像处理
FX2LP(以下简称FX2)运行在synchronous Slave-FIFO模式下,FPGA作为主控制器
这篇应用笔记提供了FX2的Slave-FIFO模式工作的例程固件,以及FPGA实现的VHDL和Verilog工程
FX2LP可以与FPGA以两种模式接口,一个是GPIF,一个是Slave-FIFO
GPIF:FX2作为主控制器,并产生读写数据所需要的所有控制信号。GPIF模式一般用于外部系统无法作为主控制器的情况(例如向FPGA中下载目标代码)。
这种情况下,大部分负载的接口实现工作由FX2的固件程序完成
Slave-FIFO:这种模式下,外部数据处理逻辑足以产生必要的读写控制信号
这篇应用笔记描述了16位同步Slave-FIFO的实现,包含了Verilog和VHDL语言的代码
我们假定你已经熟悉了Slave FIFO接口(参考EZ-USB Technical Reference Manual.pdf),Verilog编程,以及FPGA综合和实现工具
EZ-USB Technical Reference Manual.pdf中关于Slave FIFO
简介:大部分设备都是简单的使用EZ-USB作为USB和外在数据处理逻辑的通道(例如DSP,ASIC,FPGA,或硬盘上的IDE)
外部逻辑提供时序信号、握手信号(满、空、可编程的层次),读写开关,输出使能,等等
GPIF可以作为内部的主控制器(如果外部不能实现主控制的话,一般用于对外部逻辑进行操作(读或写),如下载目标代码)
硬件:
下图是FIFO的16位模式的原理说明,也可以配置为8位模式
下图是与Slave FIFO相关的寄存器
部分寄存器详细描述:
注意:官方给的Slave FIFO固件代码只用了EP2,EP6
IFCONFIG:interface configuration(Ports, GPIF, Slave FIFOs)关于IFCLK时钟、接口模式的设置
PINFLAGSAB:Slave FIFO FLAGA and FLAGB Pin Configuration
PINFLAGSCD:Slave FIFO FLAGC and FLAGD Pin Configuration FLAGA~D可通过4位编程代表不同的标志
例如:EP2EF,表示端点2 empty flag;EP4FF,表示端点4 full flag;EP8PF,表示端点8 Programmable Flag
PINFLAGSAB = 0x08;表示FLAGA是EP2EF,端点2空——官方固件代码的注释有误
PINFLAGSCD = 0xE0;表示FLAGD是EP6FF,端点6满——官方固件代码的注释有误
OUT端点只有状态空,表示OUT不空时,FPGA才可从OUT读取数据
IN端点只有状态满,表示IN不满时,FPGA才可向IN写入数据
FIFORESET:Restore FIFOs to Default State,重置FIFO状态,写入0x80将对主机的所有传输不响应;继续写入0x82, 0x84, 0x86, 0x88继续不响应,同时对2或4或6或8端点进行重置,写入0x00恢复响应
——固件代码此处可能有误,写入是0x02,0x04,0x06,0x08可能是错的
FIFOPINPOLAR:Slave FIFO Interface Pins Polarity,管脚极性。默认是0x00,表示PKTEND、SLOE、SLRD、SLWR、EF、FF各信号均为低电平有效
EPxCFG:Endpoint 2, 4, 6 and 8 Configuration Registers
默认1 0 10 0 0 10,激活,输出,批量,512字节(注:端点4和8只能设置为512字节),0,缓存类型(默认10是双,00是四)
EP2CFG = 0xA0;表示激活,输出,批量,512字节,4x缓存
EP6CFG = 0xE0;表示激活,输入,批量,512字节,4x缓存
EPxFIFOCFG :Endpoint 2, 4, 6 and 8/Slave FIFO Configuration Registers
bit4-AUTOOUT,瞬间连接端点FIFO,只对输出端点有效,默认0,设为1表示一旦buffer被USB数据填满,buffer就自动和瞬间被提交到端点FIFO,而不经过CPU,端点FIFO标志和buffer计数立即表示FIFO的状态改变
bit0-WORDWIDE,选择PORTB/D引脚上的字节/字 FIFO,
EP2FIFOCFG = 0x11; //AUTOOUT=1, WORDWIDE=1,注意有些位对OUT端点无效
EP6FIFOCFG = 0x0D; // AUTOIN=1, ZEROLENIN=1, WORDWIDE=1,注意有些位对IN端点无效
关于WORDWIDE位的说明:
WORDWIDE=0,8位模式,FD[7:0]取代Port B
WORDWIDE=1,16位模式,FD[15:8]取代Port D,FD[7:0]取代Port B,复位默认值是16位
用FIFOADR[1:0]选通4个FIFO中的某一个与FD连接,如果都是8位模式,Port D才会被空出,若任意一个FIFO被设置为16位,Port D都会被占用
EPxAUTOINLENH:只用到低两位
EPxAUTOINLENL:Endpoint 2, 4, 6, 8 AUTOIN Packet Length Low Registers(7:0)
表示smaller packets size,应该是只对IN端点有效,默认大小是10 0000 0000 即2^9=512Byte
EP6AUTOINLENH = 0x02; // set core AUTO commit len = 512 bytes
SYNCDELAY;
EP6AUTOINLENL = 0x00;
SYNCDELAY;
EPxFIFOPFH:Endpoint Slave FIFO Programmable Level Flag High Registers当包达到此自定义大小时,PF发出警告,将满或将空
EPxFIFOPFL:
PORTACFG:控制Port A的复用功能
INPKTEND:
关于寄存器的名称
大部分寄存器都是用来处理端点(endpoint)的,命名规则为DDDnFFF
DDD是端点的方向,IN或OUT(相对于USB主机来说)
n是端点序号,其中ISO表示一类isochronous(等时的,同步的)端点
FFF表示功能:
CS是控制和状态寄存器;
IRQ是中断响应位
IE是中断使能位
BC,BCL,BCH是字节计数寄存器。BC是单字节计数,BCH/BCL是16位计数器的高和低字节
DATA是single-register access to a FIFO
BUF是buffer的入口地址
USB表示全局(不只是端点)USB功能
ADDR表示地址
VAL表示有效
FRAME表示框架计数
PTR表示地址指针
15.15节
同步延时
在某种情况下,对寄存器的一些读和写操作必须被一些同步延时分开
以下情况必须加入同步延时:
0xE600-0xE6FF的任意寄存器的写和表15-6寄存器的写之间
表15-6寄存器的写和0xE600-0xE6FF任意寄存器的读之间
最小的延时长度是IFCLK和CLKOUT(CPU时钟)频率的函数,用下式计算
上式的单位是CPU指令周期
最典型的情况是下面的算式:
固件框架中包含了宏SYNCDELAY,实现了这个功能,此宏在fx2sdly.h文件中
注:这些延时周期不包含MOVX指令(取指令)所占用的两个时钟周期
—————————————————————————————————————————————————————
文档解读:
AN65209_Getting Started with FX2LP——重要
介绍EZ-USB FX2LP USB 2.0 设备控制器。
如果你是第一次看FX2LP,本文是一个最好的开始的地方。
在这篇应用笔记中,你会学到创建FX2LP工程、浏览不同的开发工具。
这篇笔记也提供了USB 2.0的背景知识,引导你去看适当的文档,以便深入的学习FX2LP
简介
EZ-USB FX2LP(以下简称FX2)是可编程的、低功耗 USB 2.0 外置控制器。
本文简单的介绍了FX2,强调了它的基本特性。
参考数据手册,应用笔记,视频和其他技术参考材料是对于扩展你的FX2适应性和功能的知识。
讲述了创建一个例程,并下载固件镜像(.hex)到FX2的RAM中的步骤。
什么是FX2LP
FX2系列集成了USB 2.0收发器、串行接口引擎SIE,增强型8051微控制器,可编程外围接口。
FX2的主要功能是在USB主机和外围设备之间传输数据。并行(GPIF,从属FIFO)和串行接口(I2C,UART)提供了与系统中其他设备的额外连接。
在FX2不需要处理数据的系统中,仅仅需要固件对接口间的数据传输初始化即可。
FX2可枚举为标准USB类型设备或厂商自定义设备。
FX2特性
USB接口:
集成的USB2.0 收发器和智能SIE
7个物理端点(包含控制端点)
4KB端点存储
端点类型(批量、中断和同步)和端点缓冲(双、三和四)都是可编程的
串行接口:
集成的I2C主控制器,100~400KHz运行
两个标准8051 USART,其引脚是独立的,不与GPIO复用
多达40个GPIO,低速串行接口可以用这些通用IO实现
并行接口:
FX2有通用可编程接口GPIF,带有8-16位外部数据接口
使用GPIF,FX2可以直接与大多数通用接口连接。
GPIF有9位地址线,6位控制线,和6个准备信号,典型应用于FX2作为主控端(例如用FX2下载程序到FPGA中)。
从属FIFO接口典型应用于FX2在接口上作为从属设备的时候。
CPU和存储
8051有2个USART,3个计数器/定时器,一个增强中断系统
可用48MHz,24MHz,12MHz时钟
16KB片上代码/数据 RAM
启动选项:
FX2没有内置的Flash存储,所以固件必须存储于外部非易失性存储器,或从USB主机下载
与其他Cypress EZ-USB系列相似,FX2使用RAM作为程序存储,这个特性,加上Cypress的重枚举特性,允许FX2的固件在上电时由主机下载。
当FX2上电时,内置的USB loader被激活,加载了固件后,FX2断开并以固件所定义的设备重连USB。
这使得升级像web下载一样简单
56-pin封装的FX2特性
3个8位IO口,port A,B,D
I2C可用
UART不可用
GPIF主控:8或16位GPIF与Port B和D复用,5个非复用的控制信号
从属FIFO:8或16位从属FIFO接口与Port B和D复用,5个非复用控制信号和4或5个与Port A复用的控制信号
FX2应用开发:
FPGA与FX2的接口
采用并行Slave FIFO接口
此时FX2作为与主机间的快速数据通道
广泛使用的FPGA接口是同步FIFO
FX2提供了这种接口,如下图(其中Data Source/Sink可以是FPGA本身):
开发FX2上位机应用程序:
上位机应用使用Visual C#或C++工具开发。
为了帮助用户开发上位机应用,Cypress提供了C#(CyUSB.dll,Labview也可以调用)和C++(CyAPI.lib)的应用程序接口API。
可以参考AN70983
SuiteUSB 安装中还包含了steamer 应用的C#和C++的源代码
开发资源:
固件:Keil免费版(目标代码最大4KB);固件例程;同步从属FIFO固件例程,与FPGA接口(AN61345)
用一个Bulkloop(批量回环)工程作为例子说明如何创建和运行FX2固件。
Bulkloop的源码从Firmware/Bulkloop目录下找
Bulkloop程序使用OUT和IN端点:从PC端接收OUT数据,再将相同的数据从IN收发器传给PC端。
Bulkloop使用了4个端点:EP2和EP4配置为OUT端点,EP6和EP8配置为IN端点;EP2OUT到EP6IN以及EP4OUT到EP8IN回环
原理图如下:
————————————————————————————————————————————————
固件例程文件夹下的Readme.txt(从这里可以看出,安装到默认路径会省很多功夫)
Please check all the below options for firmware examples to work:
检查以下选项
1.setenv.bat: under bin folder is modified to
setenv.bat:在bin文件夹下,如果没有用默认路径安装,需要相应的改变该文件的内容
@echo off
REM to create a shortcut to this environment use the command line:
REM COMMAND.COM /e:4096 /k C:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0\bin\setenv.bat
REM
REM If you install the Keil or Cypress tools in a non-default location
REM you must update this file
path=c:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0\bin;c:\keil\c51\bin;%path%
set CYUSB=c:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0
set C51INC=%CYUSB%\Target\inc;C:\keil\c51\inc
@echo on
Open each firmware example using Keil uvision2 or higher
使用Keil2打开固件源码
2.Under IDE keil-->Project-->"File Extensions,Books and Environment" the paths is changed to
..\..\Target\Inc\;C:\Keil\C51\INC\
这里写错了,应该是"Componets, Environment and Books"选项下的"Folders/Extensions"选项卡,INC里应填的内容
3.In the Project "Options for Target Target1" -->Output Tab--> Check if "Run User program1" option is checked. with the path
..\..\Bin\hex2bix -i -f 0xC2 -o xxx.iic xxx.hex
This option allows to generate EEPROM image in .IIC format.
这个选项用来产生IIC文件
All these changes are under the assumption that CY3684 DVK Installer.exe default installation directory is
c:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0
以上所有这些都是在假设DVK安装在默认路径下
During Installation if the install directory is changed by the end user then steps 1 are to be repeated with modified path
4.During compilation of firmware examples if EZUSB.Lib and USBJmptbl.obj are not added and results in error during project build.
Select "Source Group1" folder in the Project Window Right click in project window and select "Add files to Group 'Source Group1' and browse to following folder for respctive kits
FX1:C:\Cypress\USB\CY3674_EZ-USB_FX1_DVK\
FX2LP:C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\
如果缺少这两个文件(EZUSB.Lib和USBJmptbl.obj)会导致编译失败,
Note: if the path of installation directory is changed then relevant path must be chosen
FX1:
FX2LP:
In the browse window select Files to All types .
Then only EZUSB.Lib and USBJmptbl.obj files are visible
Press Ctrl key on your keyboard and select both these files at the same instant.多选
Observe files getting added to project window.
Build the project again and observe the build errors no longer exist.重新编译,不再出错
--------------------------------
固件例程
Target\Fw\LP目录下提供了"固件框架"。
这个框架简化和加速了自定义固件开发的过程,通过使用Cypress代码,用于一般的操作,例如初始化、USB标准设备请求处理、USB暂停-恢复电源管理。
这个框架还提供了函数hooks和固件例程,擦除固件开发进程
你可以写下USB描述符表盒代码实现想要的功能,而无需担心底层USB细节
FX2固件框架使用Keil 2 IDE编写。
自带的Keil限制代码在4KB,如果想要更大的目标代码,需要自己从Keil购买许可
框架使用EZ-USB库(EZUSB.LIB),此库是一个8051 LIB文件,实现了对许多固件工程通用的函数(I2C读写路径库)。
这些函数不需要修改,因此以lib的形式提供
然而,套件中也提供了此库的源代码,Target\Lib\LP下
软件工具:
为了有助于开发固件,实现与主机有效的通讯,Cypress提供了软件工具,驱动和API库。
这些组成了Cypress USB Control Center,GPIF Desinger,Cypress generic USB driver,以及Cypress USB class Library API
注:这些软件都在持续的升级中,Cypress建议去官网下载最新版本
Cypress USB Control Center是主机应用程序,可以使用通用驱动(CyUSB.sys)与设备通讯。
SuiteUSB提供了对于Windows.NET语言(例如C#和Visual Basic.NET)的通用库
Cypress generic USB driver是一个稳定的高性能Windows驱动,用于主机和USB目标设备通讯的
此驱动以二进制文件形式提供(没有源码),可以分配给基于FX2LP的设备
Cypress建议分配之前,先进行认证
Generic USB driver on Windows platform:(如果要自己开发可以自动下载固件的驱动,看)
Windows平台的通用USB驱动
WinUSB是USB设备的通用驱动,与Windows Driver Framework(WDF)一起为Windows XP开发的。
WinUSB构架用内核模式驱动(Winusb.sys)和用户模式动态链接库(Winusb.dll,引出WinUSB的函数)所组成。
通过使用这些高级的函数,你可以用用户模式的软件来操作USB设备。
Winusb.sys被Win XP/7/8系统所支持,更多关于WinUSB驱动可以从msdn网站得到。
Linux/Mac OS的通用驱动
略
Cypress USB Class Library API(开发上位机程序,调用底层的Cypress驱动)
CyAPI.lib是C++库,简化开发过程。
关于API如何使用,在C:\Cypress\Cypress Suite USB 3.4.7\ CyAPI\examples下有例程
API的文档CyApi.pdf也在这个目录下
-------------------------------------
CyUsb.dll(Labview可用)是Windows.NET库,可用于所有的Cypress USB 2.0芯片系列
具体在C:\Cypress\Cypress Suite USB 3.4.7\CyUSB.NET目录下
———————————————————————————————————————————————————————
文档解读CY3684 DVK Kit_Guide.pdf
第4章,关于开发套件的目录
4.3节,驱动部分,看CyLoad目录
5. EZ-USB Firmware Frameworks固件框架
框架已经实现了EZ-USB芯片初始化、USB标准设备响应握手、和USB挂起-恢复电源管理服务的8051代码
用户提供USB描述符表和实现额外功能的代码来实现一个完整的兼容USB设备
5.1框架概述
启动时,框架初始化所有的内部状态变量,然后调用用户初始化函数TD_Init()
返回后,框架初始化USB接口到未配置的状态并使能中断,然后固件重枚举,并开启协同的任务分配器
任务分配器重复如下任务:
1、调用用户函数TD_Poll()——此部分函数由用户填写,是实现自定义功能的主要代码(Slave FIFO运行于自动模式,应该不需要)
2、判断是否有标准设备请求等待处理,如果有,则分析请求并响应。框架会自动处理标准USB设备请求,但允许用户覆写默认的行为。
3、判断USB内核是否收到USB挂起信号(USB Bus Idle flag is set),如果有,调用用户程序TD_Suspend();
USB中断由框架处理,它提供了USB事件的用户代码通知函数。
用户定义的函数就是下面这些
void TD_Init(void);用户定义的初始化
void TD_Poll(void);用户定义的主循环
BOOL TD_Suspend(void);用户定义的挂起前操作,此函数返回TRUE才真正的执行挂起
BOOL TD_Resume(void);用户定义的恢复前操作
5.2框架编译
此框架是用Keil uVision2写的。只在这些工具上测试过。代码用到了几个Keil的C扩展,所以其他编译器的适用性不能保证
如果要自定义设备框架,既可以从固件例程开始,也可以从"空"的框架代码开始
运行Bin文件夹下的setenv.bat设置编译环境(此批处理文件是基于假定你安装DVK和Keil在默认目录下的)
FW.C:main()——task dispatcher,setup command handler等,对于大部分固件 工程来说,没必要修改这个文件
PERIPH.C:这是自定义的地方,还包含了所有的USB和GPIF中断服务函数的框架
DSCR.A51:包含设备自定义描述符的编译文件——此处可以自定义VID和PID
FX2.H/LP.H:包含通用EZ-USB常数、宏、数据类型和库函数原型的头文件
FX2REGS.H/LPREGS.H:寄存器声明和位屏蔽常数
SYNCDLY.H/FX2SDLY.H:包含synchronization delay宏(两个文件内容一致)
EZUSB.LIB:库目标代码
USBJMPTB.OBJ:包含USB和GPIF中断的ISR(中断服务路径)跳转表
BUILD.BAT:使用Keil命令行工具编译/链接固件的批处理文件
FW.UV2:Keil 2工程文件,用于编译/链接固件
函数被分为三类:任务分配类(以TD为名),标准设备请求类(以DR为名)和USB总线中断处理(以ISR为名)
任务调度器:
TD_Init(),在框架初始化器件调用一次,在重枚举和任务调度开始前调用,用于全局状态变量和设备初始化
TD_Poll(),在设备运行期间循环调用,应包含实现用户额外功能的状态机,高优先级的功能可以在从该函数返回前完成。然而,返回失败会造成框架无法响应设备请求和USB挂起事件。如果需要大量的处理时间,必须在多个TD_Poll()调用中分开执行。
采用SLAVE FIFO的芯片工作在自动模式,所需传输的数据均由芯片自动完成无需特别编写代码,因而TD_Poll应为空。
TD_Suspend():在框架进入挂起模式之前执行。该函数包含了将设备运行于低功耗状态的代码,然后返回TRUE。然而,返回FLASE可以阻止框架进入挂起模式。
TD_Resume():此功能在框架响应外部恢复事件恢复处理器之后被调用,,如外界产生wakeup中断或发生USB总线传输活动,设备就会调用此函数来重启处理器。此过程可看作是TD_Suspend()函数的逆操作。
设备请求函数
这些是SetupCommand调用的辅助函数
DR_GetDescriptor()
在框架解码和实现GetDescriptor设备请求之前被调用
6. Cypress USB Drivers for EZ-USB Kits驱动程序
SuiteUSB提供了一系列C++和C#开发的主机应用程序,用于与任何cypress USB 2.0设备通讯
Cyxxx.cat - These are Windows Catalog files which contain Digital Signature. This file indicates that this driver-cyusb.sys passed Microsoft driver Certification process (WHQL) process.
Windows目录文件,包含了数字签名。表示cyusb.sys通过了微软驱动证书过程
Cyusb.sys - This is the cypress provided generic USB driver for all USB 2.0 products.
USB2.0产品的通用驱动
Cyxx.INF - The file contains information about the .cat file and .sys file entries.
定义了驱动和脚本的目标目录,拷贝到系统目录,自动加载和注册设备的入口
此包里提供的INF文件不要修改,这些是用于提供给中断用户测试EZ-USB的不同特性的
如果inf文件修改了,数字签名就失效了,用的是和会有警告提示(其实警告无非就是自己定义的驱动没有通过微软认证,用起来应该是没问题的)
推荐实验室中自己定义时,VID采用原来的,PID自己稍改一下
默认的VID/PID也不应该用于任何其他的目的,除了用于测试基本功能
这些inf文件有两类:
固件例程所使用的和默认EZ-USB配置的驱动
使用脚本将固件和Keil监控自动下载的驱动
6.3 用脚本自动下载固件和Keil Monitor的驱动
如果用户想将固件下载的过程自动化,就应该使用脚本:任何时候,与脚本相对应的响应VID/PID的设备被检测到,Windows系统就自动下载脚本中的固件。
CyLoad文件夹下包含CyLoad.spt,Cyload.cat,CyLoad.inf和cyusb.sys
6.3.1 如何生成脚本文件
脚本文件是与特定的固件相对应的。
CyScript.exe,打开相应的hex文件,设置好脚本文件的生成路径和文件名,然后点创建按钮
CyConsole录制脚本,具体见文档原文
CyControlCenter也可以生成脚本和录制脚本
6.3.2 使用Cyload驱动包自动下载固件
Play脚本的过程(自动下载固件)可以用inf文件自动化,生成可自动下载固件的驱动包过程如下(自己总结的):
首先要有相应的固件hex(如slavefifo,自己开发),固件中包含自己定义的VID/PID,用上面的工具生成脚本spt文件
然后拷贝CyLoad.inf到一起,修改拷贝过来的inf文件中的VID/PID为默认的VID/PID(也就是默认的04B4,8613)
再拷贝cyusb.sys到一起,就组一个完整的没有认证的驱动
CyLoad.inf文件:包含了CyLoad.spt和CyLoad.cat和cyusb.sys文件的细节和入口。驱动文件和脚本文件的相应的目标目录也被提到。inf文件会使用这些自动固件加载过程
其重要参数有:
[SourceDisksFiles]包含了下载固件必要的文件——sys和spt文件
[DestinationDirs]指定了拷贝CYUSB.sys和CyLoad.spt的系统文件夹,system32\Drivers和system32\CyLoad
[CyLoadFW.Files]固件文件,实际是CyLoad.spt
[CYUSB.Files.Ext]外部文件,实际是CYUSB.sys
对于官方提供的演示脚本,其VID/PID=0x04B4/0x0084,与那个iic文件对应,windows触发脚本执行的语句是
HKR, DriverEXECSCRIPT,,%CyLoad.EXECSCRIPT
删除USB驱动的方法:
(a)打开Regedit, 找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USB 文件夹,删除所有VID、PID相符的项(如"Vid_04b4&Pid_8613")——貌似删不了
(b)在windows/inf 文件下,找到oemxx.inf 文件 (xx 是两位数字),该文件包含相同的pid、vid。可以使用UltraEdit 进行全文搜索关键字来定位具体的文件,找到后在文件名后面加.bak。
———————————————————————————————————————————————————————
NI-VISA入门文档:NI-Tutorial-4478-en.pdf(可参照NI-Tutorial-4478-zhs.pdf作为翻译对比,但英文的较新)
是否应该使用NI-VISA作为USB的驱动(供Labview调用)
优缺点分析:
NI-VISA:使用简单,通用性较好,某些设备专属的功能可能无法实现
调用DLL(API)编程:编程麻烦,每个设备API不同,可实现设备专属功能
NI-VISA生成的inf文件:
INF文件的安装对 于每个版本的 Windows而言 都是不同的。
使用NI-VISA与您的USB设备进行通信:
USB INSTR类别(USBTMC)符合USB测试和测量类别(USBTMC)的设备使用NI-VISA USB INSTR类别。这些设备使用488.2格式通信。
对于这些设备而言,您简单地使用VISA打开、VISA关闭、VISA读取和VISA写函数,与使用GPIB仪器通信相似的方式进行。
对于USB RAW设备,控制起来相对复杂些:
NI-VISA supports three types of USB pipes: control控制, bulk批量, and interrupt中断.
When NI-VISA detects your USB instrument, it automatically scans your instrument for the lowest available最低可能的 endpoint端点 for each type.
When VISA detects the lowest available endpoint, it assigns that value to the appropriate VISA attribute对应的VISA属性.
The bulk in endpoint and bulk out endpoint are stored in the VI_ATTR_USB_BULK_IN_PIPE attribute and the VI_ATTR_USB_BULK_OUT_PIPE attribute, respectively.
A value of -1 indicates that a USB device does not support that type of pipe.
If you are using the C API, use the viSetAttribute function to change endpoints. In LabVIEW, use a Write VISA Property node.
上面这句话是说,用C语言开发的程序也可以调用VISA驱动,此处说明了C语言开发的与LabVIEW开发的程序的区别
NI-VISA includes four functions to transfer data through USB pipes.
Before you can communicate with your device using these functions, you need to set up the communication protocol using the VISA USB attributes.
The following list describes the available functions:
Use VISA USB Control In and VISA USB Control Out to transfer data using the control pipe.
To transfer data using a bulk pipe, use VISA Read and VISA Write.
If you are using LabVIEW, VISA includes an additional function to use the interrupt pipe: VISA Get USB Interrupt Data.
In the C API, you can do this by accessing the VI_ATTR_USB_RECV_INTR_SIZE and VI_ATTR_USB_RECV_INTR_DATA attributes of the VI_EVENT_USB_INTR event object.
See the for more information about VISA Events. NI-VISA Help
重要例程:
USB RAW Bulk Communication with LabVIEW