www.hao123.com宽屏_ -|五纯├都江堰安监局
淘宝减肥药排行榜十强
只推淘宝安全有效的减肥药

当前位置:www.hao123.com宽屏 > 减肥产品

www.hao123.com宽屏

时间:2020-09-22 18:46  编辑:安岳幼儿园

www.hao123.com宽屏第一章引言

1.1USB的应用背景和意义

RS-232是由美国电子工业联合会(EIA)与BELL等公司以其开发的并于1969年公布的串行通信接口标准,是为远程通讯连接数据终端设备DTE(DataTerminalEquipment)与数据通讯设备DCE(DataCommuninationEquipment)定义的物理接口。由于制造产商都生产与RS-232兼容的通信设备,而且其接口和通信协议比较简单,通信设备产商开发出了大量的以RS-232为接口的各类产品,因而在计算机串行通信领域采用最为普遍,已经成为微机串行通信接口中广泛采用的一种标准。

USB(UniversalSerialBus)通用串行总线是由康柏等七家大厂商共同开发制定的一种新型的外设接口标准,1996年公布了USB1.0版本。USB总线规范推出后,由于USB总线的速度快,用户安装方便等优点对RS-232总线产生了冲击,USB技术和设备在电脑中已经得到较为广泛的应用,现在的台式PC机和笔记本电脑基本上都带有一到两个USB接口,很多计算机外设都采用USB接口,各种带USB接口的芯片以及USB设备也在市场上不断涌现。USB技术已经成为计算机领域发展最快的技术之一。

随着USB应用领域的逐渐扩大,人们对于USB的期望也越来越高,希望USB能应用在各种计算机领域中,尤其是在工业场合中工业接口和USB接口数据通信的实现。常用的工业接口,如RS232,这些接口都是上个世纪七、八十年代设计的。随着USB设备的普及,如何方便的实现RS232接口到USB接口的转换,实现USB到RS232的双向数据通信,就成为当前急需解决的问题。

要解决上述问题,首先就需要解决USB主机,因为USB主机是USB系统的核心。在工业场合中,考虑到易用性和成本因素,不可能为每个RS232接口配置一台电脑实现RS232到USB的转换。这种情况下,USB只能应用在没有PC的领域中,这也正是目前USB的一个弱点。解决这一根本问题的办法就是在嵌入式系统中集成USB主机功能,使之能够和USB设备通信;同时系统还要有RS232模块,使系统成为连接USB和RS232的桥梁。

1.2USB国内外应用现状

USB主机的应用在国内外均处于积极研究和发展的阶段。现今已有为数不少的半导体公司提供主动接口芯片,如Cypress、Philips、TI、NS等,市场上也逐步出现具有

部分功能的嵌入式主机产品。将主动接口应用于消费类产品,如数码相机直接连接打印

机国外己经有所发展。大多数厂家和论坛所能提供的产品或例程多数是基于嵌入式操作

系统的,给出的器件类也不尽完善。在国内,主动接口的研究仍然处于起步阶段,仅有

很少量嵌入式主机的产品问世。目前已经有人研究了用SL811HS和ISPll61实现的系统,但是他们的研究都存在着识别率不高和系统不稳定的情况。

对于从动接口的开发,国内外的研究起步都很早,现在技术发展的也比较成熟。在

工业数据传输场合,有的采用带USB接口的单片机进行开发,还有的采用微处理器外加USB接口芯片的方法。带USB接口的单片机从应用上又可以分成两类,一类是专用于控制的单片机,比如Cypress公司的低、全速系列产品,但由于价格、开发工具以及单片机性能有限等问题,所以一般不选用。另一种增加了USB接口的普通单片机,例如INTEL公司的8X931等,选择这类USB控制器的好处在于开发者对系统结构和指令集非常熟悉,开发工具简单,但对于简单系统,价格高是最大的障碍。总体来说,后者的价格是前者价格的近10倍16J。

1.3USB技术的产生和发展

当今PC上使用的绝大多数设备都是基于接口实现的。在USB出现之前,PC上的接

口基本上是20世纪七、八十年代设计的。随着计算机技术的迅猛发展,这些接口已经不

能满足PC与外设之间不断提高的传输速度、稳定型和易用性。这一现象,已经大大限

制了计算机技术的发展,成为计算机功能扩展的桎梏。

为了解决旧接口的缺陷,1994年,Intel,Compaq等七家软硬件全球知名企业为了突破当时PC使用串口和并口传输速度的限制,成立了通用串行总线开发者论坛(USBImplementersForum,USBIF),并在1994年11月提出了USB0.7版,到了1998年开始出现了支持USB1.1的设备,他的高速性(USBl.1支持1.5Mb/s和12Mb/s两种速度)。和易用性迅速使之成为PC外设的宠儿u1。为了对抗1394速度的优势(1394可以达到400Mb/s),1999年提出了USB2.0规范的思想,2000年4月USBIF推出USB2.0。USB2.0向下兼容1.1,提供3种速度,最高可以达到480Mb/s。为了增强USB的可移动性,又于2001年12月发布了USBOn-The—Go1.0版本协议作为USB2.0协议的补充.USBOTG协议基本符合USB2.0的规范,所不同的是USBPTG完全抛开了PC,既可以作为Host,也可以作为Slave,而与另一个OTG设备直接实现点对点通信t2-41。目前无线USB(WUSB)I.0版本已经发布.这个技术以多频段OFDM(jE交频分复用)技术为基础,融合了WiMedia联盟确定的通用超宽带无线电平台技术。目前这项技术还处于早期的定义阶段,并不完善。但是其速度非常惊人,其标准速度可以达到2000Mbps,是目前USB2.0极限速度的近5倍。

第二章协议概述

USB是一种串行总线,它通过查询方式识别挂在总线上的设备。USB总线上只有

一个主机,每一次数据传输都是由主机发起的,并且在总线上的各种外设共享USB总

