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

发布时间 : 星期一 文章将串行应用移植到USB接口的简便方法更新完毕开始阅读

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

作者:Microchip Technology Inc. Lucio Di Jasio 时间:2008-04-02 来源:电子产品世界 浏

览评论

您是否注意过最新款笔记本电脑的端口? 如果注意过,那么就会发现过去的真实COM端口没有了。 事实上,最有可能的是原来串口所在位置现在是几个USB端口。 USB总线的设计初衷就是要取代PC机上大多数(如果不是所有的话)传统端口。 当然,由于有很多支持USB的单片机和接口器件,因此对于嵌入式设计人员来说,没有COM端口并不会带来障碍。 只要选择正确的工具和软件解决方案,那么转移到USB可以是非常简单的事情。

硬件补丁解决方案

对那些需要为基于串行端口的老项目提出快速解决方案的设计工程师来说,开始最有吸引力的一种策略是采用一种补丁系统。 这可通过在嵌入式控制器串行接口与PC机

USB连接器之间增加一个专用USB-UART

转换器来实现。 此类器件通常配有支持各种

操作系统的定制驱动程序,可以完全仿真一个标准的串行端口。 这种方法需要重新设计嵌入式应用电路板以腾出空间容纳新的元件,但它不用改变固件和PC应用程序。 拆除了已证明无用的串行端口接收器,而增加的成本只有几美元。两者基本可以抵消,但这样做却失去了采用USB所带来的大部分好处。 事实上,USB能够支持更快的数据传输速度,可达到典型串行端口的100倍(12 Mbps与115 kbps),继续使用UART,实际上会成为设计的主要瓶颈。 此外,由于大部分USB-UART接口器件缺乏灵活性,无法实现灵活的电源管理,而这在许多嵌入式设计中是一个关键特性。

单芯片解决方案

从串行端口转移到USB,更好的硬件选择是采用单芯片解决方案,即选用具有USB接口的单片机,并开发驱动程序(图2)来模仿串行端口。 从硬件角度来看,单芯片解决方案显得非常有吸引力:

·与通用型号相比,带有USB接口的单片机几乎不需要增加额外成本。

·由于拆除了串行端口接收器,电路板上元件的数量相应减少,同时在低成本USB连接器与新型兼容USB的单片机的D+/D-引脚间建立直接连接。

·当通用单片机和兼容USB的单片机引脚互相兼容时,电路板重新设计的成本和工作量可以减小到最低。

·此外,不必再为那些可以使用USB总线5V电源的应用配备电源适配器,从而可以进一步降低成本。

软件界面

一旦选择了单芯片解决方案,我们就需要为应用开发新的PC驱动程序,甚至可能是新的固件。 幸运的是,软件开发人员有多种选择,可通过重复使用应用界面类的方法来减小开发工作量。

构建到现在PC操作系统中的最常见并获得最好支持的USB接口类可能是所谓的人机接口设备(通常指HID类)。 所有的PC计算机都需要一些像键盘或鼠标这样的人机接口,这些设备的连接已经从串行或者PS/2端口升级进USB。 其驱动程序已经捆绑在Windows、Linux和MAC OS的每个拷贝中,所以所有操作系统都可以很好地支持HID。因此,对于那些想从不太复杂的嵌入式设备中读写少量数据的设计工程师而言,HID是一个非常有吸引力的选择。 不幸的是,应用编程接口(API)没有什么与COM端口接口类似。 因此,将API移植到现有系统上更成问题,特别当PC上已经有一个复杂的应用软件的时候。

其它像打印机类和海量存储这样的标准USB接口类都可以利用来实现与嵌入式设备进行通讯。 然而,它们也面临同样的问题,即陌生的接口以及必须开发新PC应用软件。

驱动程序开发需要对操作系统底层有深入的了解。 对Windows PC机来说,这意味着要熟悉Windows驱动程序模型(WDM)。 如果没有这方面的专业知识,那么开发一个可基本工作的驱动程序原型也需要花费数月时间。

幸运的是,大部分最新版本Windows都有的一个接口类可以帮助我们摆脱困境。 微软公司原先开发这个名为USB通讯设备类(CDC)的目的是用来支持调制解调器应用。 例如,开发人员可以获得CDC接口的完整源代码,以进行面向PIC18F4550系列闪存USB 8位单片机的开发。

Microchip公司的CDC接口提供以下有用特性: ·固件库的代码量相对较小,仅3KB;

·单芯片解决方案;

·仅占用大约50B的存储器空间(不包括缓冲区); ·最大吞吐量为每秒80 K字节;

·完全由USB协议控制数据流量(不需要RS-232 XON/XOFF和硬件流控)。 便捷的固件移植

在下面的讨论中,我们假设原先的串行端口代码是用C语言编写的,并且使用了可访问集成UART外设的公共C语言库。 给定这些条件后,将固件移植到CDC需要进行如下的修改:

·在主文件头部,用相应的USB声明代替针对串行端口的#include声明; ·在主函数中,增加对USB-CDC初始化代码的调用; ·在主函数中,增加对USB后台任务的调用;

·验证应用程序代码,以实现与USB后台任务的协同多任务处理;

·最后,为链接器提供USB-CDC专用库,生成最终的可执行代码,然后对闪存芯片进行编程。

实际上,上述这种情况要求应用所调用的任何功能都不能包含阻塞循环。 也就是说,任何功能都不能占用100%的处理器时间,也不能妨碍USB后台任务的执行。 反过来,所有USB专用控制函数、中断、标志和缓冲机制都由CDC类固件后台任务管理,设计工程师无需关注其实现细节。 设计工程师所看到的只是一个非常类似于公共串行端口库的小函数集。表1给出了部分函数例子。

联系合同范文客服:xxxxx#qq.com(#替换为@)