段晋军,位恒曦,常晓明
(太原理工大学 计算机科学与技术学院,山西 太原030024)
随着当今电子技术的发展,人们对数据通信速度和操作安装的简易性等方面的要求日益提高,使得数据通信技术不可避免地成为一项关键技术。USB是一种通用串行总线,其发展速度非常迅猛,USB协议已由传输速度为12 Mb/s的USB1.1发展到传输速度支持低速、全速、高速和超高速的USB3.0,最大传输速度高达5 Gb/s。USB总线技术由于数据传输速度高、使用方便和能够连接多达127个外设,因此其在数据通信中的应用越来越广泛。
Windows平台下传统的USB应用系统的开发步骤是:先用Windows DDK或第三方开发工具开发USB驱动程序,然后用Visual C++开发应用程序。若让不熟悉Windows编程的开发者用传统方法开发USB驱动程序和应用程序,将会非常困难[1]。因此,本文介绍了一种难度较低的USB应用系统实现方案,即在LabVIEW环境下基于NI-VISA实现PC与C8051F320单片机的USB通信系统。
本系统选用具有USB接口的C8051F320-TBC开发板实现数据的双向通信。该设计完成两项任务:(1)采集单片机上温度传感器的数据,通过USB上传至PC;(2)PC通过USB发送指令至单片机,控制单片机执行相应的动作。
本系统的硬件平台结构如图1所示。
图1 硬件平台结构图
本系统的软件平台设计包括单片机端的固件(Firmware)程序设计、PC端的驱动程序设计和PC端的应用程序设计3方面。
单片机端固件程序的任务是处理来自USB主机端的标准请求和完成与USB主机的数据交换;PC端的驱动程序作为 USB主机(PC)和 USB从机(单片机)的桥梁,其主要任务是让USB主机可以识别USB设备,并将硬件本身的功能告诉USB主机;PC端的应用程序的任务是通过驱动程序与USB设备进行通信并对USB数据进行处理。
本文采用LabVIEW平台开发PC端的驱动程序和应用程序,采用Silicon Laboratories IDE集成开发环境开发固件程序。本系统软件平台结构如图2所示。
单片机端固件程序设计的目的是使USB主机能够识别USB设备(本系统为C8051F320设备),并正确与USB设备进行双向通信。
固件程序完成的任务有三项:(1)使得USB主机可识别USB设备,并建立二者之间的通信;(2)接收由USB主机发送来的控制指令,在本设计中为点亮单片机的LED灯;(3)将采集的温度数据传送给USB主机。
本设计将固件程序划分为USB描述符声明程序(usb_desc.c)、中断服务程序(usb_isr.c)、标准设备请求程序(usb_stdreq.c)、主程序(main.c)4个子模块。
USB描述符声明程序(usb_desc.c)用来描述设备的USB信息。该文件包含有USB协议中规定的5种标准描述符信息:设备描述符信息、配置描述符信息、接口描述符信息、端点描述符信息和字符串描述符信息。USB主机通过访问这些描述符即可实现对设备类型的识别和配置。
中断服务程序(usb_isr.c)用来处理所有与USB相关的中断事件,当有任何类型的USB中断事件发生时,固件程序都会调用这个中断服务程序。
标准设备请求程序(usb_stdreq.c)包括所有标准设备请求的处理例程,这些处理例程都是通过控制端点的处理来调用,该文件主要用来处理USB主机发送的标准请求。
主程序(main.c)的功能是响应USB主机发送的控制指令并将采集的温度数据传送给USB主机。
固件程序流程图如图3所示。
由图3可知,该固件程序首先进行设备列举[2],其目的是使 USB主机能够识别USB设备。USB主机根据设备的描述符信息对USB设备进行配置并分配资源,待通信建立后,USB设备可接收由USB主机发来的控制指令,并将采集的温度数据通过USB传给USB主机。
图2 软件平台结构图
图3 固件程序流程图
驱动程序的设计采用虚拟仪器软件架构NI-VISA实现,NI-VISA(Virtual Instrument Software Architecture)是由美国NI公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。VISA是一个综合软件包,可在任何平台、总线和环境下对 USB、串口、GPIB、VXI、PXI及以太网等进行配置、编程和调试。
USB设备有USB INSTR设备与USB RAW设备两类。符合USB测试和测量类(USBTMC)协议的设备称为USB INSTR设备;不符合USBTMC协议的设备称为USB RAW设备。
NI-VISA有USB INSTR类函数与USB RAW类函数两种VISA类函数,它们可分别控制USB INSTR与USB RAW两种设备。USB INSTR设备可通过LabVIEW直接调用USB INSTR类函数实现对其控制;而USB RAW设备则需先使用NI-VISA来创建USB设备的驱动程序[3],创建正确后才能利用LabVIEW调用USB RAW类函数实现对其控制。
使用NI-VISA软件包中的VISA Interactive Control测试可知,本设计中的USB设备属于USB RAW类设备,因此需要通过NI-VISA来创建驱动程序。驱动程序设计的任务是制作INF文件、配置USB设备及安装驱动程序并验证其正确安装,可分为以下 3个步骤[4]:(1)使用 VISA驱动开发向导(Driver Development Wizard)创建INF文件;(2)使用INF文件安装驱动程序和USB设备;(3)使用NI-VISA交互式控制测试设备。
当正确安装VISA驱动程序之后,便可通过Lab-VIEW程序调用USB RAW类函数来完成与USB设备的通信[5]。本应用程序设计的主要任务有两个:(1)PC接收由单片机采集的温度数据,并通过LabVIEW显示;(2)PC通过LabVIEW软件发送指定的指令点亮单片机的LED灯。
由于本设计中的RAW设备编程较为复杂,不像INSTR设备那样可以使用USBTMC协议直接调用VISA常用函数,故需重新编写程序。编写本设计主要用到的控件为:VISA打开、VISA启用事件、VISA等待事件、VISA获取USB中断数据、VISA写和VISA关闭。
PC通过USB向单片机发送指令的流程图如图4所示,PC接收单片机通过USB传送来的数据的流程图如图5所示。
根据图4和图5的流程图进行LabVIEW编程,其后面板的核心代码分别如图6和7所示。
图4 PC机向单片机发送指令流程图
图5 PC机接收单片机数据流程图
图6 PC机向单片机发送指令的核心代码
图7 PC机接收单片机数据的核心代码
在完成各个模块的设计后,需进行系统集成。结合硬件框图进行实物连接,依次完成固件程序下载、驱动程序安装和应用程序整合。
(1)单片机将所采集的温度信息通过USB将数据传送给PC,其LabVIEW前面板及测试结果如图8所示。
图8 LabVIEW前面板及测试结果
单片机的核心代码如下:
通过与单片机发送数据的格式对比可知,所传送数据的格式正确,使用“Bus Hound”软件验证了所传送的数据正确无误。
(2)PC机通过USB将指定的数据传送给单片机,可观察到正常点亮单片机的LED灯。
本文介绍了如何在LabVIEW环境下基于NI-VISA实现PC与单片机C8051F320的USB通信,并给出系统实现方案。实验测试表明,该方案能够实现USB通信,且方案实现难度较低。本系统可为USB应用系统的设计提供参考。
[1]佘志荣,杨莉.基于 NI-VISA与LabVIEW的 USB接口应用设计[J].单片机与嵌入式系统应用,2007(1):66-68.
[2]赵宏斌,全厚德.基于C8051F320的数据采集系统USB接口设计[J].单片机开发与应用,2009,25(9):92-94.
[3]蔡共宣.基于LabVIEW的单片机USB数据采集系统设计[J].实验科学与技术,2009,8(1):58-59.
[4]National Instruments.USB 仪器控制教程[Z],2009.
[5]张桐,陈国顺.精通 LabVIEW 程序设计[M].北京:电子工业出版社,2008.