线带宽。USB协议是一个非常庞大而复杂的协议集,已经有很多的专业书籍介绍。下

面就本课题涉及的相关方面做简要介绍。

2.1USB协议栈设备框架

1、USB描述符

USB设备采用设备构架的概念来描述一个USB设备,它把USB设备看成是一个配置、接口和端点的集合,并采用标准USB描述符来说明它们,其中包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符;对于高速设备,还可以包含设备限定描述符和其他速率配置描述符(因本文未研究高速设备,这里将不叙述)。这些设备描述符适用于所以的USB设备,它们都包含有特定功能的字段,以指出SUB设备的特性。

除了这些标准USB描述符之外,设备类和供应商也可以自己定义其设备专用的描述符,分别称为设备类定义描述符和供应商自定义描述符,它们可以在标准描述符的格式上进行扩展,也可以使用其他非标准的格式。以上几种描述符,主机都可以用

GetDescriptor请求来读取它们。

设备描述符一一个USB设备可以含有一个或多个配置,设备描述符用于指出USB设备的总体信息,其内容对该设备中同一个传输模式下的所以配置都有效。一个USB设备只能有一个设备描述符。·

配置描述符⋯所有的USB设备都必须最少支持一个配置描述符,以指出其配置信息。当主机请求配置描述符时,其所有相关的接口描述符和端点描述符都将被返回:如果其包含设备类定义描述符或供应商自定义描述符,它们也将会跟在配置描述符的后面一起返回。

接口描述符一USB设备的接口是一个端点的集合,他负责完成该设备的特定功能。接口可以包含一个或多个可替换的配置,它们能够在USB设备处于配置状瓣付,改变当前接口所含端点的个数和特性,其缺省值可替换为“0”.接口描述符用于指出USB设备各个接口的特性,如接口所含端点的个数、其所属的设备类及子类。USB设备的每一个接口都必须有一个接口描述符。

端点描述符⋯用于指出USB设备端点的特性,如其所支持的传输类型、传输方向等信息。除端点“0”外,USB设备的每个端点都必须有一个端点描述符。主机不能使用。GetDescriptor请求来读取端点描述符,其只能作为USB设备配置信息的一部分在鼍GetDescriptor(Configuration)请求中返回。

字符串描述符⋯用于保存一些文本信息,如供应商名称、产品序列号等,它是可选的。如果一个设备无字符串描述符,所有其他描述符中有关字符串描述符的索引都为0即可。

2、设备请求

USB定义了11种标准USB设备请求,如GetDescripto、SelfInterface等,其主要功能是完成USB设备的配置操作。表2.1列出了这些请求的请求号和功能。除了这些标准请求外,设备类和供应商也可以自定义设备专用的请求,分别称为设备类定义请求和供应商自定义请求。不论是标准请求还是各种自定义请求,它们都只能使用控制管道来进行传输。

2.2串行通信的概念

所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。典型的串行接口的结构如图2.1所示

图2.1串行接口的结构

串行通信协议具有统一标准,主要包括通信控制规程和传输控制规程,是对通信双方的一种约定。对涉及数据传输链路层的数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等各方面做出的统一规范。目前采用的通信协议主要分为异步传输协议和同步传输协议两类。·

RS-232、RS-422与RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422由RS-232发展而来,它是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。

第三章系统的总规划

本章将先分析系统设计要求,再分析方案的选择。

3.1系统设计要求

本系统要实现2种功能。第一:实现USB主机功能,系统的USBHOST口接U盘或者USB口的移动硬盘,系统的RS232接口接RS232设备(如PC上的RS232口),实现RS232设备和USB设备的数据通信。用户能够通过本系统将RS232端的数据以文件的形式存储到移动存储器中,如U盘、移动硬盘等;也可以将U盘中的资料通过RS232接口读出来。其功能如图3.3所示。第二:实现USB设备功能,系统的USBSLAVE口接USB主机(如PC上的USB口),RS232接口接RS232设备。实现传统意义上的RS232到USB口的转换。用户可以将RS232设备当作成普通USB设备进行操作。其功能如图3.4所示。

具体设计考虑的要素有:

1、良好的兼容性;

模块要完全遵守USBl.1协议,使之具有良好的兼容性,全面兼容大部分遵守USB规范的移动存储器(包括基于FLASH的,基于SmartMedia等的移动存储器和USB接口的移动硬盘等)。

2、实现USB主机和设备功能.

当模块作为USB主机时,要保证其完全实现USB主机功能。包括实现设备的总线枚举和实现大容量存储协议等。模块作为设备使用时,能够完成主机的传输请求。

3、实现USB/RS232/485的接口转换

本系统主要是完成USB—RS232接口的转换,因此要实现模块作为USB主机和作为USB设备2种模式下的USB协议到RS232协议的转换。

4、要方便用户扩展

系统要留有用户接口,如数据VI、读写控制线、芯片选通线等,方便用户扩展

5、低功耗要求

模块在保证驱动能力的情况下要尽量减少功耗以节省能源

6、成本要求

在保证功能的情况下,尽可能降低成本。

3.2方案的选择

目前USB主机系统的方案主要有以下几种:

l、传统的USB接口转换芯片

通过采用USB接口转换芯片,如CYGNAL公司的CP2101等,实现传统接1:3与USB接口的转换,但是这需要利用微处理器开发针对所用接口的相应驱动程序和所要支持的类协议,由专用USB控制芯片转换为相应的USB接口的驱动程序,从而驱动相应的USB嵌入式设备,实现USB主机功能。这样的方案严格意义上说并不是USB主机系统,在传输速度以及拓扑结构等方面,根本无法发挥USB的诸多特点,本质上还是传统的总线接口。

2、利用集成USB模块的微处理器

此种方案的主要优点是嵌入式系统的硬件和软件设计的可靠性得到保证,实现底层协议栈,应用系统设计工程师只需考虑具体应用需求,完成特定的功能。但缺点是成本比较高,适用于高端应用。

