版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章绪论1.1PC接口简介PC中的接口有两类:串行接口和并行接口。计算机内部总线,如CPU与存储器之间匀采用并行接口,这样速度快;但外设却以串行接口比较占优势。传统的打印机接口为并行接口。SCSI标准的全名是小型设备通用接口标准,其传输速率为10M,早期的扫描仪一般使用此接口,硬盘与主机的联接也使用这种接口。串行接口出现最早,使用最广的RS232接口,但其速度太慢,现在已经逐渐被淘汰。USB接口和IEEE1394接口是两种速度比较高的串行接口,还有局域网中的以太网接口,它们具有较广阔的发展前景和应用潜力。USB适用于低档外设与主机之间的高速数据传输,USB1.1可以达到1.5Mbps或12Mbps的传输率,而1394更是可达100/200/400Mbps。USB2.0将速度定位在480Mbps,而IEEE1394也推出了1394b1.3.1版草案,速度从800Mbps起步,最高可达3.2Gbps。局局域中用得最多的是以太网接口,速度可达100Mbps,当使用光纤传输时,速度可达1000Mbps。1.2USB接口分析通用串行总线(UniversalSerialBusUSB),是一种快速、灵活的总线接口。与其它通信接口比较,USB接口的最大特点是易于使用。作为一种高速总线接口,USB适用于多种设备,如数码相机、MP3播放机、高速数据采集设备等。易于使用还表现在USB接口支持热插拔,并且所有的配置过程都由系统自动完成,无需用户干预。USB接口支持1.5Mb/s(低速)、12Mb/s(全速)和高达480Mb/s的数据传输速率,扣除用于总线状态、控制和错误监测等的数据传输,USB的最大理论传输速率仍达1.2Mb/s或9.6Mb/s,远高于一般的串行总线接口。USB接口芯片价格低廉,一个支持USB1.1规范的USB接口芯片价格大多在人民币15~30元之间,这也大大促进USB设备的开发与应用。1.3USB器件的选择在进行一个USB设备开发之前,首先要根据具体使用要求选择合适的USB控制器。目前,市场上供应的USB控制器主要有两种:带USB接口的单片机(MCU)或纯粹的USB接口芯片。带USB接口的单片机从应用上又可以分成两类,一类是从底层设计专用于USB控制的单片机另一类是增加了USB接口的普通单片机,如Cypress公司的EZ-USB(基于8051),选择这类USB控制器的最大好处在于开发者对系统结构和指令集非常熟悉,开发工具简单,但对于简单或低成本系统。但价格因素也是在实际选择过程中需要考虑的因素。纯粹的USB接口芯片仅处理USB通信,必须有一个外部微处理器来进行协议处理和数据交换。典型产品有Philips公司的PDIUSBD11(I2C接口)、PDIUSBD12(并行接口),NS公司的USBN9603/9604(并行接口),NetChip公司的NET2888等。USB接口芯片的主要特点是价格便宜、接口方便、可靠性高,尤其适合于产品的改型设计(硬件上仅需对并行总线和中断进行改动,软件则需要增加微处理器的USB中断处理和数据交换程序、PC机的USB接口通信程序,无需对原有产品系统结构作很大的改动)。
第二章系统分析2.1USB总线简介USB是一种支持在USB主机和USB设备之间进行串行数据传输的通信协议。主机作为总线的主叫方,采用两种信令模式:全速模式12Mb/s和低速模1.5Mb/s。USB使用四种数据传输方式:控制传输(control)、中断传输(interrupt)、批量传输(bulk)及等时传输(isochronous)。Intel公司开发的通用串行总线架构(USB)的目的主要基于以下三方面考虑: 一、计算机与电话之间的连接显然用计算机来进行计算机通信将是下一代计算机基本的应用。机器和人们的数据交互流动需要一个广泛而又便宜的连通网络。然而,由于目前产业间的相互独立发展,尚未建立统一标准,而USB则可以广泛的连接计算机和电话。二、易用性众所周知,PC机的改装是极不灵活的。对用户友好的图形化接口和一些软硬件机制的结合,加上新一代总线结构使得计算机的冲突大量减少,且易于改装。但以终端用户的眼光来看,PC机的输入/输出,如串行/并行端口、键盘、鼠标、操纵杆接口等,均还没有达到即插即用的特性,USB正是在这种情况下问世的。三、端口扩充外围设备的添加总是被相当有限的端口数目限制着。缺少一个双向、价廉、与外设连接的中低速的总线,限制了外围设备(如电话/电传/调制解调器的适配器、扫描仪、键盘、PDA)的开发。现有的连接只可对极少设备进行优化,对于PC机的新的功能部件的添加需定义一个新的接口来满足上述需要,USB就应运而生。它是快速、双向、同步、动态连接且价格低廉的串行接口,可以满足PC机的发展现状和未来需要。码主要存储在单片机中,通过单片机中的软件代码运行后,通过各个管脚的控制外围辅助电路的运行以实现系统的功能。复位电路是保证系统安全运行的基础,由于单片机的运行环境无法确定,无法保证单片机在长时间的运行过程中能够一直保证系统的稳定性,复位电路就是在单片机无法正常运行后,软复位无法进行复位的情况下,能够保证系统能够重新启动2.2USB技术指标USB最大的特点是支持热插拔(Hotplug)和即插即用(Plug&Play)。当设备插入时,主机枚举(enumerate)此设备并加载所需的驱动程序,因此使用远比PCI和ISA总线方便。目前USB支持3种数据信号速率,USB设备应该在其外壳或者有时是自身上正确标明其使用的速率。(1)1.5Mbit/s(183KByte/s)的低速速率,主要用于人机接口设备(HumanInterfaceDevices,HID)例如键盘、鼠标、游戏杆。(2)12Mbit/s(1.4MByte/s)的全速速率,在USB2.0之前是曾经是最高速率,后起的更高速率的高速接口应该兼容全速速率。多个全速设备间可以按照先到先得法则划分带宽,使用多个等时设备时会超过带宽上限也并不罕见。所有的USBHub支持全速速率。(3)480Mbit/s(57MByte/s)的高速速率。并非所有的USB2.0设备都是高速的。高速设备插入全速hub时应该与全速兼容,而高速hub具有所谓TransactionTranslator(事务翻译器)功能,能够隔离全速、低速设备与高速之间数据流,但是不会影响供电和串联深度。2.3USB系统构成USB系统主要由三部分组成,即宿主(host),USB设备(device)和USB连接。一、USB宿主USB宿主(host)是一个带有USB主控制器的PC机或者嵌入式系统,在USB系统中只有一个宿主,它是USB系统的主控者。USB宿主主要用于产生并且管理控制信号和数据流,检测并处理总线上的各种活动的状态,并为总线上的USB设备提供能源。USB宿主存在于主机系统中,它包括硬件,软件部分。其中,硬件部分指的是USB宿主控制器,一般集成在主板上,受USB系统软件的控制。软件部分分为三部分,分别是:1.USB设备驱动程序(USBDeviceDrivers)通过I/O请求包发出给USB设备的请求,而这些I/O请求包则完成对目标设备传输的设置。2.USB驱动程序(USBDriver)在设备设置时读取描述寄存器以获取USB设备的特征,并根据这些特征,在请求发生时组织数据传输。3.主控制器驱动程序(HostControllerDriver)完成对USB交换的调度,并通过根集线器或其它的集线器完成对交换的初始化。二、USB设备USB设备用于完成特定的功能,它具有极强的扩充性,能以一种星型+级联的方式连接起来,USB宿主可以根据USB设备的动态增减,对其进行动态配置。USB设备是实现某种具体功能的硬件设备,如键盘,鼠标和摄像头等。USB功能器件作为USB外设,它必须保持和USB协议的完全兼容,并可以响应标准的USB操作。同样,用于表明自己身份的“BIOS”系统对于USB外设也是必不可少的,这在USB外设上被称为协议层。在物理机制上,一个USB外设可以由四部分构成:(1)用于实现和USB协议兼容的SIE部分。(2)用于内存特征字,存储实现外设特殊功能程序及厂家信息的协议ROM(3)用于实现外设功能的传感器及对资料进行简单处理的DSP部分(4)将外设连接到主机或USBHub的接口部分。根据传输率的不同,USB功能器件被分为高速和低速两种。低速外设的标准传输率为1.5Mbps,而高速外设的标准传输率为12Mbps。例如鼠标,键盘等交互式设备就是低速设备运行,而打印机,扫描仪就使用全速设备模式运行。三、USB连接(数据流)USB连接实际上是指USB器件和USB主机连接并进行通信的方法,它可以将存在于USB主机和USB设备之间的USB数据传输模型描述为一个管道(pipe),管道只是一个逻辑上的概念。USB系统软件通过缺省管道(与端点0相对应)管理设备,设备驱动程序通过其它的管道来管理设备的功能接口。实际的数据传输过程是:设备驱动程序通过对USBD接口(USBdriverinterface)的调用发出输入输出请求(IRPI/ORequestPacket),USB驱动程序接到请求后调用HCD接口(hostcontrollerdriverinterface)将IRP转化为USB的传输(transfer),一个IRP可以包含一个或多个USB传输,然后HCD将USB传输分解为总线操作(transaction),由主控制器以包(packet)的形式发出。需要注意的是所有的数据传输都是由主机开始的,任何外设都无权开始一个传输。IRP是由操作系统定义的,而USB传输与总线操作是USB规范定义的。USB总线将1ms定义为一帧,每帧以一个SOF包为起始,在这1ms里USB进行一系列的总线操作,引入帧的概念主要是为了支持与时间有关的总线操作。为了满足不同外设和用户的要求USB提供了四种传输方式:控制传输,同步传输,中断传输,批传输。它们在数据格式,传输方向,数据包容量限制,总线访问限制等方面有着各自不同的特征。
第3章系统硬件设计3.1STC89C52单片机简介及最小系统随着电子技术的迅速发展,特别是随着大规模集成电路产生而出现的微型计算机,给人类生活带来了根本性的改变。单片微型计算机简称单片机。它是把组成微型计算机的各功能部件像中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等部件制作在一块集成芯片中,构成一个完整的微型计算机。由于它的结构与指令功能都是按照工业控制要求设计的,故又叫单片微控制器。3.1.1单片机发展概况及发展方向单片机的出现使现代科学技术研究得到了质的飞跃,可以毫不夸张地说,它给现代工业领域带来了一次新的技术革命。目前,单片机以其高可靠性、高性能价格比,在工业控制系统、智能化仪器仪表、办公自动化、日常生活用品等诸多领域得到极为广泛的应用。由于单片机技术在各个领域正得到越来越广泛的应用,世界上许多集成电路生产厂家相继推出了各种类型的单片机。早期单片机大多结构体系,指令复杂,指令代码、周期数不统一、指令运行很难实现流水线操作,大大阻碍了运行速度的提高。虽然单片机对运行速度要求远不如通用计算机系统或数字信号处理对指令运行速度的要求,但速度的提高会带来许多好处,并拓宽单片机应用领域。一方面可获得很高的指令运行速度,另方面,在相同的运行速度下,可大大降低时钟频率,有利于获得良好的电磁兼容效果。专用单片机是专门针对某一类产品系统要求而设计的。使用专用单片机可最大限度地简化系统结构,使资源利用效率最高。在大批量使用时有可观的经济效益和可靠性效益。专用单片机发展的基础是半导体集成工艺和微电子设计技术。采用模块化标准单元的快速设计及快速半导体集成工艺,将加速专用单片机的发展。3.1.2单片机特点及结构本系统采用STC89C52单片机,它是一种低电压、低功耗、高性能微控制器,具有8K字节可编程可擦出只读存储器。使得STC89C52为众多控制应用系统提供高灵活、超有效的解决方案。它与MCS-51指令系统兼容。STC89C52是一个功能强大的单片机,但它只有40个引脚,其中P1是一个完整的8位双向I/O口,此外,从STC89C52内部结构图也可看出,其内部结构与8051内部结构基本一致,引脚RST、XTAL1、XTAL2的特性和外部连接电路也完全与51系列单片机相应引脚一致.如图3.1所示。404039383736353433323130292827262524232221VCCP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/VppALE/PROGPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST(RXD)P3.0(TXD)P3.1(INT0)P3.2(INT1)P3.3(T0)P3.4(T1)P3.5(WR)P3.6(RD)P3.7XTAL1XTAL2GND图3.1单片机引脚图引脚功能说明如下:①VCC:供电电源。②GND:电路地。③P0口(P0.0~P0.7):为双向8位I/O端口。当作为I/O口使用时,可直接连接外部I/O口设备,由于内部没有上拉电阻,故要接上拉电阻。它是地址总线低8位及数据总线分时复用口,可以驱动8个TTL负载。一般作为扩展时的地址/数据总线口使用。当P0口作为地址/数据复用时不用接上拉电阻。④P1口(P1.0~P1.7):为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1),可以驱动4个TTL负载。⑤P2口(P2.0~P2.7):为8位准双向I/O口,当作为I/O口使用时,可直接连接外部I/O设备,可驱动4个TTL负载。一般作为扩展时地址总线的高8位复用口。⑥P3口(P3.0~3.7):为8位准双向I/O口,可驱动4个TTL负载,是双功能复用口,它的另一功能如表所示。⑦RST:复位输入。RST一旦变成高电平,所有的I/O引脚就复位到“1”。当振荡器正在运行时,持续给出RST引脚两个机器周期的高电平便可完成复位。每一个机器周期需12个振荡器或时钟周期。复位后应使此引脚电平为<0.5V的低电平,以保证单片机的正常工作。⑧XTAL1:作为振荡器反相放大器的输入和内部时钟发生器的输入。⑨XTAL2:作为振荡器反相放大器的输出。此外,从STC89C52内部结构图也可看出,其内部结构与8051单片机内部结构基本一致,引脚RST、XTAL1、XTAL2的特性和外部连接电路也完全与51系列单片机相应引脚一致。3.1.3复位电路设计在上电或复位过程中控制CPU的复位状态,这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令,执行错误操作,也可以提高电磁兼容性能。无论使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。51系列单片机的复位信号是从RST引脚输入到芯片内的触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位,如图3.2图3.3所示。C31C31uF10kVCCRESETVCCRSTGNDVCCSTC89C521uF10k图3.2手动按钮复位电路图3.3上电复位电路①上电复位:STC89C52的上电复位电路如图所示,RST引脚是复位信号的输入端,在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。只要高电平的复位信号持续两个机器周期以上的有效时间,就可以使单片机上电复位。上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,RST端电位与Vcc相同,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。上电时,Vcc的上升时间约为10ms,在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。②手动按钮复位:手动按钮复位需要人为在复位输入端RST上加入高电平(如图所示)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的要求。3.1.4单片机最小系统硬件设计图3.4单片机最小系统硬件原理图3.2PDIUSBD12接口芯片设计3.2.1USB接口芯片简介用于USB设备开发的芯片通常有两种:一种是带USB接口的微控制器,另一种是纯粹的USB接口芯片,需要外部微控制器(MCU)控制。PHILIPS公司的PDIUSBD12芯片属于后者。本文对此芯片的应用作了具体设计,以PDIUSBD12为接口芯片,以STC89C52为微控制器,完成了USB接口电路的设计。PDIUSBD12是一款性价比很高的USB器件,它通常用作微控制器系统中实现与微控制器进行通信的高速通用并行接口,它还支持本地的DMA传输。这种实现USB接口的标准组件使得设计者可以在各种不同类型微控制器中选择出最合适的微控制器。这种灵活性减小了开发的时间,风险以及费用,通过使用已有的结构和减少固件上的投资,从而用最快捷的方法实现最经济的USB外设的解决方案。PDIUSBD12完全符合USB1.1版的规范,它还符合大多数器件的分类规格:成像类,海量存储器件,通信器件,打印设备以及人机接口设备。同样地PDIUSBD12理想地适用于许多外设。PDIUSBD12的技术可提供良好的USB连接指示。在枚举中LED指示根据通信的状况间歇闪烁。当PDIUSBD12成功地枚举和配置后LED指示将一直点亮,随后与PDIUSBD12之间成功的传输(带应答)将关闭LED,处于挂起状态时,LED将会关闭。该特性为USB器件,集线器和USB通信状态提供了用户友好的指示。作为一个诊断工具,它对隔离故障的设备是很有用的。从系统测试中也可以看见该指示LED间歇闪烁,很好的验证了这一特性。PDIUSBD12内部包括模拟收发器、电压调整器、PLL、Philips串行接口引擎(PSIE)等。1、模拟收发器:集成的收发器接口可通过终端电阻直接与USB电缆相连。2、电压调整器:片内集成了一个3.3V的调整器用于模拟收发器的供电,该电压还作为输出连接到外部1.5kΩ的上拉电阻,可选择PDIUSBD12提供的带1.5kΩ内部上拉电阻的软件连接技术。3、PLL:片内集成了6M到48M时钟乘法PLL,这样就可使用低成本的6M晶振,EMI也随之降低。PLL的工作不需要外部元件。4、位时钟恢复:位时钟恢复电路使用4X过采样规则,从进入的USB数据流中恢复时钟,它能跟踪USB规定范围内的抖动和频漂。5、Philips串行接口引擎(PSIE):PhilipsSIE实现了全部的USB协议层,完全由硬件实现而不需要固件的参与。该模块的功能包括:同步模式的识别,并行/串行转换,位填充/解除填充,CRC校验/产生,PID校验/产生,地址识别和握手评估/产生。6、:与USB的连接是通过1.5kΩ上拉电阻将D+(用于高速USB器件)置为高实现的。1.5kΩ上拉电阻集成在PDIUSBD12片内,默认状态下不与VCC相连。连接的建立通过外部/系统微控制器发送命令来实现。这就允许系统微控制器在决定与USB建立连接之前完成初始化时序。USB总线连接可以重新初始化而不需要拔出电缆。PDIUSBD12在连接可以建立之前会检测USBVBUS是否可用。VBUS可通过EOT_N管脚进行检测。具体参阅管脚描述一节。需要注意的是,内部电阻的误差(25%)大于USB规格的5%.但用于连接的VSE电压规格仍然有足够的余量。是Philips半导体一项尚未获批准的专利技术。7、:技术可提供良好的USB连接指示。在枚举中LED指示根据通信的状况间歇闪烁。当PDIUSBD12成功地枚举和配置后LED指示将一直点亮,随后与PDIUSBD12之间成功的传输(带应答)将关闭LED,处于挂起状态时,LED将会关闭。该特性为USB器件,集线器和USB通信状态提供了用户友好的指示。作为一个诊断工具,它对隔离故障的设备是很有用的。该特性降低了现场支持和热线的成本。8、存储器管理单元(MMU)和集成(RAM):以12M/s的速率传输并与微控制器并口相连时,MMU和集成RAM作为USB之间速度差异的缓冲区。这就允许微控制器以自己的速率对USB信息包进行读写。9、并行和DMA接口:一个普通的并行接口定义成易于使用,快速而且可以与主流的微控制器直接接口。对一个微控制器而言,PDIUSBD12看起来就象一个带8位数据总线和一个地址位,占用2个位置的存储器件。PDIUSBD12支持多路复用和非复用的地址和数据总线,还支持主端点与本地共享RAM之间直接读取的DMA传输。支持单周期和突发模式的DMA传输。3.2.2USB接口芯片引脚配置PDIUSBD12芯片采用TSSOP28塑料极小型封装,一共28个引脚,本体宽度为4.4mm。图3.5芯片引脚配置下面对其引脚和命令字作具体说明。表3.6PDIUSBD12芯片引脚说明管脚符号类型描述1DATA<0>IO2双向数据位02DATA<1>IO2双向数据位13DATA<2>IO2双向数据位24DATA<3>IO2双向数据位35GNDP地6DATA<4>IO2双向数据位47DATA<5>IO2双向数据位58DATA<6>IO2双向数据位69DATA<7>IO2双向数据位710ALEI在多路地址/数据总线中,下降沿关闭地址信息锁存。将其固定为低电平用于单地址/数据总线配置11CS_NI片选(低有效)12SUSPENDI,OD4器件处于挂起状态13CLKOUTO2可编程时钟输出14INT_NOD4中断(低有效)15RD_NI读选通(低有效)16WR_NI写选通(低有效)17DMREQO4DMA请求18DMACK_NIDMA应答(低有效)19EOT_NIDMA传输结束(低有效)。EOT_N仅当DMACK_N和RD_N或WR_N一起激活才有效20RESET_NI复位(低有效且不同步)。片内上电复位电路,该管脚可固定接VCC21GL_NOD8GoodLinkLED指示器(低有效)22XTAL1I晶振连接端1(6MHz)23XTAL2O晶振连接端2(6MHz)。如果采用外部时钟信号取代晶振,可连接XTAL1,XTAL2应当悬空24VCCP电源电压(4.0V-5.5V),要使器件工作在3.3V,对VCC和脚都提供3.3V25D+AUSBD-数据线26D-AUSBD+数据线27P3.3V调整输出。要使器件工作在3.3V,对VCC和脚都提供3.3V28A0I地址位。A0=1选择命令指令,A0=0选择数据。该位在多路地址/数据总线配置时应接高电平随着科技的发展,芯片集成度越来越高,封装也变得越来越小,PDIUSBD12芯片不是采用标准DIP直插的引脚,因而需要有一个SOP转DIP的转接板,这样方便采用电路板设计硬件电路,同时也方便程序下载完成后系统的调试。即使有了转接板,采用贴片封装的PDIUSBD12芯片也需要手工焊接在转接板上,这一点需要特别注意,不能长时间焊接,以免芯片过热以致损坏。PDIUSBD12与一般需要提供时钟信号的芯片不同,该芯片需要标准的6MHz的时钟信号,因而采用晶振的时候需要特别注意,不能随意选择,这一点与51系列单片机能有选择的采用晶振的情况不同。芯片内部有各个寄存器,根据寄存器相关命令编写C语言程序(可以采用由局部到整体的方法),这样对USB传输协议的认识更清楚,程序流程也容易理解,脉络清晰。在程序中,Main函数作为程序设备Reset时的程序入口,调用了一些初始化设备的函数,比如各种寄存器如中断寄存器,定时器,计数器等,初始化D12芯片并完成连接等工作,然后程序进入循环等待阶段,等待着中断的发生。由于没有采用PCB制板,手工焊接要十分注意电源干扰的问题,电源和地之间要加上滤波电容。USB接口芯片与单片机之间的引线要尽量短,本设计采用并行传输,数据传输占用了8个IO口,个引脚连线要尽量平行,避免交叉,以免信号线相互干扰,造成数据传输不争取或者USB总线不能正常复位。PDIUSBD12芯片的GoodLinkLED指示器短接普通发光二极管时,要注意连接限流电阻,不能超过该芯片的输入电流额定值,否则可能造成芯片工作不正常,并且与电脑或者其他USBHost芯片不能正常建立连接。对该芯片的各个管脚和具体功能建立了一定认识的基础上,就能顺利完成各部分硬件电路的设计和软件功能调试。3.2.3USB接口芯片硬件设计图3.7PDIUSBD12接口原理图3.2.4USB接口芯片端点描述PDIUSBD12的端点适用于不同类型的设备,例如图像打印机海量存储器和通信设备端点可通过SetMode命令配置为4种不同的模式,分别为:表3.8端点模式模式0Non-ISO模式非同步传输模式1ISO-OUT模式同步输出传输模式2ISO-IN模式同步输入传输模式3ISO-IO模式同步输入输出传输4种模式具体说明见下表:表3.9模式0(非同步模式)端点数端点索引传输类型端点类型方向最大信息包规格(字节)001控制输出控制输入默认默认输出输入1616123普通输出普通输入普通普通输出输入1616245普通输出普通输入普通普通输出输入表3.3模式1(同步输出模式)端点数端点索引传输类型端点类型方向最大信息包规格(字节)001控制输出控制输入默认默认输出输入1616123普通输出普通输入普通普通输出输入161624同步输出同步输出表3.4模式2(同步输入模式)端点数端点索引传输类型端点类型方向最大信息包规格(字节)001控制输出控制输入默认默认输出输入1616123普通输出普通输入普通普通输出输入161624同步输入同步输入表3.5模式3(同步输入/输出模式)端点数端点索引传输类型端点类型方向最大信息包规格(字节)001控制输出控制输入默认默认输出输入1616123普通输出普通输入普通普通输出输入1616245同步输出同步输入同步同步输出输入表格说明:主端点(端点2)在有些方面是比较特别的,它是进行吞吐大数据的主要端点,同样地它执行主机的特性以减轻传输大数据的任务:1、双缓冲,允许USB与本地CPU之间的并行读写操作,这样就增加了数据的吞吐量缓冲区切换是自动处理的,这导致了透明的缓冲区操作。2、支持DMA(直接存储器访问)操作,可以和对其它端点的正常I/O操作交叉进行。3、DMA操作中的自动指针处理。在跨过缓冲区边界时不需要本地CPU的干预。4、可配置为同步传输或非同步(批量和中断)传输。3.2.5USB接口芯片命令系对一个具体的USB接口芯片,需要根据其相关寄存器或者命令字来驱动。下表指出了PDIUSBD12芯片的命令字:表3.10PDIUSBD12命令字说明命令名接受者编码数据初始化命令设置地址/使能器件D0H写1字节设置端点使能器件D8H写1字节设置模式器件F3H写2字节设置DMA器件FBH写/读1字节数据流命令读中断寄存器器件F4H读2字节选择端点控制输出00H读1字节(可选)控制输入01H读1字节(可选)端点1输出02H读1字节(可选)端点1输入03H读1字节(可选)端点2输出04H读1字节(可选)端点2输入05H读1字节(可选)读最后处理状态控制输出40H读1字节控制输入41H读1字节端点1输出42H读1字节端点1输入43H读1字节端点2输出44H读1字节端点2输入45H读1字节读缓冲区选择的端点F0H读N字节写缓冲区选择的端点F0H写N字节设置端点状态控制输出40h写1字节控制输入41h写1字节端点1输出42h写1字节端点1输入43h写1字节端点2输出44h写1字节端点2输入45h写1字节应答设置选择的端点F1H无缓冲区清零选择的端点F2H无使缓冲区有效选择的端点FAH无普通命令发送回复F6H无读当前帧数目F5H读1或2字节3.3USB键盘硬件设计图3.11USB键盘硬件原理图三江学院2014届本科生毕业设计(论文)第4章系统软件设计单片机开发中除必要的硬件外,同样离不开软件,汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,机器汇编是通过汇编软件将源程序变为机器码。随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。Keil软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到其生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。本设计采用的开发环境为KeiluVision4,开发语言为C语言。C语言是一个通用的编程语言,它提供高效的代码,结构化的编程和丰富的操作符。C不是一种大语言,不是为任何特殊应用领域而设计。它一般来说限制较少,可以为各种软件任务提供方便和有效的编程。许多应用用C比其他语言编程更方便和有效。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。软件设计部分主要是要处理好按键扫描和USB接口芯片的数据传输问题,按键扫描部分利用单片机监测处理,实时性好。以下为各部分软件设计的详细介绍。
4.1固件编程的实现4.1.1USB接口芯片工作流程图开始开始初始化按键和定时器初始化按键和定时器连接USB连接USB等待USB中断等待USB中断N有中断事件发生?N有中断事件发生?YY判断中断类型判断中断类型转中断处理转中断处理N有按键事件发生?N有按键事件发生?YY发送U发送USB数据包图4.1USB接口芯片工作流程图4.1.2PDIUSBD12命令接口PDIUSBD12.C详细程序见附录A。4.1.3USB中断服务程序USBISR.C详细程序见附录B。4.1.4按键处理流程图开始开始5ms中断时间到5ms中断时间到读取键值读取键值Y按键与上次相同?Y按键与上次相同?NNN判断模式正确?N判断模式正确?YY键值处理键值处理YUYUSB接口忙?NN发送按键值发送按键值图4.2按键处理流程图4.1.5USB键盘处理程序KEY.C/********************************************************************函数功能:定时器0中断处理。入口参数:无。返回:无。备注:22.1184M晶体约5ms中断一次。********************************************************************/voidTimer0Isr(void)interrupt1{//定时器0重装,定时间隔为5ms,加15是为了修正重装所花费时间//这个值可以通过软件仿真来确定,在这里设置断点,调整使两次运行//时间差刚好为5ms即可。TH0=(65536-Fclk/1000/12*5+15)/256; TL0=(65536-Fclk/1000/12*5+15)%256;//if(!KeyCanChange)return;//如果正在处理按键,则不再扫描键盘//开始键盘扫描//保存按键状态到当前按键情况//KeyCurrent总共有8个bit//当某个开关按下时,对应的bit为1KeyCurrent=GetKeyValue();//读取键值,GetKeyValue()其实是个宏,不是函数,//这里故意写成函数的样子,美观。它的定义在//key.h文件中if(KeyCurrent!=KeyOld)//如果两次值不等,说明按键情况发生了改变{KeyNoChangedTime=0;//键盘按下时间为0KeyOld=KeyCurrent;//保存当前按键情况return;//返回}else{KeyNoChangedTime++; //按下时间累计if(KeyNoChangedTime>=1) //如果按下时间足够{ KeyNoChangedTime=1; KeyPress=KeyOld;//保存按键 KeyDown|=(~KeyLast)&(KeyPress);//求出新按下的键 KeyUp|=KeyLast&(~KeyPress);//求出新释放的键 KeyLast=KeyPress; //保存当前按键情况}}}4.1.6USB主循环程序MAIN.C主函数部分程序代码:/********************************************************************函数功能:主函数。入口参数:无。返回:无。备注:无。********************************************************************/voidmain(void)//主函数{uint16id;uint8InterruptSource;EA=1;//打开中断InitKeyboard();//初始化按键id=D12ReadID();Prints("YourD12chip\'sIDis:");PrintShortIntHex(id);if(id==0x1012){Prints(".IDiscorrect!Congratulations!\r\n\r\n");}else{Prints(".IDisincorrect!Whatapity!\r\n\r\n");}UsbDisconnect();//先断开USB连接UsbConnect();//将USB连接上ConfigValue=0;//配置值初始化为0while(1)//死循环{ if(D12GetIntPin()==0)//如果有中断发生 { D12WriteCommand(READ_INTERRUPT_REGISTER);//写读中断寄存器的命令 InterruptSource=D12ReadByte();//读回第一字节的中断寄存器 if(InterruptSource&0x80)UsbBusSuspend();//总线挂起中断处理 if(InterruptSource&0x40)UsbBusReset();//总线复位中断处理 if(InterruptSource&0x01)UsbEp0Out();//端点0输出中断处理 if(InterruptSource&0x02)UsbEp0In();//端点0输入中断处理 if(InterruptSource&0x04)UsbEp1Out();//端点1输出中断处理 if(InterruptSource&0x08)UsbEp1In();//端点1输入中断处理 if(InterruptSource&0x10)UsbEp2Out();//端点2输出中断处理 if(InterruptSource&0x20)UsbEp2In();//端点2输入中断处理 } if(ConfigValue!=0)//如果已经设置为非0的配置,则可以返回报告数据 { if(!Ep1InIsBusy)//如果端点1输入没有处于忙状态,则可以发送数据 { KeyCanChange=0;//禁止按键扫描 if(KeyUp||KeyDown)//如果有按键事件发生 { SendReport();//则返回报告 } KeyCanChange=1;//允许按键扫描 } }}}程序说明:如果单片机检测到按键按下的信息,并根据相应的模式发送按键码,USB接口芯片如果出于非忙的状态,自动将处理好的数据包发往PC机,顺利实现一次按键过程。前文指出,PDIUSBD12的技术可提供良好的USB连接指示。在枚举中LED指示根据通信的状况间歇闪烁。当PDIUSBD12成功地枚举和配置后LED指示将一直点亮,随后与PDIUSBD12之间成功的传输(带应答)将关闭LED,处于挂起状态时,LED将会关闭。该特性为USB器件,集线器和USB通信状态提供了用户友好的指示。作为一个诊断工具,它对隔离故障的设备是很有用的。从系统测试中也可以看见该指示LED间歇闪烁,很好的验证了这一特性。4.2实物演示将USB插入电脑,看到USB指示灯闪烁,说明连接正常,打开记事本,任意按下相应的独立开关,模拟电脑键盘下的键值,在记事本中成功的显示了相应的按键键值,即USB与电脑通讯成功.
结束语本科毕业设计是对大学两年年来所学专业知识的整体考察,也是对自己综合能力的一次很好的评估。掌握了基于51单片机和PDIUSBD12芯片的USB键盘设计与实现,熟悉了USB相关协议,为以后的深入学习奠定了良好的基础。编程所采用的软件开发平台是KeiluVision4,开发语言是C语言,硬件调试电路手工焊接,可操作性好。虽然C语言和开发环境曾经都学习并使用过,但应用于这次的毕业设计才发现自己掌握的还不够熟练。在老师的悉心指导下,自己查找资料、动手练习,在顺利完成毕设任务的同时,对单片机C语言和USB协议的认识和掌握水平也上了一个新的台阶。该论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。现总结论文研究工作如下:(1)阐述了USB总线的原理;(2)对本设计的系统要求作出了分析,根据要求选定元件和具体编程方案;(3)针对系统所要实现的功能对相关芯片作了详细介绍,特别是对Philips公司的PDIUSBD12芯片给出了具体的描述;(4)在硬件部分设计了原理图,对单片机控制电路和USB接口芯片及其外围给出了Protel电路图,在软件部分设计了采用了结构化的程序思想。从系统演示的实际情况来看,本设计虽然实现了基本功能,但还有很多功能不是很完备,希望可以在今后的学习和工作中去完善。致谢大学生活也已渐渐到了尾声,此次论文的写作从开题、查阅资料、分析设计到最后全部完成,也用了4个多月的时间。在此期间得到了老师和同学的帮助,我要感谢他们对我的帮助。这次毕业论文设计中,我的指导老师对我的关心和支持及其重要。在论文的开题、大纲确立和最后的成文过程中,老师悉心指导并帮助我,使论文才能顺利的完成。孙老师严谨的教学方法、积极的工作态度对我有着很大的鼓励每次遇到难题的时候,我最先做的就是向孙老师寻求帮助,而孙老师每次不管忙或闲,都会通过邮箱电话的形式来帮助我,然后帮我解决问题。老师平日里工作繁多,但我做毕业设计的每个阶段,从选题到查阅资料,论文提纲的确定,中间的无数次的修改,最后论文格式调整等各个环节中都给予了我细心的指导。这几个月以来,孙老师一直指导我完成毕业设计,最后我再次对我的指导老师表示感谢!
参考文献[1]卢超。单片机与PC机的通信设计[J].工矿自动化,2007-5.[2]胡晓军.USB接口开发技术[M].西安:西安电子科技大学出版社,2005[3]杨代华,叶敦范,王典洪等.单片机原理及应用[M].武汉:中国地质大学出版社,2002[4]陈再清。微机—单片机通信浅谈[J].电气时代,2001-12.
[5]张念淮.USB总线接口开发指南[M].北京:国防工业出版社,1999[6]路永坤.基于USB接口的数据采集模块的设计与实现[J].自动化仪表,2005,(2)[7]马忠梅,马岩,张凯等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1996[8]董建国,戚云军,何运兰.基于USB总线的PC机与单片机的通信[J].信息技术,2003-11.
[9]徐振立,陶乐仁,等。在VB平台上开发的太阳能喷射制冷实验台测控系统[J].微计算机信息,2007,23(7-1).
[10]李华.MCS-51系列单片机使用接口技术[M].北京:北京航空航天大学出版社,2000[11]史波,田凯。通用串行总线USB技术概述[J].信息技术,2001(4).[12]ChrisCant.WindowsWDM设备驱动程序开发指南[M].西安:西安电子科技大学出版社,2000
附录A4.1.2PDIUSBD12命令接口PDIUSBD12.C/********************************************************************函数功能:D12写命令。入口参数:Command:一字节命令。返回:无。备注:无。********************************************************************/voidD12WriteCommand(uint8Command){D12SetCommandAddr();//设置为命令地址D12ClrWr();//WR置低D12SetPortOut();//将数据口设置为输出状态(注意这里为空宏,移植时可能有用)D12SetData(Command);//输出命令到数据口上D12SetWr();//WR置高D12SetPortIn();//将数据口设置为输入状态,以备后面输入使用}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:读一字节D12数据。入口参数:无。返回:读回的一字节。备注:无。********************************************************************/uint8D12ReadByte(void){uint8temp;D12SetDataAddr();//设置为数据地址D12ClrRd();//RD置低temp=D12GetData();//读回数据D12SetRd();//RD置高returntemp;//返回读到数据}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:读D12的ID。入口参数:无。返回:D12的ID。备注:无。********************************************************************/uint16D12ReadID(void){uint16id;D12WriteCommand(Read_ID);//写读ID命令id=D12ReadByte();//读回ID号低字节id|=((uint16)D12ReadByte())<<8;//读回ID号高字节returnid;}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:写一字节D12数据。入口参数:Value:要写的一字节数据。返回:无。备注:无。********************************************************************/voidD12WriteByte(uint8Value){D12SetDataAddr();//设置为数据地址D12ClrWr();//WR置低D12SetPortOut();//将数据口设置为输出状态(注意这里为空宏,移植时可能有用)D12SetData(Value);//写出数据D12SetWr();//WR置高D12SetPortIn();//将数据口设置为输入状态,以备后面输入使用}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:读取D12最后传输状态寄存器的函数。入口参数:Endp:端点号。返回:端点的最后传输状态。备注:该操作将清除该端点的中断标志位。********************************************************************/uint8D12ReadEndpointLastStatus(uint8Endp){D12WriteCommand(0x40+Endp);//读取端点最后状态的命令returnD12ReadByte();}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:选择端点的函数,选择一个端点后才能对它进行数据操作。入口参数:Endp:端点号。返回:无。备注:无。********************************************************************/voidD12SelectEndpoint(uint8Endp){D12WriteCommand(0x00+Endp);//选择端点的命令}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:清除接收端点缓冲区的函数。入口参数:无。返回:无。备注:只有使用该函数清除端点缓冲后,该接收端点才能接收新的数据包。********************************************************************/voidD12ClearBuffer(void){D12WriteCommand(D12_CLEAR_BUFFER);}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:应答建立包的函数。入口参数:无。返回:无。备注:无。********************************************************************/voidD12AcknowledgeSetup(void){D12SelectEndpoint(1);//选择端点0输入D12WriteCommand(D12_ACKNOWLEDGE_SETUP);//发送应答设置到端点0输入D12SelectEndpoint(0);//选择端点0输出D12WriteCommand(D12_ACKNOWLEDGE_SETUP);//发送应答设置到端点0输出}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:读取端点缓冲区函数。入口参数:Endp:端点号;Len:需要读取的长度;Buf:保存数据的缓冲区。返回:实际读到的数据长度。备注:无。********************************************************************/uint8D12ReadEndpointBuffer(uint8Endp,uint8Len,uint8*Buf){uint8i,j;D12SelectEndpoint(Endp);//选择要操作的端点缓冲D12WriteCommand(D12_READ_BUFFER);//发送读缓冲区的命令D12ReadByte();//该字节数据是保留的,不用。j=D12ReadByte();//这里才是实际的接收到的数据长度if(j>Len)//如果要读的字节数比实际接收到的数据长{j=Len;//则只读指定的长度数据}#ifdefDEBUG1//如果定义了DEBUG1,则需要显示调试信息Prints("读端点");PrintLongInt(Endp/2);//端点号。由于D12特殊的端点组织形式,//这里的0和1分别表示端点0的输出和输入;//而2、3分别表示端点1的输出和输入;//4、5分别表示端点2的输出和输入。//因此要除以2才显示对应的端点。Prints("缓冲区");PrintLongInt(j);//实际读取的字节数Prints("字节。\r\n");#endiffor(i=0;i<j;i++){//这里不直接调用读一字节的函数,而直接在这里模拟时序,可以节省时间D12ClrRd();//RD置低*(Buf+i)=D12GetData();//读一字节数据D12SetRd();//RD置高#ifdefDEBUG1PrintHex(*(Buf+i));//如果需要显示调试信息,则显示读到的数据if(((i+1)%16)==0)Prints("\r\n");//每16字节换行一次#endif}#ifdefDEBUG1if((j%16)!=0)Prints("\r\n");//换行。#endifreturnj;//返回实际读取的字节数。}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:使能发送端点缓冲区数据有效的函数。入口参数:无。返回:无。备注:只有使用该函数使能发送端点数据有效之后,数据才能发送出去。********************************************************************/voidD12ValidateBuffer(void){D12WriteCommand(D12_VALIDATE_BUFFER);}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:将数据写入端点缓冲区函数。入口参数:Endp:端点号;Len:需要发送的长度;Buf:保存数据的缓冲区。返回:Len的值。备注:无。********************************************************************/uint8D12WriteEndpointBuffer(uint8Endp,uint8Len,uint8*Buf){uint8i;D12SelectEndpoint(Endp);//选择端点D12WriteCommand(D12_WRITE_BUFFER);//写WriteBuffer命令D12WriteByte(0);//该字节必须写0D12WriteByte(Len);//写需要发送数据的长度#ifdefDEBUG1//如果定义了DEBUG1,则需要显示调试信息Prints("写端点");PrintLongInt(Endp/2);//端点号。由于D12特殊的端点组织形式,//这里的0和1分别表示端点0的输出和输入;//而2、3分别表示端点1的输出和输入;//4、5分别表示端点2的输出和输入。//因此要除以2才显示对应的端点。Prints("缓冲区");PrintLongInt(Len);//写入的字节数Prints("字节。\r\n");#endifD12SetPortOut();//将数据口设置为输出状态(注意这里为空宏,移植时可能有用)for(i=0;i<Len;i++){//这里不直接调用写一字节的函数,而直接在这里模拟时序,可以节省时间D12ClrWr();//WR置低D12SetData(*(Buf+i));//将数据放到数据线上D12SetWr();//WR置高,完成一字节写#ifdefDEBUG1PrintHex(*(Buf+i));//如果需要显示调试信息,则显示发送的数据if(((i+1)%16)==0)Prints("\r\n");//每16字节换行一次#endif}#ifdefDEBUG1if((Len%16)!=0)Prints("\r\n");//换行#endifD12SetPortIn();//数据口切换到输入状态D12ValidateBuffer();//使端点数据有效returnLen;//返回Len}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:设置地址函数。入口参数:Addr:要设置的地址值。返回:无。备注:无。********************************************************************/voidD12SetAddress(uint8Addr){D12WriteCommand(D12_SET_ADDRESS_ENABLE);//写设置地址命令D12WriteByte(0x80|Addr);//写一字节数据:使能及地址}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:使能端点函数。入口参数:Enable:是否使能。0值为不使能,非0值为使能。返回:无。备注:无。********************************************************************/voidD12SetEndpointEnable(uint8Enable){D12WriteCommand(D12_SET_ENDPOINT_ENABLE);if(Enable!=0){D12WriteByte(0x01);//D0为1使能端点}else{D12WriteByte(0x00);//不使能端点}}////////////////////////Endoffunction//////////////////////////////
附录B4.1.3USB中断服务程序USBISR.C/********************************************************************函数功能:总线挂起中断处理函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbBusSuspend(void){#ifdefDEBUG0Prints("USB总线挂起。\r\n");#endif}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:总线复位中断处理函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbBusReset(void){#ifdefDEBUG0Prints("USB总线复位。\r\n");#endifEp1InIsBusy=0;//复位后端点1输入缓冲区空闲。}/********************************************************************函数功能:根据pData和SendLength将数据发送到端点0的函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbEp0SendData(void){//将数据写到端点中去准备发送//写之前要先判断一下需要发送的数据是否比端点0//最大长度大,如果超过端点大小,则一次只能发送//最大包长的数据。端点0的最大包长在DeviceDescriptor[7]if(SendLength>DeviceDescriptor[7]){//按最大包长度发送D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);//发送后剩余字节数减少最大包长SendLength-=DeviceDescriptor[7];//发送一次后指针位置要调整pSendData+=DeviceDescriptor[7];}else{if(SendLength!=0){//不够最大包长,可以直接发送D12WriteEndpointBuffer(1,SendLength,pSendData);//发送完毕后,SendLength长度变为0SendLength=0;}else//如果要发送的数据包长度为0{if(NeedZeroPacket==1)//如果需要发送0长度数据{D12WriteEndpointBuffer(1,0,pSendData);//发送0长度数据包NeedZeroPacket=0;//清需要发送0长度数据包标志}}}}/********************************************************************函数功能:端点0输出中断处理函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbEp0Out(void){#ifdefDEBUG0Prints("USB端点0输出中断。\r\n");#endif//读取端点0输出最后传输状态,该操作清除中断标志//并判断第5位是否为1,如果是,则说明是建立包if(D12ReadEndpointLastStatus(0)&0x20){D12ReadEndpointBuffer(0,16,Buffer);//读建立过程数据D12AcknowledgeSetup();//应答建立包D12ClearBuffer();//清缓冲区//将缓冲数据填到设备请求的各字段中bmRequestType=Buffer[0];bRequest=Buffer[1];wValue=Buffer[2]+(((uint16)Buffer[3])<<8);wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);wLength=Buffer[6]+(((uint16)Buffer[7])<<8);//下面的代码判断具体的请求,并根据不同的请求进行相关操作//如果D7位为1,则说明是输入请求if((bmRequestType
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年云南省玉溪市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2021年内蒙古自治区鄂尔多斯市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2024年四川省达州市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2024年山东省淄博市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2024年山西省运城市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 《新闻大纲与说明》课件
- 本科生毕业论文开题报告要求及开题相关表格
- 2024年基础地质勘查服务项目资金筹措计划书
- 2025年电子控制四轮驱动装置项目提案报告模稿
- 2025年气体管道运输服务项目提案报告模范
- 米酒酿造工艺
- 点式高层住宅工程施工组织设计
- GB/T 44696-2024剧院服务规范
- 0-3岁婴幼儿心理发展知到智慧树期末考试答案题库2024年秋杭州师范大学
- 2024年1月福建省普通高中学业水平合格性考试化学试题(解析版)
- 齐白石介绍课件
- 窥见中华文明之光- 高中语文统编版(2022)必修下册第一单元整体教学设计
- 2024年安徽省公务员录用考试《行测》真题及解析
- 项目年终总结及明年计划
- 2024年工程部年终总结
- 新外贸业务员年终总结
评论
0/150
提交评论