将串行应用移植到USB接口的简便方法.doc

上传人:M****1 文档编号:563933375 上传时间:2023-07-09 格式:DOC 页数:9 大小:93.01KB
返回 下载 相关 举报
将串行应用移植到USB接口的简便方法.doc_第1页
第1页 / 共9页
将串行应用移植到USB接口的简便方法.doc_第2页
第2页 / 共9页
将串行应用移植到USB接口的简便方法.doc_第3页
第3页 / 共9页
将串行应用移植到USB接口的简便方法.doc_第4页
第4页 / 共9页
将串行应用移植到USB接口的简便方法.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《将串行应用移植到USB接口的简便方法.doc》由会员分享,可在线阅读,更多相关《将串行应用移植到USB接口的简便方法.doc(9页珍藏版)》请在金锄头文库上搜索。

1、将串行应用移植到USB接口的简便方法作者:Microchip Technology Inc. Lucio Di Jasio 时间:2008-04-02来源:电子产品世界 浏览评论您是否注意过最新款笔记本电脑的端口? 如果注意过,那么就会发现过去的真实COM端口没有了。 事实上,最有可能的是原来串口所在位置现在是几个USB端口。 USB总线的设计初衷就是要取代PC机上大多数(如果不是所有的话)传统端口。 当然,由于有很多支持USB的单片机和接口器件,因此对于嵌入式设计人员来说,没有COM端口并不会带来障碍。 只要选择正确的工具和软件解决方案,那么转移到USB可以是非常简单的事情。硬件补丁解决方案

2、对那些需要为基于串行端口的老项目提出快速解决方案的设计工程师来说,开始最有吸引力的一种策略是采用一种补丁系统。 这可通过在嵌入式控制器串行接口与PC机USB连接器之间增加一个专用USB-UART转换器来实现。 此类器件通常配有支持各种操作系统的定制驱动程序,可以完全仿真一个标准的串行端口。 这种方法需要重新设计嵌入式应用电路板以腾出空间容纳新的元件,但它不用改变固件和PC应用程序。 拆除了已证明无用的串行端口接收器,而增加的成本只有几美元。两者基本可以抵消,但这样做却失去了采用USB所带来的大部分好处。 事实上,USB能够支持更快的数据传输速度,可达到典型串行端口的100倍(12 Mbps与1

3、15 kbps),继续使用UART,实际上会成为设计的主要瓶颈。 此外,由于大部分USB-UART接口器件缺乏灵活性,无法实现灵活的电源管理,而这在许多嵌入式设计中是一个关键特性。单芯片解决方案从串行端口转移到USB,更好的硬件选择是采用单芯片解决方案,即选用具有USB接口的单片机,并开发驱动程序(图2)来模仿串行端口。 从硬件角度来看,单芯片解决方案显得非常有吸引力:与通用型号相比,带有USB接口的单片机几乎不需要增加额外成本。由于拆除了串行端口接收器,电路板上元件的数量相应减少,同时在低成本USB连接器与新型兼容USB的单片机的D+/D-引脚间建立直接连接。当通用单片机和兼容USB的单片机

4、引脚互相兼容时,电路板重新设计的成本和工作量可以减小到最低。此外,不必再为那些可以使用USB总线5V电源的应用配备电源适配器,从而可以进一步降低成本。软件界面一旦选择了单芯片解决方案,我们就需要为应用开发新的PC驱动程序,甚至可能是新的固件。 幸运的是,软件开发人员有多种选择,可通过重复使用应用界面类的方法来减小开发工作量。构建到现在PC操作系统中的最常见并获得最好支持的USB接口类可能是所谓的人机接口设备(通常指HID类)。 所有的PC计算机都需要一些像键盘或鼠标这样的人机接口,这些设备的连接已经从串行或者PS/2端口升级进USB。 其驱动程序已经捆绑在Windows、Linux和MAC O

5、S的每个拷贝中,所以所有操作系统都可以很好地支持HID。因此,对于那些想从不太复杂的嵌入式设备中读写少量数据的设计工程师而言,HID是一个非常有吸引力的选择。 不幸的是,应用编程接口(API)没有什么与COM端口接口类似。 因此,将API移植到现有系统上更成问题,特别当PC上已经有一个复杂的应用软件的时候。其它像打印机类和海量存储这样的标准USB接口类都可以利用来实现与嵌入式设备进行通讯。 然而,它们也面临同样的问题,即陌生的接口以及必须开发新PC应用软件。驱动程序开发需要对操作系统底层有深入的了解。 对Windows PC机来说,这意味着要熟悉Windows驱动程序模型(WDM)。 如果没有