3、利用单片机+USB主机控制器

这种实现的方案,可选用多种型号的微控制器来实现协议栈,并可根据具体要求选用不同速度的单片机作为核心芯片,基本硬件结构大致相同。只是应当考虑到单片机速度是否足够快和内存是否足够大,要想一些办法对协议栈及其设备类协议进行简化和保持最基本的东西,即嵌入式系统加上USB协议栈及其设备类协议转变为具体的系统。该方案的优点,一是不依赖PC机,利用单片机系统直接实现主机,整个系统完全自给自足;二是外围器件可以灵活配置,需要什么可以在基本配置上加上相应的模块就可以了。

结合系统设计要求及当前最新的USB.OTG协议和未来USB的发展趋势,本文采用第三种方案,即单片机+USB主机控制器芯片的方案。

第四章系统的硬件实现

一个独立的单片机系统的设计,需要从电路搭建到软件规划的点滴做起,每一部分电路的设计都很有可能直接影响到软件的程序设计。硬件是整个系统的基础,软件是硬件功能的体现,二者相辅相成。本章将要涉及到方案的选择和由选择决定的系统模块规划,然后会详细讲解基于USB主机的USB.RS232/485接口转换器的基础一一硬件设计。

4.1PC机上的USB主机系统结构

USB主机系统总体分为硬件和软件两部分。硬件主要完成物理上的接口和实体功能;软件则管理硬件,实现数据传输和各项功能。根据PC体系上的USB主机系统和USB主机协议,总结得出USB主机系统都可以分为3个层次:USB总线接口、USB系统层和USB用户层。其结构图如图4-1所示:

图4.1USB主机系统结构

USB总线接口层(USBBusInterface)主要是指以主机控制器为核心的硬件部分,一般是由USB主控制器芯片,USBHUB控制器芯片,USB端口连接硬件及控制器外围电路等组成。USB主控制器芯片提供USB的收发物理层,实现USB电缆上差模信号与数字信号的转换并提供端点的物理存储机制,还能根据USB的传输机制,自动管理各个端点存储自和数据交换。此外,USB主控制器还需提供与外围控制CPU的接口电路,通过并行或串行的方式连接到CPU的总线上,从而建立与CPU的通信。在基于PC的系统中,USB主控制器是通过PCI总线和CPU进行通信的。一般的USB主控制芯片本身就集成了根HUB,并直接以D+和D.两根引脚的方式提供端口连接点。

USB系统层(USBSystem)是USB主机软件。USB核心驱动程序和USB主控制器功能驱动程序组成。USB核心驱动程序,是整个软件体系的核心部分,也起到了一个中间桥梁的作用,在PC中,它被捆绑到操作系统中,解释USB设备类驱动程序发来的命令并将其划分为一系列的USB事务,然后发送给USB主机控制器以驱动程序。这里,USB核心驱动程序不与USB主控制器硬件直接打交道,而是通过USB主机控制驱动程序这个媒介来与USB主控制器硬件进行通信。USB主控制器驱动程序就负责最底层的驱动任务,控制和管理硬件底层,负责将USB事务发送给USB主控制器芯片,并将串行数据发送到电缆上。

USB用户层(USBUser)也是基于软件层次的USB主机的组成部分,包括USB

设备类驱动程序和用户软件(用户软件是可选的)。

综合以上,整个USB的驱动程序分为三个层次,分别是USB设备类驱动程序,USB核心驱动程序和USB主控制器功能驱动程序。USB设备类驱动程序,也叫做用户驱动程序,它把用户要求的USB命令发送给USB的主控制器硬件,同时初始化内存缓冲区,用于存储所有USB通信中的数据。每一种USB类设备都需要设计相应的设备类驱动程序。目前,Windows操作系统对于HID类和MassStorage类设备的支持比较完备,直接提供了设备类驱动程序。而对大部分的USB设备类,用户厂商还需自己开发类驱动程序。

4.2USB转串口硬件设备的设计

①AVR-CDC转换器的设计

AVR单片机是高性能的8位RISC架构的AVR单片机,使用单片机的IO口来模拟USB的通信端口,由软件来实现USB通信协议,将普通的AVR单片机模拟成一个USB低速设备,从而实现AVR单片机与计算机之间的通信和控制,这就是AVRUSB技术,因为低速USB设备的速度是1.5M位/秒,而AVR单片机是单指令周期的,在单片机使用12MHz的时钟频率时,正好是1.5MHz的8倍。也就是说,单片机每8条指令就精确完成一个数据位的采集。采用这种方法时,只要严格控制单片机的时序,实现USB是有可能的。

AVRCDC技术的基本原理就是利用AVR单片机端口来模拟USB的硬件端口进行通信实USB接口后,再与AVR单片机自带的串口相结合,即可实现USB转串口的通信。

②采用51单片机+PDUSBD12组成的USB系统

PDIUSBD12芯片是荷兰菲利普(Philips)半导体公司生产的通用USB接口芯片,它支持通用串行总线(USB)1.1规范,具有软连接(softconnect)功能和数据流指示灯(goodlink);它使用8位并行的数据口与MCU连接,数字引脚兼容5V逻辑电平,内置3.3V稳压器,可使用3.3V、5V供电,外部使用6MHz的晶振作为时钟源。D12除了端点0,还有两个额外的端点,每个端点都具有输入和输出端点,端点0和端点1支持的最大包长为16字节;端点2普通模式下支持最大包长64字节,端点2还支持等传输模式;单向时支持最大包长128字节,双向时支持最大包长为64字节。

STC89C52是一款高性价比的单片机,其功能强大,易于的开发环境KeilC51且该单片机内部自带有一个串口,因此用STC89C52和PDIUSBD12两芯片相结合,在硬件上是完全有可能实现USB转串口的。

