DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1223|回复: 0
打印 上一主题 下一主题

[待整理] 将串行应用移植到USB接口的简便方法

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 14:22:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
您是否注意过最新款笔记本电脑的端口? 如果注意过,那么就会发现过去的真实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给出了部分函数例子。




  大多数读者立即就可认出这些函数并将其与通用C语言库中的函数对应起来。 事实上,puts 和 gets 函数可以直接用CDC类中对应的 putsUSBUSART 和 getsUSBUSART 函数来替代。 通过其它专用实施函数还可以支持不同的串类型(空结束与固定长度缓冲)和存储类型(RAM还是ROM串表)。 下面给出熟悉的HelloWorld程序利用CDC-USB函数实现的程序。

  #include "systemusbusb.h"
  #include "io_cfg.h"

  void 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 text string
  } // Hello World

  联机

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

  ; Windows USB CDC ACM Setup File
  ; Copyright (c) 2000 Microsoft Corporation
  ; Copyright (C) 2004 Microchip Technology
   Inc.
  [Version]
  Signature="$Windows NT$"
  Class=Ports
  ClassGuid={4D36E978-E325-11CE-BFC1-
   08002BE10318}
  Provider=%MCHP%
  LayoutFile=layout.inf
  DriverVer=08/17/2001,5.1.2600.0
  [Manufacturer]
  %MFGNAME%=DeviceList
  [DestinationDirs]
  DefaultDestDir=12
  [SourceDisksFiles]
  [SourceDisksNames]
  [DeviceList]
  %DESCRIPTION%=DriverInstall, USBVID
  _04D8&PID_000A
  ;-----------------------------------------------
   -------------------------------
  ; Windows 2000/XP Sections
  ;-----------------------------------------------
   -------------------------------
  [DriverInstall.nt]
  CopyFiles=DriverCopyFiles
  AddReg=DriverInstall.nt.AddReg
  [DriverCopyFiles]
  usbser.sys,,,0x20
  [DriverInstall.nt.AddReg]
  HKR,,DevLoader,,*ntkern
  HKR,,NTMPDriver,,usbser.sys
  HKR,,EnumPropPages32,,"MsPorts.dll,
   Serial PortPropPageProvider"
  [DriverInstall.nt.Services]
  AddService=usbser, 0x00000002, Driver
  Service
  [DriverService]
  DisplayName=%SERVICE%
  ServiceType=1
  StartType=3
  ErrorControl=1
  ServiceBinary=%12%usbser.sys
  ;------------------------------------------------ ------ ------------------------
  ; String Definitions
  ;------------------------------------------------ ------ -----------------------
  [Strings]
  MCHP="Microchip Technology Inc."
  MFGNAME="Microchip Technology Inc."
  DESCRIPTION="Communications Port"
  SERVICE="USB RS-232 Emulation Driver"

  上面的“.inf”例子可用作模板进行快速定制。 文件格式非常简单,大多数Windows程序员都能快速读懂。 即使对于不太熟悉的人,也可以很快识别中文件由不同部分组成,每个部分的标题包含在方括号中,在相应部分内有一或多个由参数名称和参数值组成的正文。 在整个文件中,只能少数几个部分需要用户定制,包括:

  ·[Device List] 部分包括从USB-IF获得(许可)的公司和应用独有的VID/PID号码对以及其它信息。

  ·[Strings]部分包含操作系统在即插即用阶段在不同的对话框中使用的不同字符串和标识,以及在硬件管理器中标识设备的字符串和标识。

  关于VID和PID

  尽管设计师可以任意修改制造商部分和字符串部分的内容,但VID和PID代码的使用是非常严肃的。 USB-IF全权负责为每个希望销售和生产USB产品的制造商分配一个16位唯一VID代码。 VID代码通过许可协议获得,并需要支付一次性注册费用。

  一旦分配了VID代码,制造商就可以利用65,536 (16位) PID代码来唯一地标识其不同型号的产品。 换句话说,VID代码是“终生有效的”,因此很容易摊平初始的VID许可和注册成本。 当然,对于纯粹开发目的,并不需要完成整个许可过程,因为不同的制造商通常都提供“开发用VID/PID代码对”。 为进一步鼓励小型企业、初创企业、咨询企业以及其它非常小批量生产企业,有些单片机生产商还提供获得单个VID/PID对的选择(免费)。

  拥有COM端口

  如果一切顺利,此时即插即用已经完成了安装过程,一个新的串行设备就会出现在硬件管理器中。 系统会自动使用下一个可用的端口号为它指定一个名称(例如,已经安装了COM2和COM1,就会出现COM3)。 用户可以使用已经编写好用来访问实际COMx端口的程序来访问这个端口(如所有Windows软件中的超级终端程序)。 连接好后,除了通讯速度提高了,功能上没有什么区别。与PC上最快的串行端口相比,通信速度提高了一到两个数量级。 Visual Basic或C++程序可通过标准的Windows OpenFile()、ReadFile() 和WriteFile() API 来对仿真的COM端口进行读写,不用改变任何代码。

  结语

  现在市场上已经有了兼容USB的、全功能闪存单片机。这些单芯片解决方案为嵌入式控制设计工程师提供了最低的成本和最大的灵活性。 通过使用CDC类库,串行端口仿真为工程师们将应用程序从传统串行端口移植到更快的USB通信提供了一条捷径,并且避免了Windows底层开发所带来的障碍。 按照上述步骤,嵌入式设计工程师可以快速地从串行端口转移到USB,从而可将100%的精力集中到嵌入式应用这个他们最擅长的方面。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-16 13:35 , 耗时 0.134046 秒, 22 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表