资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
AVRUSB技术探讨作者:邵子扬、王育强、吕益光摘要 本文介绍了一种独特的AVR单片机和计算机进行USB通信的方法:AVRUSB。介绍了AVRUSB技术的基本原理、特点、应用,同时还详细的介绍了AVRUSB系统的单片机软件开发和计算机软件开发的方法。关键字: AVRUSB,LibUSB,LibUSB-Win32正文 1 简介1.1 AVRUSB是什么 AVRUSB技术是利用高性能的8位RISC架构的AVR单片机,使用单片机的IO口来模拟USB的通信端口,由软件来实现USB通信协议,将普通的AVR单片机模拟成一个USB低速设备,从而实现AVR单片机与计算机之间的通信和控制。AVRUSB技术的基本原理就是利用AVR单片机的普通IO端口来模拟USB的硬件端口进行通信。因为低速USB设备的速度是1.5M位/秒,而AVR单片机是单指令周期的,在单片机使用12MHz的时钟频率时,正好是1.5MHz的8倍。也就是说,单片机每8条指令就精确完成一个数据位的采集。采用这种方法时,对单片机的时序要求非常严格,所以软件的核心部分代码完全由汇编语言实现。1.2 AVRUSB的历史 AVRUSB技术最早的文档可见于AVR的官方应用笔记AVR309 Software Universal Serial Bus (USB)(软件USB)一文中。在这篇应用笔记里,详细的介绍了如何使用AVR单片机的普通IO口来实现USB通信,同时介绍了计算机的驱动程序以及计算机上用户程序的编程方法,并提供了全部源码。但是AVR309中介绍的单片机程序完全是使用汇编语言编写的,不利于将程序移植到其他应用环境中,也不利于程序的维护(毕竟使用汇编语言的人相对比较少,使用C语言编程是大部分人的选择),这使得其应用受到了很多限制。后来,OBJECTIVE公司推出了AVRUSB。它以汇编语言实现USB通信的底层接口,用C语言实现用户层的程序接口。用户接口被简化为很简单的几个函数(在最简化的情况下,只需要三个函数,一个初始化函数、一个轮询函数和一个数据处理函数)和一个配置文件,用户可以完全不会使用汇编语言编程。同时它还提供了一个稳定而成熟的用户程序框架,用户可以在此框架的基础上,通过修改和扩展接口函数的功能来实现各种USB通信功能和控制功能,实现各种带USB接口的应用系统。并且,AVRUSB支持目前最流行的AVR GCC编译器和IAR C编译器,因此具有很强的实用性。1.3 AVRUSB的特点1.3.1 低成本 传统的单片机与计算机进行USB通信,需要使用专用的接口芯片进行USB协议转换,如CP2101、FT232、CH342、PDIUSBD12、SL811等。象CP2101、FT232这样的芯片使用起来虽然简单,但是功能比较单一;而PDIUSBD12、SL811功能较强,但是使用复杂。并且这些专用芯片的价格都相对较高,增加了系统的成本。而AVRUSB简单易用,成本低廉,只需要一个普通的低成本AVR单片机以及很少的几个外部元件,就可以组成一个USB系统。AVRUSB的代码为AVR GCC编译器做了高度优化,同时也完全兼容于更专业的IAR C编译器。程序编译后在最小情况下还不到2KB,因此绝大部分的AVR单片机都可以使用AVRUSB(只要支持外部中断INT0,Flash容量不小于2KB就可以实现AVRUSB的功能)。这样在很多低成本的小容量AVR单片机上也可以使用AVRUSB,如ATtiny2313、ATmega45、ATmega48等,因此AVRUSB技术具有很高的实用价值。1.3.2 资源丰富,容易开发 AVRUSB提供了一个完整而又简单易用、成熟稳定的应用程序框架。这个框架包括了底层(单片机部分)和上层(PC部分),单片机可以使用gcc(或者IAR)编程;PC上则可以使用各种通用编程软件,如Windows下使用VC、VB、Delphi、C+ Builder、BDS2006、GCC,Linux下使用GCC等等。用户可以在这个框架基础上添加和扩展各种功能,快速开发出适合于各种需求的单片机控制系统,而且AVRUSB支持Windows、Linux、MacOS等多种操作系统,具有很好的跨平台特性。1.4 AVRUSB的应用 AVR单片机低成本、高性能的特性,使得AVRUSB非常适合于应用到USB加密狗、USB接口的系统控制、低速USB数据采集等,这样构成的具有USB通信功能的单片机系统比很多使用专用芯片的系统简单、成本低。目前,AVRUSB已经成功应用到了很多产品上,比较有名的有:USBasp(USB接口的AVR编程器)、AVRCDC(USB转RS232串口)、USB Bootlader(USB接口的Bootloader软件)等。在http:/www.obdev.at/products/avrusb/projects.html中,还专门列举了很多使用AVRUSB的开源项目,这些项目提供了完整的单片机程序和计算机程序的代码和原理图。我们在开发自己的AVRUSB应用时,可以参考这些资源,在这些开源项目的基础上进行修改,快速开发出适合于自己需求的应用来。本文作者也成功的将AVRUSB用到公司的一个项目中,很好的实现了一个USB接口的开关矩阵控制。1.5 AVRUSB的限制 因为AVRUSB使用普通IO口模拟来USB通信的过程,由软件实现了硬件完成的功能。而USB通信的速率是比较高的。因此,在进行USB通信时单片机的CPU占用率比较高的(大于90%)。另外,因为受到单片机的处理能力限制,所以通信的数据处理能力不是很强,最大数据处理速度约为20k/s,因此AVRUSB不适合用于大数据量通信的应用场合。2 硬件结构 构成一个AVRUSB系统的硬件结构非常简单,只需要一个普通的AVR单片机(大部分型号都可以),再加上少量的外部元件(晶体、几个电阻以及可选的稳压二极管等),就组成了一个基本的AVRUSB系统,如图1。图1. AVRUSB的基本硬件接口图中的单片机以ATmega8为例。数据线D-上的上拉电阻R4用来通知计算机这是一个低速USB设备(这是在USB规范中定义的,更多内容请参考AVR309以及USB的官方文档)。12MHz晶体和两个22p的电容C2和C3组成单片机运行所必须的时钟。D+ 和D- 数据线可使用单片机的任意IO端口,但是必须使用相同的IO端口。在这里D+ 连接到PB1,D- 连接到PB0。此外数据线D+还需要连接到INT0上,这是为了在不同的AVR单片机中使用AVRUSB时有更好的适应性和兼容性,无需修改底层核心部分程序的代码。如果D-连接到端口D上(就是和INT0同一端口中),同时D+只连接到INT0,还可以节省出一个端口来。电阻R2、R3起到限流和保护作用,防止在意外情况下损坏计算机的USB端口或单片机的端口。单片机所需的电源Vcc可由USB的5V输出电源直接提供,或者由USB的5V电源转换得到(如LDO、稳压二极管等),或者通过电池等其他外部电源来供电。D+和D-上的3.6V稳压二极管D1和D2起到限制数据线上的电平的作用。因为在USB规范中规定数据线D+和D-上的电平范围是3.0V至3.6V,而AVR单片机的输出电平是Vcc。如果单片机的Vcc是5V,在没有D1和D2的情况下将造成电平不匹配,会造成在很多计算机中无法正确识别出USB设备。如果用户系统的Vcc在3.0V至3.6V之间,就可以省略这两个稳压二极管。从这里也可以看出用户系统的Vcc必须高于3V。上面硬件就组成了一个最小的AVRUSB系统,它能够和计算机进行USB通信。在上面最小系统的基础上,如果添加一个红外传感器,就可以接收发送红外信号,就是一个USB红外控制器;如果添加一个MAX202,就是一个带缓冲的USB RS232串口转换器;如果加入ADC转换功能,就是USB的数据采集器;如果加入ADC和电源控制,就能够实现一个简单实用的USB充电器各种功能的AVRUSB系统都是在这个最小系统的基础上,添加不同功能的外围模块或接口来实现的。3 单片机程序的开发 要使用AVRUSB,就需要在单片机中开发合适的软件,实现特定的功能。下面将具体介绍开发需要使用的工具软件和开发的步骤。3.1 开发环境 AVRUSB可使用AVR GCC编译器或IAR C编译器。因为AVRUSB特别为AVR GCC编译器做了优化,并且AVR GCC还是免费软件,使用非常广泛,是目前AVR单片机主要的开发工具软件之一,所以我们下面以AVR GCC为例来介绍。在Windows操作系统下开发时,使用WinAVR中带有的AVR GCC编译器;代码编辑、仿真和调试使用了Atmel公司的AVR Studio,这个IDE的好处是不需要用手工修改makefile配置文件,减少了初学者的使用难度。如果希望使用其他IDE或编辑软件作为开发工具也可以,下面的使用步骤也是类似的。如果是在Linux操作系统下开发,可以使用Linux版本的AVR GCC,以及其他工具软件进行编辑和调试。3.2 建立项目文件 要将AVRUSB加入到自己的程序中,首先需要在AVR Studio中建立一个新的项目(Project),然后将AVRUSB所需要的文件复制到项目文件的文件夹中(当然也可以不用复制文件,只添加已经存在的AVRUSB的文件路径到项目中也可以,但是将项目的所有文件放在一个文件夹下更容易对整个项目进行维护)。一般来说,凡是使用AVRUSB的项目,在项目文件夹下都会单独存放一个USBDRV的文件夹,里面存放着所有与AVRUSB相关的文件。AVRUSB包含了多个文件,但是我们只需要添加以下几个文件到项目中:usbconfig.h 用户配置文件iarcompat.h 为兼容IAR编译器而定义的宏usbdrv.h usb驱动接口文件的头文件usbdrv.c usb驱动接口文件usbdrvasm.asm 为兼容IAR编译器而使用的底层接口函数文件的别名usbdrvasm.S 汇编语言编写的底层接口函数oddebug.h 调试用函数的头文件(不使用调试功能时可以不添加)oddebug.c 包含调试用的函数(不使用调试功能时可以不添加)注意到上面的文件除了usbconfig.h外,都在USBDRV文件夹中。在USBDRV文件夹中一般都有一个usbconfig-prototype.h文件,这个文件是用户配置文件usbconfig.h的原始模板,我们需要将这个文件复制到项目文件夹中并将它改名为usbconfig.h。复制后,还需要再添加USBDRV文件夹的路径到项目的包含路径中,这样在编译时才可以正确找到上面的文件,如图二(因为USBDRV文件夹在项目文件夹下,所以显示出的是相对路径)。如果不使用AVR Studio,也可以使用其他的IDE软件或编辑软件,但是可能会需要用户自行手工修改项目配置文件makefile,具体做法这里就不做介绍了。图2. 添加USBDRV路径到项目中3.3 参数配置 在编译项目之前,除了需要对项目本身的参数进行配置外(如AVR单片机的型号、系统时钟频率、代码优化等级等),还需要对AVRUSB的参数进行配置,这样才能产生出正确的代码。AVRUSB中包含的参数虽然看起来很多,其实配置起来很容易。在用户
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号