本课题的研究重点在于驱动程序的开发,因此在硬件电路的设计上,作者最终选定一种基于51单片机+PDIUSBD12的硬件电路系统,AVRCDC的方案虽然具有成本低廉,硬件电路简单等优势,但是由于USB协议规定的操作时序要求非常高,核心的代码须用汇编语言来编写,开发难度相对较大,因此不采用该方案。

而PDIUSBD12是一款专业的USB控制芯片、STC89C52单片机可以很灵活地实现对其的读写控制,开板难度相对较低。由于本题的重点应放在驱动程序的开发,设备端的硬件部分就选用此相对简单的方案。

4.3USB转串口设备硬件电路的设计

选定USB通信芯片与单片机后,接下来就是把芯片连接成电路,参照PDIUSBD12的使用手册,可能很方便地将其与89C52连接起来,数据口D0—D7接到单片机的P0口,中断请求引脚接到单片机的INT0,WR和RD相应地接到单片机的WR和RD引脚,数据命令区分引脚A0接到单片机的P3.2上,另外,ALE、CS_N、SUSPEND接地,RESET、EOT_N、DMACK接到高电平,X1、X2连接6M的晶体,D+、D-分别接到USB接口的3,2脚(连到电脑);

89C52单片机自带一串口,不过是TTL电平的,而计算机上的串口为CMOS电平,因此需要接上MAX232,将其转化为CMOS电平。串口传输需要速率较快,整个系统要求工作地时钟频率较高,因而采用22.1184MHz的晶振,另外为了加快数据传输的速度,避免数据丢失,本课题应使用D12的端点2作为批量传输,使其缓冲区有64字节,并且有双缓冲机制。

系统的电路图如下:

图4.2USB转串口原理图

RS-485转换接口模块采用MAXIM公司生产的一种差分平衡型收发器芯片MAX487,MAX487的RO接RS232的TXD引脚,DI接RS232的RXD引脚;/RE和DE管脚同时接到TNOW引脚,用来控制接收器和驱动器的输出使能。A,B管脚分别接上上拉电阻和下拉电阻。如下图所示:

图4.3MAX485电平转换电路

第五章系统的软件设计

5.1USB转串口设备端的程序设计

硬件电路设计好了,接下来要想使电路运行起来,在此电路中,首先要通过单片机实现对PDIUSBD12芯片的控制,即是该芯片的驱动程序,还有就是单片机串的的驱动,在此基础上才能构造出USB通信的框架来。

一般来说,要实现USB转串口,有两种可行的方法:一种是使用USB协议规定的CDC类中的抽象模型(abstractcontrolmodel)子类中的通用AT命令(commonATcommands)协议,此方式不需要用户开发驱动程序;另一种是使用用户自定义的USB设备,然后开发其驱动程序,由驱动程序生成串口,开发驱动程序比较复杂,但是应用灵活。对于设备端来说,两种方式的通信流程是类似的,两者最主要的区别在为描述符的不同。这可以通过STC89C52单片机程序控制来实现,其程序流程图如下:

图5.1设备端程序流程图

设备初始化部分,程序要完成以下的工作:串口初始化、读D12的ID号并进行检验,然后用软件的方式分别断开、连上USB连接,并将配置值初始化为0。

D12中断的处理方法:读中断寄存器和第一个字节,然后判断相应的位状态,执行相应的中断处理函数,它们分别是:总线挂起中断处理、总线复位中断处理、端点0输出中断处理、端点0输入中断处理、端点2输出中断处理、端点2输入中断处理。

D12与PC的通信,是通过D12的端点0来实现,主机将请求信息发送到端点0,D12把设备描述符、配置描述符、接口描述符、功能描述符、端点描述符字符串描述符等信息通过端点0发送到主机。

(1)USB-CDC类设备的描述符如下:

设备描述符(18字节)

0x12,0x01,0x10,0x01,0x02,0x00,0x00,0x10,0x99,

0x99,0x99,0x99,0x00,0x01,0x01,0x020x03,0x01

以下是配置描述符集合()

配置描述符(9字节)

0x09,0x02,0x43,0x00,0x02,0x01,0x00,0x80,0x32

CDC类接口描述符(9字节)

0x09,0x04,0x00,0x00,0x01,0x02,0x02,0x01,0x00,

功能描述符(19字节)

HeaderFunctionalDescriptor

0x05,0x24,0x00,0x10,0x01

CallManagementFunctionalDescriptor

0x05,0x24,0x01,0x00,0x00

AbstractControlManagementFunctionalDescriptor

0x04,0x24,0x02,0x02

UnionFunctionalDescriptor

0x05,0x24,0x06,0x00,0x01

接口0的端点描述符(7字节)

0x07,0x05,0x81,0x03,0x10,0x00,0x0A

接口1(数据接口)的接口描述符(9字节)

0x09,0x04,0x01,0x00,0x02,0x0A,0x00,0x00,0x00

批量输入端点2描述符(7字节)

0x07,0x05,0x82,0x02,0x40,0x00,0x00

批量输出端点2描述符(7字节)

0x07,0x05,0x02,0x02,0x40,0x00,0x00

另外,语言描述符是可选的,对程序运行无重大影响,此处略去。

配置好设备的描述符后,主机应该可以成功地识别该设备了,但USB转串口设备还不能算完成。还需要实现对端点的数据处理:首选要实再对SET_CONTROL_LINE_STATESET_LINE_CONING和GET_LINE_CONING请求的处理,另外,要实现对串口数据的处理,即将串口接收到的数据发送到端点2,将端点2接收到的数据发送到串口,数据代码如下:

if(ConfigValue!=0)

{

if(Ep2InIsBusy==0)//判断端点2是否空闲

SendUartDataToEp2();//调用函数将缓冲区数据发送到端点2

if(UsbEp2ByteCount!=0)

//端点2接收缓冲区中还有数据未发送,则发送到串口

{

//发送一字节到串口

UartPutChar(UsbEp2Buffer[UsbEp2BufferOutputPoint]);

UsbEp2BufferOutputPoint++;//发送位置后移1

UsbEp2ByteCount--;//计数值减1

}

}

