毕业设计论文基于单片机MSP430F449的USB接口数据传输系统设计.doc
1 绪 论1.1 USB概述1.1.1 USB的起源和发展历史USB是英文Universal Serial Bus的缩写,中文含义是"通用串行总线"。它是一种应用在PC领域的新型接口技术上面提到的外设接口没有统一的标准,USB就将这些接口统一起来,使用一个4针插头作为标准插头。通过这个插头,采用菊花链形式可以把所有的外设连接起来,并且不会损失带宽。USB0.9是由7家主要电脑、电子科技厂商,包括了 Compaq、Digital、IBM、Intel、微软、NEC以及北方电讯(加拿大)在1995年11月研发出来的。1998年后,随着微软在Windows 98中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB接口才逐步走进了实用阶段。这几年,随着大量支持USB的个人电脑的普及,USB成为PC的标准接口已是大势所趋。在主机(host)端,最新推出的PC机几乎100%支持USB;而在外设(device)端,使用USB接口的设备也与日俱增,例如数码相机、扫描仪、游戏杆、磁带和软驱、图像设备、打印机、键盘、鼠标等等。1.1.2 USB的特点USB之所以有着巨大的魅力主要是由于它的许多其他总线无法比拟的优点。这里主要就目前国内应用的USB1.1技术做一些研究和应用。USB的规范能针对不同的性能价格比要求提供不同的选择,以满足不同的系统和部件及相应不同的功能,其主要优点可归结为以下几点:A速度快。 B设备安装和配置容易。 C易于扩展。D能够采用总线供电。 E使用灵活。 F价廉物美。1.1.3 目前USB的应用由于USB设备的诸多优点,自97年,微软推出WIN9597后,USB进入实战阶段,但由于这个版本对USB的支持属于外挂式模块,因此直到Windows98推出后,USB接口的支持模块才真正日趋成熟。随着计算机技术的迅速发展,对外部总线速度的要求越来越高。在许多便携式电脑上,已经找不到RS-232接口。迄今为止,常用的USB总线标准有1998年发布的USB1.1版本和2000年发布的USB2.0版本。其中1.1版本支持两种传输速率:1.5Mbps和12Mbps,主要应用在低速传输要求的场合;而2.0版本面向高数据率传输的场合,支持480Mbps的传输速度,并向下完全兼容USB1.1协议。1.2 USB在嵌入式系统上的应用前景USB在嵌入式系统中的应用发展迅速。现在,计算机外围设备的市场上使用USB接口的数码相机,扫描仪,硬盘,鼠标等家庭设备比较常见,但是使用USB接口的智能仪器还没有见到。由于USB的诸多优点,在传输距离不是问题的前提下,我们可以设计出许多具有市场前途的智能仪器。1.3 USB系统组成一个USB系统主要被定义为三个部分:USB的互连,USB的设备,USB的主机。1.3.1 USB的互连USB的互连是指USB设备与主机之间进行连接和通信的操作,主要包括以下几方面: ·总线的拓扑结构:USB设备与主机之间的各种连接方式; ·内部层次关系:根据性能叠置,USB的任务被分配到系统的每一个层次; ·数据流模式:描述了数据在系统中通过USB从产生方到使用方的流动方式; ·USB的调度:USB提供了一个共享的连接。对可以使用的连接进行了调度以支持同步数据传输,并且避免的优先级判别的开销。 总线拓朴结构包括四个重要的组成部分。1 主机和设备:USB系统的基础组成部分。2 物理拓朴结构:描述USB系统中的各组成部分是如何连接起来的。3 逻辑拓朴结构:描述USB系统中各种组成部分的地位和作用,以及描述从主机和设备的角度观察到的USB系统。4 客户软件层与应用层的关系:描述从客户软件层看到的应用层的情况,以及从应用层看到的客户软件层的情况。1.3.2 USB的主机图1.1展示了USB通信模型之间基本的信息流与互连关系。客户USB系统主机控制器功能部件USB设备USB总线接口 图1.1 通信模型层次关系图实际的信息流逻辑的信息流由图可见,主机与设备都被划分成不同的层次。主机上垂直的箭头是实际的信息流。设备上对应的接口是基于不同实现的。在主机与设备之间的所有通信最终都是通过USB的电缆进行,然而,在上层的水平层之间存在逻辑的主机设备信息流。主机上的客户软件和设备功能部件之间的通信是基于实际的应用需求及设备所能提供的能力。客户软件与功能部件之间的透明通信的要求,决定主机和设备下层部件的功能以及它们的界面(interface)。1.3.3 USB设备架构USB设备可被划分三层: 底层是传送和接收数据包的总线接口; 中间层处理总线接口与不同端点之间的数据路由,端节点是数据的终结提供处或使用处,它可被看作数据源或数据接收端(Sink); 最上层的功能由串行总线设备提供,比如鼠标,或ISDN接口。2 基于MSP430单片机的USB接口数据传输系统硬件设计本设计的硬件系统实现了信号的采集、转换,并将所得的数字信号进行传输,并通过大量中断来实现系统的低功耗。本设计的硬件系统是以超低功耗16位单片机MSP430F449为核心的数据传输系统。整个系统可分为:信号A/D转换系统、单片机系统、复位电路设计、电源设计及USB控制器系统。原理图如图2.1所示。 电源电路MSP430F449C P US Y S T E M信号的采 集U S B复位电路图2.1 系统结构图2.1 单片机的选择单片机以其超小型化、高可靠性和高性价比的特点,广泛应用于各个领域。使传统的电子技术产生了一场巨变。经过多年的发展,单片机品种不断增多,功能不断增强,应用范围不断扩大,相应的开发技术也有了很大发展。随着移动通信、网络技术、多媒体技术等高科技产品应用的日益广泛,16位、32位单片机也都得到了长足的发展。就目前而言,嵌入式应用硬件设计采用满足要求的单片机是理想的选择,采用CPU+PLD+AD/DA模式是明智的选择。现在新型的单片机内部已经集成了越来越多的部件,这些部件包括一般常用的电路,例如:定时器,比较器,A/D转换器,D/A转换器,串行通信接口,WATCHDOG电路,LCD控制器等。有的单片机为了构成控制网络或形成局域网,内部含有局域网络控制模块CAN。现在内置FLASH的芯片也有带JTAG或类似接口的产品,支持在线程序下载,只需简单的下载开发工具,大大方便了程序的开发和现场的修改。课题中所使用的单片机是美国德州仪器公司在2000年开发的MSP430F449。该单片机在设计上打破常规采用了全新观念。其突出优点是低电源电压、超低功耗、多种功能。由于其功能远远超过其他系列的单片机,又称其为混合型单片机。MSP430F449中的各个模块都是完全独立运行的,每个模块都可以在主CPU休眠状态下运行,当需要主CPU工作时任何一个模块都可以通过中断唤醒CPU从而使系统以最低功耗运行。这一点是这一款单片机最突出的优点,也是与其他单片机最大的区别。而且,MSP430F449还内置了液晶驱动模块,更加简化了外围电路的软件。图2.2 MSP430F449管脚示意图MSP430F449管脚示意图如图2.2所示。主要管脚功能如下:1 外接晶体引脚XT2IN和XT2OUTXT2IN 接外部晶体的一个引脚。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。XT2OUT 接外部晶体的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端。2 端口P0,P1和P2P0,P1和P2这3个8位端口都能用做输入和输出,同时都有中断能力,每个信号都可作为一个中断源。P0口有6个寄存器用于引脚控制,P1口和P2口有7个寄存器用于引脚控制。这些模块寄存器位于地段地址,须用字节指令以绝对寻址模式访问。3 端口P3,P4,P5,和P6这些端口没有中断能力,其余功能与P1和P2一样,能实现输入/输出功能和外围模块功能。每个端口有4个寄存器供用户使用。用户可通过这4个寄存器对它们进行访问和控制。4 电源引脚DVcc和DVss 为数字电源正端和负端;AVcc和AVss为模拟电源正端和负端。2.2 USB器件的选择2.2.1 概 述USB控制器一般有两种类型:一种是MCU集成在芯片里面的,如 Intel的8X930AX、CYPRESS的EZ-USB、SIEMENS的C541U以及 MOTOLORA、National Semiconductors等公司的产品;另一种就是纯粹的USB接口芯片,仅处理 USB通信,如PHILIPS的PDIUSBD11(I2C接口)、 PDIUSBP11A、PDIUSBD12(并行接口),National Semiconductor的USBN9602、USBN9603、USBN9604等。前一种由于开发时需要单独的开发系统,因此开发成本较高;而后一种只是一个芯片与MCU接口实现USB通信功能,因此成本较低,而且可靠性高。本课题选择的是PHILIPS公司的PDIUSBD12器件。2.2.2 PDIUSBD12芯片特点和内部结构PDIUSBD12是一个性能优化的USB器件,通常用于基于微控制器的系统并与微控制器通过高速通用并行接口进行通信,也支持本地DMA传输。该器件采用模块化的方法实现一个 USB接口,允许在众多可用的微控制器中选择最合适的作为系统微控制器,允许使用现存的体系结构并使固件投资减到最小。这种灵活性减少了开发时间、风险和成本,是开发低成本且高效的USB外围设备解决方案的一种最快途径。 PDIUSBD12完全符合USB1.1规范,也能适应大多数设备类规范的设计,如成像类、大容量存储类、通信类、打印类和人工输入设备等,因此,PDIUSBD12 非常适合做很多外围设备,如打印机、扫描仪、外部大容量存储器( Zip驱动器)和数码相机等。现在用SCSI实现的很多设备如果用 USB来实现可以直接降低成本。 PDIUSBD12挂起时的低功耗以及LazyClock输出符合ACPI 、OnNOW和USB电源管理设备的要求。低功耗工作允许实现总线供电的外围设备。PDIUSBD12还集成了像SoftConnect、GoodLink、可编程时钟输出、低频晶振和终端电阻等特性。所有这些特性都能在系统实现时节省成本,同时在外围设备上很容易实现更高级的 USB功能。 PDIUSBD12的内部结构框图如图2.3所示。 图2.3 PDIUSBD12的内部结构框图 模拟收发器。集成的收发器直接通过终端电阻与USB电缆接口。 电压校准器。片上集成的1个3.3 V电压校准器为模拟收发器供电,也提供连接到外部1.5 k上拉电阻的输出电压。 PLL。片上集成1个648 MHz的倍频PLL(锁相环),允许使用6 MHz的晶振,EMI也由于使用低频晶振而减小。PLL的工作不需要外部器件。 位时钟恢复。位时钟恢复电路用4倍过采样原理从输入的USB 数据流中恢复时钟,能跟踪USB规范中指出的信号抖动和频率漂移。 PHILIPS串行接口引擎SIE。PHILIPS的SIE完全实现USB协议层。考虑到速度,它是全硬件的,不需要固件(微程序)介入。这个模块的功能包括:同步模式识别、并 /串转换、位填充/不填充、CRC校验、PID确认、地址识别以及握手鉴定。 SoftConnect。高速设备与USB的连接是靠把D通过1个1.5 k的上拉电阻接到高电平来建立的。在PDIUSBD12中,这个上拉电阻是集成在芯片内的,缺省是没有连接到VDD,这个连接是靠外部 MCU发一个命令来建立的。这使得系统微处理器可以在决定建立 USB连接之前完成初始化。重新初始化USB总线连接也可以不用拔掉电缆来完成。 GoodLink。GoodLink是靠一个引脚接发光二极管实现的。在 USB设备枚举时LED指示灯将立即闪亮;当PDIUSBD12被成功枚举并配置时, LED指示灯将会始终亮;经过PDIUSBD12的USB数据传输过程中, LED将一闪一闪,传输成功后LED熄灭;在挂起期间,LED熄灭。这种特性可以使我们知道 PDIUSBD12的状态,方便电路调试。 存储器管理单元MMU和集成RAM。MMU和集成RAM能缓冲USB(工作在 12Mb/s)数据传输和微控制器之间并行接口之间的速度差异,这允许微控制器以自己的速度读写USB包。 并行和DMA接口。并行接口容易使用、速度快并且能直接与主微控制器接口。对于微控制器,PDIUSBD12可以看成是一个有8位数据总线和1位地址线的存储设备。 PDIUSBD12支持多路复用和非多路复用的地址和数据总线。在主端点(端点 2)和局部共享存储器之间也可使用DMA(直接存储器存取)传输。它支持单周期模式和块传送模式 两种DMA传输。2.3 单片机外围电路2.3.1 晶振电路单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XT2IN和XT2OUT分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体或陶瓷谐振器一起构成一个自激振荡器。本设计系统中的晶振电路如图2.4所示:图2.4 本设计系统中的晶振电路2.3.2 复位电路设计无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞” 等现象,这主要是单片机的复位电路设计不可靠引起的。目前为止,单片机复位电路主要有四种类型:(1)微分型复位电路;(2)积分型复位电路;(3)比较器型复位电路;(4)看门狗型复位电路。1 微分型复位电路微分型复位电路的等效电路如图2.5所示。 图2.5 微分型复位电路2 积分型复位电路积分型复位电路常常在二次电源开关相对较短的时间间隔情况下出现异常。这主要是由于放电回路与充电回路相同,导致放电时间常数较大,从而导致UC电压下降过度。如图2.6所示 图2.6 积分型复位电路3 比较器型复位电路比较器型复位电路的基本原理是:上电复位时,由于组成了一个RC低通网络,所以比较器的正相输入端的电压比负相端输入电压延迟一定时间。而比较器的负相端网络的时间常数远远小于正相端RC网络的时间常数,因此在正端电压还没有超过负端电压时,比较器输出低电平,经反相器后产生高电平。复位脉冲的宽度主要取决于正常电压上升的速度。4 看门狗型复位电路看门狗型复位电路主要利用CPU正常工作时,定时复位计数器,使得计数器的值不超过某一值;当CPU不能正常工作时,由于计数器不能被复位,因此其计数会超过某一值,从而产生复位脉冲,使得CPU恢复正常工作状态。典型应用的Watchdog复位电路的可靠性主要取决于软件设计,即将定时向复位电路发出脉冲的程序放在何处。一般设计,将此段程序放在定时器中断服务子程序中。本系统中所采用的复位电路在本设计的系统中,由于电路较为简化,系统性能应该较为稳定,所以采用微分型的复位电路,它的电路如图2.7所示。 图2.7 本系统中的复位电路2.3.3 电源的设计由于系统的设计实现了超低功耗,用纽扣电池供电是非常适合的。节省了器件的空间,减轻了重量,大大提高了实用性,携带非常方便。在电源的正负极之间并联了一个电容,以增强系统性能的稳定性和可靠性。2.4 A/D转换器的选择单片机控制系统通常要用到A/D转换。根据输出的信号格式,比较常用的A/D转换方式可分为并行A/D和串行A/D。并行方式一般在转换后可直接接收,但芯片的引脚比较多;串行方式所用芯片引脚少,封装小,在PCB板上占用的空间也小,但需要软件处理才能得到所需要的数据。2.4.1 TLC0834串行A/D转换器简介串行A/D转换器是公司生产的位逐次逼近模数转换器具有输入可配置的多通道多路器和串形输入输出方式。其多路器可由软件配置为单端或差分输入,也可以配置为伪差分输入。另外,其输入基准电压大小可以调整。在全位分辨率下,它允许任意小的模拟电压编码间隔。由于TLC0834转换器采用的是串行输入结构,因此封装体积小,可节省单片机I/O资源,价格也较适中。2.4.2 TLC0834串行A/D转换器工作特点TLC0834转换器可通过和控制处理器相连的串行数据链路来传送控制命令,因而可用软件对通道进行选择和输入端进行配置。输入配置可在多路器寻址时序中进行。多路器地址可通过DI端移入转换器。多路器地址选择模拟输入通道可决定输入是单端输入还是差分输入。当输入是差分时,应分配输入通道的极性,并应将差分输入分配到相邻的输入通道对中。例如通道0和通道1可被选为一对差分输入。另外,在选择差分输入方式时,极性也可以选择。一对输入通道的两个输入端的任何一个都可以作为正极或负极。通常TLC0834转换器在输出以最高位(MSB)开头的数据流后,会以最低位(LSB)开头重输出一遍(前面的数据流)。其工作时序如图2.8所示。图2.8 TLC0834时序图2.4.3 TLC0834串行A/D转换器引脚功能TLC0834转换器的引脚排列如图2.9所示,其中CH0CH3为模拟输入端;CS 为片选端;DI为串行数据输入,该端仅在多路器寻址时(MUX Settling Time)才被检测;D0为A/D转换结果的三态串行输出端;CLK为时钟;SARS为转换状态输出端,该端为高电平时,表示转换正在进行,为低电平则表示转换完成;REF为参考电压输入端;Vcc为电源;DGTL GND为数字地,ANGL GND为模拟地。图2.9 TLC0834引脚图2.5 A/D转换器与单片机的接口电路设计TLC0834与MSP430单片机的硬件接口电路的电路原理如图2.10所示。图中,单片机的P6.7接TLC0834的片选信号,P6.6用于产生A/D转换的时钟, P6.5为一个双向I/O口位,可用于对模拟输入进行配置及输出转换所得的数据。在这里,模拟信号以单端方式输入,参考电压为5V,即A/D模拟量的输入范围为05V。P6.5P6.6P6.7图2.10 TLC0834与MSP430单片机的硬件电路图2.6 PDIUSBD12与MSP430单片机的连接2.6.1 PDIUSBD12引脚说明PDIUSBD12引脚图如图2.11所示,引脚说明如表2.1所列。图2.11 PDIUSBD12 引脚图表2.1 PDIUSBD12引脚说明2.6.2 PDIUSBD12与MSP430单片机的连接图2.12所示的是采用了MSP430系列微控制器与PDIUSBD12集成电路相互连接的原理图。图2.12 PDIUSBD12与MSP430单片机的原理图由于MSP430系列单片机是近些年以来,应用比较广泛的一种单片机微控制器,软件开发工作者在其基础上开发大量的软件开发平台,大多数电子工程师对其都比较熟悉的原因。因此,可以利用比较熟悉的微处理器(MSP430)进行核心程序的设计,即用MSP430来实现其所需的功能,具体将数据信号转换为符合USB规则的信号,则完全由PDIUSBD12来完成。这样以来,既可以利用单片机中丰富的软件资源,又可以利用USB总线技术的即插即用、热插拔等特性,可以使开发设备的成本降低、缩短开发产品的时间周期。在这样的连接中,ALE始终接低电平,说明采用单独地址和数据总线配置。D0脚接MSP430单片机的P1.0 I/O引脚,控制是命令还是数据输入到PDIUSBD12的数据总线相连接,CLKOUT时钟输出为MSP430提供时钟输入。2.7 本设计系统的原理图及制版图的绘制Protel99SE能实现从电学概念设计到输出物理生产数据,以及这之间的所有分析、验证和设计数据管理。因而今天的Protel已不是单纯的PCB(印制电路板)设计工具,而是一个系统工具,覆盖了以PCB为核心的整个物理设计。Protel99SE共分5个模块,分别是原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。图2.13为本设计的Protel原理图。做PCB板就是把设计好的原理图变成一块实实在在的PCB电路板,请别小看这一过程,有很多原理上行得通的东西在工程中却难以实现,或是别人能实现的东西另一些人却实现不了,因此说做一块PCB板不难,但要做好一块PCB板却不是一件容易的事情。 同样的原理设计,同样的元器件,不同的人制作出来的PCB就具有不同的结果,那么如何才能做出一块好的PCB板呢?结合毕业设计的经验,想就以下几方面谈谈自己的想法:1.要明确设计目标接受到一个设计任务,首先要明确其设计目标,如果是普通的PCB板,只要做到布局布线合理整齐,机械尺寸准确无误即可,如有中负载线和长线,就要采用一定的手段进行处理。图2.13 基于MSP430F449的USB接口数据传输系统原理图2.还要考虑其他一些相关因素,如板子层数,采用元器件的封装外形,板子的机械强度等。在做PCB板子前,要做到对该设计的设计目标心中有数。3.元器件布局的考虑 元器件的布局首先要考虑的一个因素就是电性能,把连线关系密切的元器件尽量放在一起,尤其对一些高速线,布局时就要使它尽可能地短,功率信号和小信号器件要分开。在满足电路性能的前提下,还要考虑元器件摆放整齐、美观,便于测试,板子的机械尺寸,插座的位置等也需认真考虑。制版图如下图2.14所示:图2.14 基于MSP430F449的USB接口数据传输系统制版图3 基于MSP430单片机的USB接口数据传输系统软件设计3.1 单片机软件开发单片机生产厂家不断增多,单片机品种层出不穷。单片机广泛选择是当今产品开发的一个重要环节。每个单片机系列的指令系统不同,与指令系统对应的汇编助记符就不同。汇编语言的不兼容性使得一种单片机上编制的程序,在另一种单片机上不能运行,单片机重新选型后程序必须重新编制。汇编语言的难记、难读及容易搞混,即使自己编制的程序过一段时间修改时,往往要重读很大部分,经过长时间回忆才能找到问题所在。修改别人的汇编程序,若程序的注释说明不详细、程序的思路不清晰、子程序使用不够多,此时还不如自己重新编制。用C语言编程是单片机软件开发的必然趋势。C语言是一种编译型程序设计语言,她兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、可移植性好,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,支持当前程序设计中广泛采用的自顶向下结构化程序设计技术。采用C语言编译器可以自动完成变量存储单元的分配,编程者专注于应用软件部分的设计即可,大大加快了软件的开发速度。采用C语言可以很容易进入单片机程序的移植工作,有利于产品中单片机的重新选型。C语言的可读性,可以轻松的借鉴前人的开发经验,提高自己的软件设计水平。对于C语言生成代码的时空效率,程序代码长度增加20%,程序执行速度约减慢20%。这在片内程序存储器不断扩大、晶振频率不断提高的今天,已不是主要考虑的问题。在非常注重代码效率的场合,可以是以C语言为主,汇编语言为辅。在可移植性方面,单片机C语言都符合ANSIC标准,差别主要是片内资源的不同配置及使用,这可以通过采用不同的头文件,经过少量的加工就可以实现。随着国内单片机开发工具研制水平的提高,现在的单片仿真器普遍支持C语言程序调试,为单片机编程使用C语言提供了便利的条件。3.2 单片机固件结构及功能3.2.1 固件结构PDIUSBD12是一款带有并行总线和局部DMA传输能力的高速USB接口器件, 固件设计的日标就是使PDIUSBD12在USB上达到最大的传输速率。PDIUSBD12的固件设计成完全的中断驱动。当CPU处理前台任务时,USB的传输可在后台进行。这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。后台ISR中断服务程序和前台主程序循环之间的数据交换,通过事件标志和数据缓冲区来实现,例如PDIUSBD12的批量输出端点,可使用循环的数据缓冲区,当PDIUSBD12从USB收到一个数据包,那么就对CPU产生一个中断请求,CPU立即响应中断。在ISR中固件将数据包从PDIUSBD12内部缓冲区移到循环数据缓冲区,并在随后清零PDIUSBD12的内部缓冲区,以使能接收新的数据包,CPU可以继续它当前的前台任务,直到完成。例如,打印当前页,然后返回到主循环,检查循环缓冲区内是否有新的数据并开始其它的前台任务。由于这种结构主循环不关心数据是来自USB,串口还是并口,它只检查循环缓冲区内需要处理的新数据,这个概念很重要,这样主循环程序专注于数据的处理,而ISR能够以最大可能的速度进行数据的传输,相似的控制端点在数据包处理时采用了同样的概念,ISR接收和保存数据缓冲区中的控制传输并设置相应的标志寄存器,主循环向协议处理程序发出请求,由于所有的标准器件级别和厂商请求都是在协议处理程序中进行处理,ISR得以保持它的效率,而且一旦增加新的请求只需要在协议层进行修改。固件结构和数据流向如图3.1所示。图3.1 固件结构和数据流向各模块程序的分工如下:PDIUSBD12命令接口:对PDIUSBDI2器件进行操作的模块子程序集。中断服务程序:当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并设定事件标志“EPPFLAGS” 和Setup包数据缓冲区“CONTROL_ XFER” 传输给主循环程序.标准设备请求处理程序:对USB的标准设备请求进行处理.厂商请求处理程序:对用户添加的厂商请求进行处理主循环程序:发送USB请求,处理USB总线事件用户功能处理等3.2.2 固件功能固件实现的功能主要有:(1)设备枚举:这是固件的一个非常重要的任务,它使主机和设备建立通信关系并使主机为设备加载正确的驱动程序。(2)数据传输:开发板和主机可以进行双向数据传输。其中最关键的是设备向主机传输数据的功能,目前开发板可以达到400KB/S的传输速度。(3)状态监控:开发板的状态监控采用控制传输,具备双向状态数据传输功能。主机可以方便地了解并控制设备的运行状态,这一点对于调试非常关键。(4) LED灯控制:目前有三种状态:暗、亮和闪烁。用于直观显示开发板运行状态,主机通过控制传输对LED进行控制。3.2.3 主循环流程图MCU 一旦上电就需要初始化其所有端口、存储区、定时器和中断服务程序。之后MCU将重新连接USB,包括将Soft Connect寄存器设置为ON。这些过程是很重要的,因为它确保了在MCU准备好服务D12之前D12不会进行操作。在主循环程序中,MCU对键盘进行轮询。如果任何一个特定的按键被按下,键处理命令将执行子程序并返回主循环。当轮询到了检测建立包时,它确认建立标志在之前是否被中断服务程序所置位。如果建立标志置位,它将向协议层发送一个器件请求进行处理。图3.2所示的是主程序在前台执行的流程:图3.2 主循环程序流程图3.3 单片机驱动程序设计USB的传输总是从PC开始的,传输有四种不同的通信类型:控制传输、中断传输、块传输和等时传输。单片机系统使用的是控制传输和块传输。控制传输由USB系统和客户用于发送接收相对少量的数据。块传输用于在两个方向传输大量数据。我们主要针对块传输编写驱动程序。该程序通过一个或多个管道访问一个功能设备。管道是主机和设备之间单向或双向的数据传输通道,同样的管道也有四种类型。控制管道是双向的,中断管道是单向到主机的,块管道和等时管道是单向的,沿任一个方向。缺省管道用于控制传输。图3.3是设备和USBDI表现给客户驱动程序的逻辑实体。一个设备显露一系列的管道连接点,称为节点。多个节点组合在一起构成一个接口。一个或多个接口组合成一个配置。一个设备通常只含有一个配置和一个接口,但是,也可以含有多个配置和接口。USB客户是使用标准Windows系统USB类驱动程序访问设备的驱动程序的。USBD.sys是USB类驱动程序,它使用UHCD.sys访问通用主机控制器接口设备。,或者使用OpenHCI.sys访问开放式主机控制器接口设备。USBHUB.sys是根集线器和外部集线器的USB驱动程序。在PCI枚举器发现每个USB主机控制器时,装入相关的驱动程序。事实上,系统USB驱动程序(USBD)处理连接USB设备的大多繁杂的工作,甚至一些HID USB设备(如键盘、鼠标和游戏设备)是自动识别的,不许要额外的驱动程序。但是单片机系统要响应用户的请求,因此驱动程序是不可缺少的。设备配置1接口0其他接口其他配置节点0(管道0)节点1(管道1)接口 1 节点图3.3 USB逻辑结构3.3.1 头文件说明开发USB设备的驱动程序需要包含几个头文件,他们在Windows 中的DDK中,需要安装DDK。这几个头文件及功能描述如下:usb100.h各种USB常量和结构。usbioctl.hIOCTL定义。usbdlib.hURB构造和各种例程。usbdi.hUSBDI例程,包括URB结构。在SOURCES文件中还要特别提到USB库:TARGETLIBS=D:WIN98DDKLIB386FREEusbd.lib,安装路径。3.3.2 USBDI的IOCTLUSB类驱动程序主要通过USB驱动程序接口(USBDI)的内部IOCTL使用。因为他们是内部IOCTL,所以只能可用于内核的其他部分,但不能用于用户态应用程序。最重要的内部IOCTL是IOCTL_INTERNAL_USB_SUBMIT_URB,它发出USB请求块(URB)由USB类驱动程序处理。有30多个不同的URB功能代码。USB客户使用URB做它们大多数的工作。URB结构是一个联合,含有16个不同的_URB_*结构。3.3.3 创建设备创建设备函数带两个参数调用,一个参数是指向驱动程序对象的指针,另一个参数是指向物理设备对象的指针。NTSTATUS Eval_Create( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )NTSTATUS ntStatus;Irp->IoStatus.Status = STATUS_SUCCESS;Irp->IoStatus.Information = 0;IoCompleteRequest( Irp, IO_NO_INCREMENT ); ntStatus = Irp->IoStatus.Status;return ntStatus;3.3.4 关闭设备NTSTATUS Eval_Close( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )return STATUS_SUCCESS;3.3.5 读取设备数据当客户应用程序有读取设备数据的要求时,系统将此要求以IRP_MJ_READ的IRP形式传递给功能驱动程序,并以下代码执行,然后再由以下代码指定USB总线驱动程序直接与单片机系统实现信息交互。NTSTATUS Eval_Read(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)USBD_INTERFACE_INFORMATION* pInterfaceInfo;USBD_PIPE_INFORMATION* pPipeInfo;PIO_STACK_LOCATION irpStack;PDEVICE_EXTENSION deviceExtension;NTSTATUS ntStatus;ULONG PipeNum;ULONG ReadLen;ULONG siz;PURB urb;ULONG transferFlags = 0;CHAR* ioBuffer;irpStack = IoGetCurrentIrpStackLocation( Irp );/得到当前IRP的StaackLocation部分。deviceExtension = DeviceObject->DeviceExtension;/得到当前设备。ReadLen = irpStack->Parameters.Read.Length;/得到当前I/O缓冲区的长度。pInterfaceInfo = deviceExtension->Interface;/得到设备的接口PipeNum = 15;/ PDIUSBD12的读数据管道15,此管道为输入管道,采用块传输方式。pPipeInfo = &( pInterfaceInfo->Pipes PipeNum );/得到指定管道的当前信息。siz = sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER );/得到数据流模式结构长度。urb = ExAllocatePool( NonPagedPool, siz );/得到内存分页if( urb=NULL)/如果没有可以供利用的内存空间,返回错误信息。return STATUS_INSUFFICIENT_RESOURCES; transferFlags = USBD_SHORT_TRANSFER_OK;transferFlags |= USBD_TRANSFER_DIRECTION_IN;UsbBuildInterruptOrBulkTransferRequest(urb,(USHORT)siz,pPipeInfo->PipeHandle,Irp->MdlAddress,ReadLen,transferFlags,NULL);/建立中断或者块传输的IRPntStatus = Eval_CallUSBD( DeviceObject, urb );/调用读取设备的函数。if( NT_SUCCESS( ntStatus ) && USBD_SUCCESS( urb->UrbHeader.Status)Irp->IoStatus.Information = ReadLen;/得到数据长度。else/构造IRP中的相关域Irp->IoStatus.Information = 0;ntStatus=STATUS_UNSUCCESSFUL;Irp->IoStatus.Status = ntStatus;ExFreePool( urb );/释放此URBIoCompleteRequest( Irp, IO_NO_INCREMENT );return( ntStatus );