6、这方面的专业知识,那么开发一个可基本工作的驱动程序原型也需要花费数月时间。幸运的是,大部分最新版本Windows都有的一个接口类可以帮助我们摆脱困境。 微软公司原先开发这个名为USB通讯设备类(CDC)的目的是用来支持调制解调器应用。 例如,开发人员可以获得CDC接口的完整源代码,以进行面向PIC18F4550系列闪存USB 8位单片机的开发。Microchip公司的CDC接口提供以下有用特性:固件库的代码量相对较小,仅3KB;单芯片解决方案;仅占用大约50B的存储器空间(不包括缓冲区);最大吞吐量为每秒80 K字节;完全由USB协议控制数据流量(不需要RS-232 XON/XOFF和硬件流控

7、)。便捷的固件移植在下面的讨论中,我们假设原先的串行端口代码是用C语言编写的,并且使用了可访问集成UART外设的公共C语言库。 给定这些条件后,将固件移植到CDC需要进行如下的修改:在主文件头部,用相应的USB声明代替针对串行端口的#include声明;在主函数中,增加对USB-CDC初始化代码的调用;在主函数中,增加对USB后台任务的调用;验证应用程序代码,以实现与USB后台任务的协同多任务处理;最后,为链接器提供USB-CDC专用库,生成最终的可执行代码,然后对闪存芯片进行编程。实际上,上述这种情况要求应用所调用的任何功能都不能包含阻塞循环。 也就是说,任何功能都不能占用100%的处理器时

8、间,也不能妨碍USB后台任务的执行。 反过来,所有USB专用控制函数、中断、标志和缓冲机制都由CDC类固件后台任务管理,设计工程师无需关注其实现细节。 设计工程师所看到的只是一个非常类似于公共串行端口库的小函数集。表1给出了部分函数例子。大多数读者立即就可认出这些函数并将其与通用C语言库中的函数对应起来。 事实上,puts 和 gets 函数可以直接用CDC类中对应的 putsUSBUSART 和 getsUSBUSART 函数来替代。 通过其它专用实施函数还可以支持不同的串类型(空结束与固定长度缓冲)和存储类型(RAM还是ROM串表)。 下面给出熟悉的HelloWorld程序利用CDC-US

9、B函数实现的程序。#include systemusbusb.h #include io_cfg.hvoid main(void) InitializeSystem(); while(1) USBTasks(); / USB Tasks HelloWorld(); / send a message to the world /end while/end main HelloWorld(void) If ( mUSBUSARTIsTxTrfReady() / check if Tx buffer empty putrsUSBUSART( Hello World!rn) / send a new

10、text string / Hello World联机现在可以将应用连接到PC上,来看看Windows即插即用技术的响应了。 在对所有USB应用都适用的初始枚举阶段(在USB 2.0标准的第9章描述)之后,屏幕上将弹出一个对话框,提醒用户已经发现一个新的硬件设备,需要为操作系统对其进行配置,以便使用它。 虽然CDC驱动程序已经是操作系统的一部分,但仍然需要更多的信息来帮助将新发现的设备与驱动程序进行绑定。 这会在Windows硬件管理器中创建针对特定端口的“属性页”,以后用户可以用它卸载或重新配置端口。 在安装阶段,需要一个很小的纯文本文件(扩展名为.inf)。需要先用(文本编辑器)准备好,当

11、即插即用向导要求时提供。“.inf”举例如下:; Windows USB CDC ACM Setup File; Copyright (c) 2000 Microsoft Corporation; Copyright (C) 2004 Microchip Technology Inc.Version Signature=$Windows NT$ Class=PortsClassGuid=4D36E978-E325-11CE-BFC1- 08002BE10318 Provider=%MCHP% LayoutFile=layout.infDriverVer=08/17/2001,5.1.2600.

12、0Manufacturer %MFGNAME%=DeviceListDestinationDirs DefaultDestDir=12 SourceDisksFilesSourceDisksNamesDeviceList %DESCRIPTION%=DriverInstall, USBVID _04D8&PID_000A ;- -; Windows 2000/XP Sections;- -DriverInstall.nt CopyFiles=DriverCopyFilesAddReg=DriverInstall.nt.AddReg DriverCopyFilesusbser.sys,0x20D

13、riverInstall.nt.AddReg HKR,DevLoader,*ntkern HKR,NTMPDriver,usbser.sys HKR,EnumPropPages32,MsPorts.dll, Serial PortPropPageProvider DriverInstall.nt.Services AddService=usbser, 0x00000002, Driver ServiceDriverService DisplayName=%SERVICE% ServiceType=1StartType=3ErrorControl=1ServiceBinary=%12%usbser.sys ;- -; String Definitions;- -Strings MCHP=Microchip Technology Inc.MFGNAME=Microchip Technology Inc.DESCRIPTION=Communications Port SERVICE=USB RS-232 Emul

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号