至此,USB转串口设备算是基本完成了,将程序烧到单片机中运行,并在主机端装上驱动程序后(Windows操作系统自带有USB-CDC类驱动,用户无需开发,只需提供一个安装驱动用的INF文件),即可产生一个虚拟串口了,应用程序(如串口调试助手SSCOM)就可像使用普通串口一样使用此USB转串口设备了。

(2)自定义USB类设备的描述符如下:

设备描述符(18字节)

0x12,0x01,0x10,0x01,0xFF,0x00,0x00,0x10,0x99,

0x99,0x99,0x99,0x00,0x01,0x01,0x02,0x03,0x01

配置描述符集合(32字节)

配置描述符(9字节)

0x09,0x02,sizeof(ConfigurationDescriptor)&0xFF,

(sizeof(ConfigurationDescriptor)>>8)&0xFF,

0x01,0x01,0x00,0x80,0x32,

接口描述符(9字节)

0x09,0x04,0x00,0x00,0x02,0x00,0x00,0x00,0x00

批量输入端点2描述符(7字节)

0x07,0x05,0x82,0x02,0x40,0x00,0x00

批量输出端点2描述符(7字节)

0x07,0x05,0x02,0x02,0x40,0x00,0x00

语言描述符此处略去。

5.2驱动程序开发环境—WinDDK的使用

WDM(WindowsDriverModel)是Microsoft提出的一种全新的设备驱动程序模型。它是在WindowsNT内核驱动模型(Kernel-modelDriverModel)的基础上发展起来的,增加了对即插即用(PnP)、高级电源管理(PowerManagement)、Windows管理接口(WMI)的支持,更重要的是,WDM是一种通用的驱动模式,提供了包括USB、IEEE1394、和HID等在内的一系列驱动程序类。在Windows98和Windows2000/XP中,WDM驱动程序均可正常使用。

WDM技术通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性,它支持USB、IEEE1394、ACPI等全新的硬件标准。WDM引入功能设备对象FDO(FunctionalDeviceObject)与物理设备对象PDO(PhysicalDeviceObject)两个新类来描述硬件。一个真实硬件对应一个且只能有一个PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO与FDO。在用户态和内核态通信方面,系统将每一个用户请求打包形成一个IRP结构,然后发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪一个设备的。在驱动程序的加载方面,WDM不通过驱动程序名称识别,而是通过一个128位的全局唯一标识符GUID来实现驱动程序的识别。

一个完整的WDM驱动程序要完成以下工作:初始化设备:创建与删除设备(包括可热插拔设备的加入和删除事件):处理应用层程序的打开和关闭句柄的请求;处理应用层程序的输入/输出请求;串行化(获可称为排队)对设备硬件的访问:调用其他驱动程序;取消I/O请求:超时I/O请求;实现电源管理和WMI(WindowsManagementInstrumentation,即Windows管理诊断)。

5.3USB驱动程序、虚拟串口的实现方法

DDK已经为USB驱动开发人员提供了功能强大的USB物理总线驱动(PDO),程序员需要做的事情是完成功能驱动(FDO)的开发,驱动开发人员不需要了解USB如何将请求转化成数据包等细节,程序员只需要指定何种管道,发送何种数据即可。

当功能驱动想向某个管道发出读写请求时,首先构造请求发给USB总线驱动。这种是标准的USB请求,被称为URB(USBRequestBlock),即USB请求块。这种URB被发送到USB物理总线驱动以后,被USB总线驱动所解释,进而转化成请求发往USBHOST驱动或者USBHUB驱动。

USB驱动在与USB设备通信的时候,如在控制管理中获取设备描述符、配置描述符、端点描述符,或者在Bulk管道中获取大量数据,都是通过创建USB请求包(URB)来完成的。URB中填充需要对USB的请求,然后将URB作为IRP的一个参数传递给底层的USB总线驱动。在USB总线驱动中,能够解释不同的URB,并将其转化为USB总线上的相应的数据包。

DDK提供了构造URB的内核函数UsbBuildGetDescritorRequest,在功能驱动中,所有与USB的通信,都需要用这个函数创建URB,并通过IRP发送到底层USB总线驱动,其声明如下:

VOIDUsbBuildGetDescritorRequest(

INOUTPURBUrb,

INUSHORTLength,

INUCHARDescriptorType,

INUCHARIndex,

INUSHORTLanguageId,

INPVOIDTransferBufferOPTIONAL,

INPMDLTransferBufferMDLOPTIONAL,

INULONGTransferBufferLength,

INPURBLinkOPTIONAL

);

URB:用来输出的URB结构的指针。

Length:用来描述该URB结构的大小。

DescriptorType:描述该URB的类型。它可以是USB_DEVICE_DESCRIPTOR_TYPE、USB_CONFIGURATION_DESCRIPTOR_TYPE和USB_STRING_DESCRIPTOR_TYPE。

Index:用来描述设备描述符的索引。

LanguageId:用来描述语言ID。

TransferBuffer:如果用缓冲区读取设备,TransferBuffer是缓冲区内存的指针。

TransferBufferMDL:如果用直接读取内存时,TransferBufferMDL是直接读取内存时MDL的指针。

TransferBufferLength:对于该URB所操作内存的大小。

功能驱动将URB包构造完毕后,就可以发送到底层总线驱动上了,URB包要和一个IRP相关联起来,这就需要用IoBuildDeviceControlRequest创建一个IO控制码的IRP,然后将URB作为IRP的参数,用IoCallDriver将URB发送到底层总线驱动上。

与一般的驱动类似,USB驱动的初始化入口函数为DriverEntry,在该函数中,分别指定各个IRP的派遣函数地址、指定AddDevice例程函数地址、指定Unload例程函数地址等。

