USB CDC类
现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中。但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失。于是嵌入式开发人员常常发现自己新买来的计算机上没有串口,或者出现调试现场用户的计算机没有串口的尴尬局面。相反,现在的个人计算机普遍拥有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类的更多相关文章
- USB驱动之CDC类的介绍与应用20160905
USB的协议其实是很复杂的,如果要深入学习估计要一两年才能熟悉透.本文主要是讲如何使用官方已经写好的库进行二次开发,以达到我们自己使用的目的.我们知道USB可以用来接U盘,声卡,读卡器,鼠标键盘等等, ...
- usb cdc 协议
什么是CDC类 (Communication Device Class) USB的CDC类是USB通信设备类 (Communication Device Class)的简称.CDC类是USB组织定义的 ...
- android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget
MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...
- (转)什么是CDC类(Communication Device Class)
全文地址:http://justmei.blog.163.com/blog/static/1160998532010321112522467/ 什么是CDC类 (Communication Devic ...
- ATMEL处理器自带USB CDC的Win7驱动问题
[背景] 很久以前使用ATMEL的处理器开发了一款设备,通过处理器本身的功能,借助USB在PC端虚拟一个串口出来,实现和上位机软件的通信,和基本的参数设置和数据读取功能. 这个功能就是ATMEL官网上 ...
- CDC类
CDC :class of device context Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 .MFC基础类库定义了设备环境对象类----CD ...
- USB 设备类协议入门【转】
本文转载自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一.应用场合 USB HID类是比较大的一个类,HID类设备属 ...
- 一个DELPHI操作USB摄像头类
最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } ...
- VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)
上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...
随机推荐
- C#3.0 集合
实现IEnumerable<T>伴随一个迭代: public class MyGenCollection : IEnumerable<int> { int[] data = { ...
- mysql关键字讲解(join 、order by、group by、having、distinct)
1.join 1.1 OUTER JOIN:想要包含右侧表中的所有行,以及左侧表中有匹配记录的行. 1.11 Mysql中有左连接(left join): ...
- 树莓派配置AP模式
所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...
- 【转】代码高处走 从VC6到VC9移植代码问题说明
首先可以直接用Visual Studio 2008的打开VC6的工作区文件和项目文件(dsw和dsp),并将其升级为VS2008的解决方案格式和项目格式(sln和vcproj),VC9的编译器相对于V ...
- ios专题 - objc runtime 动态增加属性
objective-c中,有类别可以在不修改源码的基础上增加方法:近排在看别人的开源代码时,发现还可以动态增加属性.而且是在运行时,太牛B了. 使用运行时库,必须要先引入 objc/runtime.h ...
- Mysql 流程控制
流程控制 分支结构 if分支结构 语法: if 条件then -- 语句体 else -- 缺省语句体 end if; 示例: 循环结构 whi ...
- 【制作镜像Win*】特殊配置
下载disk.config: wget http://10.254.3.75/images/configdrive/disk.config 修改libvirt.xml,更换cdrom为disk.con ...
- 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3555111.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- 第32条:用EnumSet代替位域
如果一个枚举类型的元素主要用在集合中,一般使用int枚举模式,将2的不同倍数赋予每个常量: public class Text { public static final int STYLE_BOLD ...
- linux中 ECShop的文件不能写
解决办法: 1.开放权限 使用命令:chmod -R 777 文件路径 2.关闭SELinux 使用命令:setenforce 0