现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中。但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失。于是嵌入式开发人员常常发现自己新买来的计算机上没有串口,或者出现调试现场用户的计算机没有串口的尴尬局面。相反,现在的个人计算机普遍拥有4个以上的USB接口,能不能使用USB接口代替串口,完成PC机和嵌入式系统的通信呢?

  1.USB虚拟串口代替物理串口的可行性 
  首先,越来越多带USB接口的器件涌现出来,如带USB接口的单片机,或独立的USB接口器件,而且这些器件的成本已经很接近于使用RS232电平转换芯片所带来的成本。 
  其次,市场上也出现了一些USB接口转串口的芯片,这些芯片一头为串口,另一头为USB接口,在其内部完成串口到USB协议的转换。该芯片通过USB口连接到个人计算机后,在操作系统中表现为一个串口设备,这意味着USB接口对于传统的串口调试工具(HyperTerninal)和用户基于串口的应用程序是透明的,开发人员完全不用更改PC端的调试和应用程序。 
  但是这些器件的USB类不属于标准的USB设备类,因此需要在Windows和Linux操作系统上安装额外的设备驱动。另外,由于不是操作系统自带的设备驱动,而且通信经过了由串口到串口,USB从设备到USB主机的多次转换,当调试遇到问题时常常无法确定是串口出了问题还是USB出了问题。因此,应该使嵌入式系统直接和PC通过USB总线接口连接(通过片上的USB接口或片外USB接口芯片),由单片机直接完成USB虚拟串口的协议转换。 
  在USB标准子类中,有一类称之为CDC类,可以实现虚拟串口通信的协议,而且由于大部分的操作系统(Windows和Linux)都带有支持CDC类的设备驱动程序,可以自动识别CDC类的设备,这样不仅免去了写专用设备驱动的负担,同时简化了设备驱动的安装。

  2.什么是CDC类 
  USB的CDC类是USB通信设备类(Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。根据CDC类所针对通信设备的不同,CDC类又被分成以下不同的模型:USB传统纯电话业务(POTS)模型,USB ISDN模型USB网络模型。其中,USB传统纯电话业务模型,有可分为直接线控制模型(Direct Line Control Model)抽象控制模型(Abstract Control Model)USB电话模型(USB Telephone Model),如图1所示。本文所讨论的虚拟串口就属于USB传统纯电话业务模型下的抽象控制模型。


  通常一个CDC类又由两个接口子类组成通信接口类(Communication Interface Class)数据接口类(Data Interface Class)。笔者主要通过通信接口类对设备进行管理和控制,而通过数据接口类传送数据。这两个接口子类占有不同数量和类型的终端点(Endpoints),如图2所示。


  对于前面所述的不同CDC类模型,其所对应的接口的终端点需求也是不同的。如所需要讨论的抽象控制模型对终端点的需求,通信接口类需要一个控制终端点(Control Endpoint)和一个可选的中断(Interrupt)型终端点数据接口子类需要一个方向为输入(IN)的周期性(Isochronous)型终端点和一个方向为输出(OUT)的周期性型终端点。其中控制终端点主要用于USB设备的枚举和虚拟串口的波特率和数据类型(数据位数、停止位和起始位)设置的通信。输出方向的非同步终端点用于主机(Host)向从设备(Slave)发送数据,相当于传统物理串口中的TXD线(如果从单片机的角度看),输入方向的非同步终端点用于从设备向主机发送数据,相当于传统物理串口中的RXD线。

  3.AT89C5131的简单介绍 
  基于单片机的嵌入式系统要实现USB总线通信,通常都是通过外扩专用的USB总线接口芯片(如飞利浦的D12)。但是这样的方案既增加了成本,又使PCB板的面积变大,所以使用Atmel公司的集成了USB2.0全速(Full Speed)从接口外设的51单片机AT89C5131。 
  AT89C5131是一个基于52内核的单片机。在存储器方面,其内部集成了32KB的Flash存储器用于代码的存储,1KB的EEPROM存储器用于用户数据的存储,用户可以使用片上的Bootloader或Flash API通过USB接口或者其他接口(如UART和I2C总线)对Flash存储器和EEPROM存储器进行ISP或者IAP编程。 此外AT89C5131还集成了10位的ADC、I2C总线接口和PCA模块等丰富的外设。  
  AT89C5131的USB2.0全速从接口的结构如图3所示,其包括USB D+/D-的接口缓冲,数字锁相环,串行接口引擎(SIE)和通用功能接口(UFI)。其中数字锁相环以单片机的时钟为输入,产生了USB接口其他部分所需的48MHz时钟。串行接口引擎完成USB通信物理层NRZI码的编码与解码,CRC生成以及校验与纠错。通用功能接口包含了一个双端口的数据存储器,其一端与串行接口引擎链接,另一端通过数据总线与单片机相连接,使单片机可以通过特殊功能寄存器完成对USB2.0从接口的控制与通信。


  AT89C5131的USB2.0全速从接口包含了7个终端点,其中0号终端点被配置成为默认的控制终端点。其他1~6号终端点都可以通过特殊寄存器配置为控制(Control),突发(Bulk),中断(Interrupt)和周期性(Isochronous)模式。由于每一个终端点都由一组独立的寄存器对该终端点进行控制、状态识别和数据的存取,则如果将这些寄存器直接映射到51单片机的特殊功能寄存器地址空间显然是容纳不下的。因此,这7个终端点的7组寄存器在单片机的地址空间中其实使用的是同一组寄存器的地址,而通过一个特殊功能寄存器(UEPNUM)来选择当前该组寄存器实际选择的是哪个终端点的寄存器组,这样就大大节省了所占用的地址空间,为集成其他特殊外设提供了可能。

  4.基于AT89C5131的CDC类的实现 
  AT89C5131与USB接口的硬件连接很简单,选用一个B type的USB插座,因为按照USB规范,从设备使用B type的USB插座,主设备使用A type的USB插座,将Btype的USB插座的D+和D-脚分别与AT89C5131上的D+和D-脚相连。然后再在电源和D+之间用一个1.5 kΩ的上拉电阻连接,因为按照USB规范,USB主设备是通过从设备在插入时D+和D-上的绝对电平来确定从设备是一个全速设备还是一个低速设备的,而AT89C5131是一个全速设备,所以需要将D+上拉。 
  下面介绍虚拟串口的单片机软件设计与实现。首先来看一下终端点的分配,按照CDC类抽象控制模型对终端点的需求,将单片机0号终端点和1号终端点分配给通信接口子类,分别作为控制终端点(完成枚举和串口参数设置)和中断终端点,而将2号和3号终端点分配给数据接口子类,分别作为IN和OUT终端点,虚拟串口的数据主要从这两终端点来进行传送。

  由于各个终端点的行为相对独立,对于每个终端点的控制过程又有相似性,在这里以2号终端点即作为数据接口的IN终端点为例,说明软件是如何对终端点进行操作和控制的,其控制流程图如图4所示。2号终端点是一个IN的终端点,它的主要工作是模拟物理串口的TXD线,向主设备发送数据。当主设备发出IN的请求时,如果FIFO不空,就向主设备发送FIFO的内容;如果FIFO为空,则向主设备发送一个空包作为回应。AT89C5131在收到IN的请求时,会触发USB中断(如果被使能),在中断处理程序中,如图4所示,首先判断中断的触发源是哪个终端点,如果是2号终端点,将USB寄存器组映射到2号终端点的那一组,然后将需要发送的串口数据填入FIFO寄存器(UEPDATX),置位UEPSTAX的TXRDY位,表示FIFO中的数据已经准备好,这时USB接口就会自动响应IN请求,并将FIFO中的数据发送出去,程序则可退出中断服务程序。对于其他的终端点,其处理过程也是相似的。  
  软件使用Keil C51为编译系统,为了便于和系统的其他程序集成,采用标准字符型设备的API接口usb_getc()和usb_putc(),使程序具有很好的移植性。应用程序层函数(usb_getc()和usb_putc())与USB中断处理程序通过两个先进先出FIFO循环队列(TX和RX)来交换数据,这样有效的起到收发缓冲的作用,防止缓冲溢出。

  5.总结 
  在单片机上实现基于CDC类的USB虚拟串口很好的适应了当前计算机外设接口的发展,同时因为这样的接口在PC操作系统中仍然映射为一个串口,所以又避免了大量的PC端调试程序和应用程序的重新编写。

USB CDC类的更多相关文章

  1. USB驱动之CDC类的介绍与应用20160905

    USB的协议其实是很复杂的,如果要深入学习估计要一两年才能熟悉透.本文主要是讲如何使用官方已经写好的库进行二次开发,以达到我们自己使用的目的.我们知道USB可以用来接U盘,声卡,读卡器,鼠标键盘等等, ...

  2. usb cdc 协议

    什么是CDC类 (Communication Device Class) USB的CDC类是USB通信设备类 (Communication Device Class)的简称.CDC类是USB组织定义的 ...

  3. android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

    MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...

  4. (转)什么是CDC类(Communication Device Class)

    全文地址:http://justmei.blog.163.com/blog/static/1160998532010321112522467/ 什么是CDC类 (Communication Devic ...

  5. ATMEL处理器自带USB CDC的Win7驱动问题

    [背景] 很久以前使用ATMEL的处理器开发了一款设备,通过处理器本身的功能,借助USB在PC端虚拟一个串口出来,实现和上位机软件的通信,和基本的参数设置和数据读取功能. 这个功能就是ATMEL官网上 ...

  6. CDC类

    CDC :class of device context Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 .MFC基础类库定义了设备环境对象类----CD ...

  7. USB 设备类协议入门【转】

    本文转载自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一.应用场合 USB HID类是比较大的一个类,HID类设备属 ...

  8. 一个DELPHI操作USB摄像头类

    最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } ...

  9. VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)

    上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...

随机推荐

  1. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  2. javascript 第26节 jQuery对象

    <html> <head> <title>jQuery</title> <!--导入jquery库--> <script type=& ...

  3. 常用Linux/Unix/Mac Os命令

    常用Linux/Unix/Mac OS命令 参考: 1.50 Most Frequently Used UNIX / Linux Commands (With Examples)

  4. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  5. [DP] LGTB 玩THD (复杂状态DP)

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  6. 2016/7/7 自定义函数copy

    题目:输入整数n(n<=10000),表示接下来将会输入n个实数,将这n个实数存入数组a中.请定义一个数组拷贝函数将数组a中的n个数拷贝到数组b中. 分析: (1)输入n,再输入n个实数存入数组 ...

  7. HTML5之 离线数据存储

    --- Storage接口 无论是sessionStorage还是localStorage 属性/方法 返回值 描述 ----------------------------------------- ...

  8. 超过130个你需要了解的vim命令

    基础 :e filename Open filename for edition :w Save file :q Exit Vim :q! Quit without saving :x Write f ...

  9. Javascript中的迭代、归并方法

    迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...

  10. frameset,frame应用,常用于后台

    <!DOCTYPE HTML><html><head><title>lin3615</title></head><fram ...