在AddDevice例程中,创建功能设备对像,然后将该对象挂载在总线设备对像之上,从而形成设备栈。另外为设备创建一个设备链接,以便于应用程序可以找到这个设备。

插拔USB设备时会与4个IRP相关,即IRP_MN_START_DEVICE、IRP_MN_STOP_DEVICE、IRP_MN_EJECT、IRP_MN_SURPRISE_REMOVAL。其中,IRP_MN_START_DEVICE消息是当驱动争取加载并运行时,操作系统的PnP管理器会将这个IRP发往设备驱动。当获得这个IRP后,USB驱动需要获得USB设备类别描述符,如设备描述符、配置描述符、接口描述符、端点描述符等。并通过这些描述符有用的信息,记录在设备扩展中。

IRP_MN_STOP_DEVICE是设备关闭前,PnP管理器发出的IRP。USB驱动获得这个IRP时,应该尽快结束当前执行的IRP,并将其逐个取消掉。另外,在设备扩展中还应该有表示当前状态的变量,当IRP_MN_STOP_DEVICE来临时,将当前状态记录成停止状态。IRP_MN_EJECT是设备被正常弹出,而IRP_MN_SURPRISE_REMOVAL则是设备非自然弹出,有可能是意外掉电或者强行拔出等。在这种IRP到来的时候,应该强迫所有未完成的读写IRP结束并取消,并且将当前设备状态设置成设备被拔掉。

USB设备大部分数据的传送是通过Bulk管道来传输的,Bulk管理的读取是在IRP_MJ_READ各IRP_MJ_WRITE的派遣函数中,应用程序可以通过ReadFile、WriteFile等API对设备进行操作。

在IRP_MJ_READ各IRP_MJ_WRITE的派遣例程中设置了完成例程,如图5-2所示,其原理是将读写的大小分成单位为BULKUSB_MAX_TRANSFER_SIZE的若干块,依次将请求发往底层USB总线驱动。

图5.2USB总线驱动

虚拟串口就是当本地并没有对应的串口硬件设备,而为应用层提供串口设备一样的系统调用接口,以兼容原本使用本地串口的应用软件的“虚”设备。本文作者给出了一种在Windows平台上实现虚拟串口的方法,由此实现的“串口”具有真实串口完全相同的系统调用接口。

DDK对串口驱动提供了专门接口。只要编写的驱动满足这些接口,并按照串口标准的命名方法,不管是真实的还是虚拟的串口设备,Windows操作系统都会认为这个设备是一个标准的串口设备。用标准的串口调试工具都可以与这个设备进行通信。

串口驱动的入口函数依然是DriverEntry,并在其中指定各种IRP的派遣函数、AddDevice例程、Unload例程等。其中在AddDevice例程中,需要创建设备对像,创建完设备对象之后,需要将设备对象指定一个符号链接,以便客户程序(串口调试工具)能够识别,该符号以COM开头,并接一个数字就可以了。

编写串口驱动的核心是对应用程序发出的IO控制码和读写命令(即接口)进行处理。这些控制码分别是:

(1)、IOCTL_SERIAL_SET_QUEUE_SIZE

这个控制码是应用程序向驱动请求设置串口驱动内部的缓冲区大小,它是向驱动传递SERIAL_QUEUE_SIZE数据结构来进行设置的。对于虚拟串口驱动来说,这是不需要关心的。

(2)、IOCTL_SERIAL_GET_BAUD_RATE

应用程序向驱动程序IOCTL_SERIAL_GET_BAUD_RATE命令,这主要是询问驱动这个设备的波特率。驱动应该回应给应用程序SERIAL_BAUD_RATE的数据结构来通知波特率的数值。

(3)、IOCTL_SERIAL_GET_LINE_CONTROL

应用程序向驱动程序IOCTL_SERIAL_GET_LINE_CONTROL命令,这要是为了返回串口的行控制信息,行控制信息用SERIAL_LINE_CONTROL数据结构表示

typedefstruct_SERIAL_LINE_CONTROL{

UCHARStopBits;

UCHARParity;

UCHARWordLength;

}SERIAL_LINE_CONTROL,*PSERIAL_LINE_CONTROL;

(4)、IOCTL_SERIAL_GET_CHARS

这个命令是应用程序向驱动请求特殊字符,用来与控制信号握手,用数据结构SERIAL_CHARS表示

Typedefstruct_SERIAL_CHARS{

UCHAREofChar;

UCHARErrorChar;

UCHARBreakChar;

UCHAREventChar;

UCHARXonChar;

UCHARXoffChar;

}SERIAL_CHARS,*PSERIAL_CHARS;

其中EofChar代表是否是传送结束、ErrorChar代表是否传送中有错误、BreakChar代表是否传送有停止等。

(5)、IOCTL_SERIAL_GET_HANDFLOW

这个命令是负责向驱动程序获得串口驱动的握手信号,握手信号用SERIAL_HANDFLOW数据结构表示。

Typedefstruct_SERIAL_HANDFLOW{

ULONGControlHandShake;

ULONGFlowReplace;

ULONGXonLimit;

ULONGXoffLimit;

}SERIAL_HANDFLOW,*PSERIAL_HANDFLOW;

(6)、IOCTL_SERIAL_SET_WAIT_MASK

这个命令主要是设置串口驱动的某些事件发生时,需要向应用程序通知。这些事件包括以下几种事件:

#defineSERIAL_EV_RXCHAR0x0001

#defineSERIAL_EV_RXFLAG0x0002

#defineSERIAL_EV_TXEMPTY0x0004

#defineSERIAL_EV_CTS0x0008

#defineSERIAL_EV_DSR0x0010

#defineSERIAL_EV_RLSD0x0020

#defineSERIAL_EV_BREAK0x0040

#defineSERIAL_EV_ERR0x0080

#defineSERIAL_EV_RING0x0100

#defineSERIAL_EV_PERR0x0200

