那 么 在 安 装 EZ-USB_devtools_version_261700.exe 时会提示安装一个有限制版本的 Keil C51,这个 Keil C51 程序将限制你编译出来的文件最大 4K 字节。 2.然后确定安装了 EZ-USB_devtools_version_261700.exe。安装之后,在安装目录下你会看 到 Cypress\USB\Target\Fw\Fx2 目录,这个目录下的文件就是 Cypress 提供的固件框架程序。 如果你用过 VC 的向导生成过 MFC 的应用程序的话,这个框架有点类似于 MFC 的框架, 标准的 USB 通讯命令的响应,以及对重枚举的处理,程序的流程以及中断的声明已经搭好 了, 剩下的就是你在这个流程中合适的地方加入你自己的代码, 根据你的设备属性修改配置 信息等就行了。关于框架的详细说明请见另一节“FX2 框架程序详细注释” 。 二.建立 Keil uVision2 工程 安装了必备的工具后,我们就可以建立和编译我们的工程了! 1. 我们在 D 盘下建立 一个 USB_PROJECT 目录, 然后建立一个 SRC 子 目录,将 Cypress\USB\Target\Fw\Fx2 目录下的所有.C 和.A51 文件拷贝到 D:\USB_PROJECT\SRC 目录下。 (也就是将 dscr.a51, fw.c, periph.c 考过来) 。 2. 启动 Keil uVision2 程序。选择 Project〉 〉New Project…出现如图一所示的对话框: 图一:创建一个新工程 fw.uv2 注意,我们将我们的工程保存到 d:\usb_project 目录下,这样工程的结构比较清晰。点击保 存之后,出现入图二所示的对话框,提示我们选择目标板上我们使用的 CPU,这里我们选 1 择 Cpress Semiconductor 数下的 EZ-USB FX2(CY7C68XXX)即可。 图二:选择 CPU 然后我们会看到入图三所示的提示,提示我们是否将标准的 8051 启动代码拷贝到工程目录 并将代码文件加入工程: 图三:提示是否将 startup.a51 加入工程中 实际上就是问你是否加入 STARTUP.A51 文件到你的工程中,这个文件是一段汇编代码,会 在程序复位之后首先执行,进行堆栈及内存的初始化等工作,然后将程序指针跳转到你的 main 函数处执行你的代码。如果你不想修改这段初始化程序,你就不用加了。这里我们选 择“否” 。这样在程序复位之后,在你的 main 函数执行之前,会执行默认的启动代码。
通常来说USB设备(这里只分析USB设备,而不针对USB HOST,USB OTG和USBHUB)内部都有一片USB的芯片和一个MCU,有些当然有些厂商提供的USB芯片已经集成了MCU在里边,如Cypress的CY68013就是这样的。这里考虑MCU和USB芯片分开的情况吧,集成的也类似,大家可以自己去分析。USB芯片完成USB底层的事物,接收的时候:将接收到的USB串行数据识别出来,解包后存放在内部的缓存中,然后通过中断的方式告知MCU收到数据包了,MCU通过和USB芯片的并行或串行接口读回接收到的数据并进行相应的分析和处理;发送数据的时候,MCU将需要发送的数据通过和USB芯片的接口写入到USB芯片内部的缓存,写入完成后,一般来说USB芯片会在接收到来自HOST的IN令牌包时,将缓存中的数据送到USB总线上去。当发送完成后,通常USB芯片也可以通过中断的方式告知MCU。从这里看出,USB芯片只是完成数据的解包和打包,并不对数据进行任何分析和处理,数据包的分析和处理都是由MCU完成的。具体来说是由运行在MCU中的程序,也就是通常所说的USB
Firmware或者说USB固件程序完成的。首先来分析一次简单的从HOST到Device的数据传输,即OUT型的传输,假设传输类型为BULK。USB传输只能由HOST发起,HOST需要向Device发送一个OUT令牌包。在这个包里指定了接受数据的设备地址、端点。然后将数据包发送到USB总线上。不是目的接收器件的USB设备不会响应该数据包,目的接收设备如果能接收该数据包,则以ACK握手包响应,如果不能接收该数据包,则以
NAK握手包响应。在上述过程中,USB芯片会在接收完数据包后中断MCU,然后MCU读取缓存在USB芯片中的数据包,再决定回复ACK,或者是NAK。以上只是一次简单的BULK OUT传输,对于BULK
IN传输,HOST先发送一个IN的令牌包,USB芯片接收到该令牌包后会中断MCU,MCU如果有数据发回HOST,则将数据写入USB芯片内对应断点的缓存,然后USB芯片会自动将数据发送至USB总线。并等待接收来自HOST的握手包。对于BLUK、Interrupt以及同步传输,传输过程都类似,整个传输过程由令牌包、数据包以及握手包组成。对于控制传输,一次传输由三个阶段组成,即Setup阶段、可选的数据阶段以及状态阶段。其中Setup阶段为一次OUT型的传输,HOST将8个字节的SETUP数据包发送给设备。这8个字节指定了这次控制传输的请求类型。Device会根据这8个字节做出相应的Action。第二个阶段为数据阶段,有些控制传输没有这个阶段,如Set Address请求。数据阶段,HOST将数据通过OUT型传输发送给Device,或者通过IN型传输向Device请求数据。第三个阶段为状态阶段,即得到这次控制传输的状态,确认这次传输是否正常完成。HOST或者Device以一个长度为0的空数据包表示肯定的应答。USB Firmware中大部分程序都在处理控制传输,具体来说是11种标准请求以及针对具体设备的类请求,如Mass
Storage 类的请求,还有些厂商自定义的请求。USB
Firmware的设计和调试首先应从一次基本的传输开始。要能正常的完成一次传输,尤其是控制传输,否则连设备的枚举都不能完成,也就是说设备不能被计算机正确识别。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)