#defineSERIAL_EV_RX80FULL0x0400

#defineSERIAL_EV_EVENT10x0800

#defineSERIAL_EV_EVENT20x1000

(7)、IOCTL_SERIAL_WAIT_ON_MASK

这个IO控制码是最重要的一个,当应用程序通过前面几个IO控制码初始化好后,就会发送这个请求。在驱动程序中,应该阻塞在那里返回PENDING状态,而不是完成这个IRP。当IOCTL_SERIAL_WAIT_ON_MASK设置的事件中的一项发生时,阻塞状态改为完成,并通知应用程序究竟是哪种事件发生了。

串口驱动程序完成处理IO控制码之后,接下来就是对读写IRP进行处理了,对于写IRP的派遣函数中,主要写的数据存储在设备扩展中,以便以后读的时候将这些内容返回应用程序,另个使阻塞的IO控制苏醒过来,调用DriverCheckEvents函数阻塞IRP完成,使应用程序的线程得以继续运行。并且这个线程还知道了SERIAL_EV_RXCHAR和SERIAL_EV_RX80FULL事件的到来,从而发起一个读请求,传送到驱动程序中就是读IRP。在读IRP派遣函数中,负责将存储在设备扩展中的数据通过IRP传送到应用程序。

5.4使用DDK设计USB转串口驱动程序

5.4.1USB转串口的驱动程序基本框架

与一般的应用程序流程类似,USB转串口的驱动程序流程也可分为初始化、数据处理、判断是结束设备等部分。驱动程序流程图如下图所示:

图5.3驱动程序流程图

系统初始化:此部分主要DriverEntry函数来处理。DriverEntry是驱动程序的入口点,该函数由I/O系统直接调用。

在函数中获取设备的注册表信息、并对以下的IRP指定相应的派遣函数:

DriverObject->MajorFunction[IRP_MJ_CREATE]=USB2COM_Create;

DriverObject->MajorFunction[IRP_MJ_CLOSE]=USB2COM_Close;

DriverObject->DriverUnload=USB2COM_Unload;

//用户模式DeviceIoControl()调用此例程

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=USB2COM_ProcessIOCTL;

//用户模式ReadFile()/WriteFile()调用此例程

DriverObject->MajorFunction[IRP_MJ_WRITE]=USB2COM_Write;

DriverObject->MajorFunction[IRP_MJ_READ]=USB2COM_Read;

//系统PNP与电源管理请求处理例程

DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL]=USB2COM_ProcessSysControlIrp;

DriverObject->MajorFunction[IRP_MJ_PNP]=USB2COM_ProcessPnPIrp;

DriverObject->MajorFunction[IRP_MJ_POWER]=USB2COM_ProcessPowerIrp;

指定IRP派遣函数后,接下来AddDevice例程创建设备对象

//当设备插入时会调用此例程

DriverObject->DriverExtension->AddDevice=

USB2COM_PnPAddDevice;

对USB设备而言,首先要检查设备是否已启用,如有必要复位设备所在的端口。使用IOCTL_INTERNAL_USB_GET_PORT_STATUS和IOCTL_INTERNAL_USB_RESET_PORT来构造IRP,并将NextIrpStack->Parameters.Others.Argument1置为NULL,进而调用IoCallDriver发送。

接下来要用合适的接口描述符配置设备和初始化管道:使用函数UsbBuildGetDescriptorRequest构造获取配置描述符的URB,并发送,这一步完成后,将获得设备配置描述符;用函数USBD_PraseConfigurationDescriptorEx在获得的配置描述符中查找满足条件的接口描述符,并用它们填充USBD_INTERFACE_LIST_ENTRY类型的数组,即接口描述符列表;再将接口描述符列表作为参数,调用函数USBD_CreateConfigurationRequestEx构造配置设备接口的URB,并发送,完成设备接口的配置。至此,初始化工作完成。

5.4.1makefile文件与source文件

Makefile文件指定文件之间的相互依赖关系,确定项目中哪些文件需要重新编译。在DDK程序进行编译时,build工具会调用nmake工具去解析makefile文件进行编译。大多数情况下,makefile文件只需写入如下内容即可:

!INCLUDE$(NTMAKEENV)\makefile.def

以上语句的含义是包含了DDK目录中的makefile.def

用DDK编译环境编译驱动程序还需要编写一个编译脚本文件source,在这个脚本中描述了DDK驱动程序的源文件、用到的lib文件和include路径名、编译输出的目录和文件名等信息,本项目的source文件内容如下:

TARGETNAME=usb2rs232

TARGETTYPE=DRIVER

DRIVERTYPE=WDM

TARGETPATH=obj

TARGETLIBS=$(DDK_LIB_PATH)\usbd.lib

USE_MAPSYM=1

USER_C_FLAGS=/FAcs

SOURCES=\

usb2com.rc\

dbg.c\

usb.c\

pnp.c\

power.c\

ioctl.c\

rw.c\

serial.c\

buf.c\

waitmask.c\

purge.c

TARGETNAME:描述目标驱动程序的名称。

TARGETTYPE:描述目标代码生成的类别。TARGETTYPE=DRIVER意味着是生成驱动,如果TARGETTYPE=PROGRAM,则编译成Win32程序。

TARGETPATH:指示目标代码生成的路径。

TARGETLIBS:设置目标代码所需要的库。

SOURCES:指定此工程所有的源文件,只指定C文件或者C++文件,不需指定H文件。

5.4.3修改安装驱动用的inf文件

安装驱动时,要指定INF文件,该文件中应包含了安装驱动时匹配的硬件ID号、需要增加的设备类、设备名等信息。一般来说,INF文件可以从网上下载,然后修改相应部分即可:

在[version]节,Class类为端号,GUID为端口类的GUID。

r_2 p_4'>ClassGuTankUSBtoRS232PORT."

Pro.Disk="USBtoCOMInstalltionDiskette"

DeviceDesc="USBtoCOMPort"

Serial.SVCDESC="USB->COMVirtualComPortdriver"

安装好设备驱动后,在电脑上就可以访问此虚拟的串口设备了,如用串口调试助手,如同操作普通串口一样,打开COM4然后进行数据的传送。

第六章结束语

通过本课题,我深深的体会到USB功能的强大和开发的难度。但众多优良的性能特点将会使它在今后的外围串行通信接口的发展中占有举足轻重的地位。因此在工业和消费电子领域,USB总线还有着广泛的应用。

由于RS232接口速率的天然限制,本文所研究的系统基本上没有发挥出USB接口高速通信的特点。因此可以在本文所研究的基础上增加其他的接口模块,增加RS485接口,实现USB到RS485的双向数据通信;或者在本系统的基础上增加CAN总线控制器,实现USB到CAN的双向数据通信。因此,研究USB协议,实现USB主机是开发USB的关键技术,而USB到各种接口的转换将是当前的研究热点。

第七章致谢

本论文是在恩师刘瑞琪教授的悉心指导下完成的。刘瑞琪老师以其广博的学识,谆谆的教诲和精益求精的精神,给予我莫大的启迪和促进,能够跟随刘老师从事科学研究,是我人生中一笔丰富的财富,在此谨向刘瑞琪老师表示深深的感谢和衷心的祝福。

同时也向这两个月给予热心帮助、关心和指导的蔡启仲老师和其他各位关心、帮助我的老师和同学表示衷心的感谢。

在我整个学习、研究过程中得到了宋海和刘胜捷同学给予的无私的帮助,和他们的交流讨论也极大的拓宽了我的知识面,在此向他们表示真诚的谢意。最后,感谢我的亲人对我四年来在学业、生活上给予的关切和帮助,使我顺利完成学业。

参考文献

[1]张宏.USB接口设计.电子科技大学出版社,2002:1~2

[2]马伟,邵贝贝.OTG补充协议开辟USB应用的新篇章.电子产品世界,2002,6(A):68-69

[3]RodgerRichey.USB的设计要素.今日电子,2008,11:42~44

[4]邵贝贝,马伟.开发“嵌入式主机”扩展移动数据存储和交换的应用领域.今日电子,2003,(2):33~34

[5]李肇庆,廖峰,刘建存.USB接口技术.国防工业出版社,2004

[6]曹国飞.嵌入式USB主机接111的设计:(硕士学位论文)哈尔滨.哈尔滨理工大学2006:1~10

[7]JanAxelson.UniversalSerialBusComplete.USA:LakeviewResearch,1999

[8]张建华.USB主机MassStorage类的实现.交通科技与经济,2006,4:70-71

[9]萧踞雄,翁铁成,宋中庆.USB技术及应用设计.清华大学出版社,2003

[10]胡晓军,张爱成.USB接口开发技术.西安电子科技大学出版社,2005

[11]萧世文.USB2.0硬件设计.清华大学出版社.2002:25~37

[12]WarrenWebb.EmbeddedUSBHost.ECN,2003,47(9):31

[13]许永和.USB外围设备设计与应用.中国电力出版社,2002

[14]DonAnderson.USB系统体系.中国电力出版社,2001

[15]马伟.计算机USB系统原理及其主/从机设计.北京航空航天大学出版社,2004

[16]李肇庆,韩涛.串行端口技术.国防工业出版社,2004

[17]司徒振念,姜雪莲.嵌入式USB主控技术.机械工程技术2006,35(6):107~108

[18]温晶晶.嵌入式USB主机的相关设计.机械工程与自动化,2006,10(5):98~100

[19]李宇.嵌入式USB主机系统.武汉科技学院学报,2005,11(18):11

[20]MemMaster-USBHost解决方案技术白皮书.北京先锋博创科技发展有限公司.2002

[21]胡建平,李雪红,戴华林.USB/RS232转换器的实现.天津城市建设学院学报2004,

3(10):72~75

[22]陈心浩.RS232/USB转换器的设计.电子技术,2003,10:47~49

[23]河源,顾金良.USB与RS232接口转换器的设计.智慧控制与仿真,2006,10(28):5

[24]CH375中文手册(一).南京沁恒电子有限公司,http://wch.cn

[25]CH375中文手册(二).南京沁恒电子有限公司,http://wch.cn

[26]FlashFlex51MCUDatasheet.SiliconStorageTechnology,Ine,2005

[27]SST单片机中文教程.深圳好记芯电子有限公司,http://www.superflash.ell

[28]C51Userl,广州周立功单片机发展有限公司.

[29]LM7805DataSheet.NationalSemiconductorCorporation.1999

[30]WS62256DataSheet.WingShingComputerComponentsCo.,(H.K.)Ltd

65

。

猜你喜欢

最安全有效的减肥药

最安全有效的减肥药

编辑:小徐

现在的减肥药真的是真假难分,在选择减肥药的同时也应该更加小心,减肥药多种多样,那么如何才能选择最安全有效的减肥药,也成了很多小仙女的内心疑问,下面就跟着www.hao123.com宽屏小编一起看一下,如何选择最安全有效的减肥药。 最安全有效的减肥药选购方法 1、首先需要观察产品的外包装,在包装中可以看到其配方是不是含有激素,含有激素的减肥药对身体的内..

吃减肥药失眠

吃减肥药失眠

编辑:小徐

随着现在流行以瘦为美,很多人会不顾身体的健康选择减肥药,达到快速减肥瘦身的效果,但是很多减肥药都是有副作用的,副作用比较轻的就是失眠现象,那么吃减肥药出现失眠是怎么回事儿?如果出现失眠后,我们应该怎样缓解? 吃减肥药失眠是怎么回事 减肥药中富含安非他命,所以减肥药服用了太多会有失眠现象,服用减肥药期间,身体会逐渐出现抗药性,身..

最新文章