关键词:USB总线 ; 数据采集 ; CH372
0 .引言:
在现代科学研究中,经常要对数据进行采集分析。目前比较通用的是在PC内安装数据采集卡(如A/D卡及422、485卡),但是这些数据采集设备由于安装麻烦、价格昂贵、受计算机插槽数量、地址、中断资源的限制,可扩展性差,以及无法做电磁屏蔽而导致采集的数据失真。随着客户对系统数据采集速度要求的不断提高,USB以其使用方便、易于扩展、速度快等优点而越来越多的应用于数据采集系统中。
USB (Universal Serial Bus,通用串行总线)作为一种新的外设连接技术,可以简化计算机与外设的连接过程,提高低速和高速的兼容,为用户提供一种可共享的,可扩充的使用方便的串行总线。
1. USB数据采集系统的组成及工作原理
一个实用的USB数据采集系统包括A/D转换器,DIO ,微控制器,USB控制芯片以及PC机端的应用程序。外部的被测信号经过传感器变换为模拟电压信号,经屏蔽电缆传入A/D转换模块将其转换为数字信号。在主机端,当外围USB设备接入系统,经过总线枚举被检测、配置可用后,主机端的应用程序就可以控制数据采集系统对数据进行采集。微控制器根据所需的采样速率进行数据采集,并将采集来的数据存储在数据存储器中,再通过USB接口控制芯片,将根据USB总线传输协议打包的数据放到USB总线传给主机,由主机端的应用程序对数据进行显示、分析处理。
2.系统硬件设计
USB总线接口控制器是USB设备与主机通信的重要器件。目前,市场上的USB控制器有很多种,大致可分为两种,一种是带USB接口的单片机,如cypress的cy系列;另一种是仅处理USB通信的,必须有一个外部微控制器来进行协议处理的纯粹USB控制器。根据USB控制器的分类,要实现USB设备与主机的通信就有两种方法(1)带微处理器的USB控制器(2)独立的USB控制器加微处理器。
本系统根据数据采集卡的功能,采用带7通道10位精度A/D转换器的SPCE061A单片机和CH372的USB控制芯片组成外部数据采集设备实现与主机的通信。
2.1 CH372控制器的主要特点:
(1) 支持全速设备接口,兼容USB2.0规范,即插即用,外围元器件只需要晶体和电容。
(2) 提供一对主端点和一对辅助端点,支持控制传输、批量传输、中断传输。
(3) 具有8位数据总线和读、写、片选控制线以及中断输出,可以方便的挂接到单片机/DSP/MPU等控制器的系统总线上。
(4) 内置了USB通讯中的底层协议,具有省事的内置固件模式和灵活的外置固件模式。在内置固件模式下,CH372自动处理默认端点0的所有事务,自动完成标准的USB枚举配置过程,本地端单片机只要负责数据交换,所以单片机程序非常简洁[1]。
2.2 SPCE061A的主要性能特点
SPCE061A拥有16位的微处理器核心,CPU工作时钟频率0.32—49.152MHz,2个10位数字模拟转换输出通道,7个10位模拟数字转换器输入通道,具有较高的处理速度,能够更容易,更快速的处理复杂的数字信号.[2]
根据功能模块的集成和CH372内置固件模式的特点,本系统的硬件电路十分简单。
图1 系统硬件连接示意图
模拟信号经外部的放大由IOA[6:0]输入,CH372芯片的读选通输出RD#和写选通输出WR#连接到单片机。CS#由地址译码电路驱动,可用于当单片机具有多个外围器件时进行设备选择,在本系统中要求CS#常为低电平,所以直接接地。INT#输出的中断请求是低电平有效,单片机可以使用中断方式或者查询方式获知中断请求。
当WR#为高电平并且CS#和RD#及A0 都为低电平时,CH372 中的数据通过D7~D0输出;当RD#为高电平并且CS#和WR#及A0 都为低电平时,D7~D0上的数据被写入CH372 芯片中;当RD#为高电平并且CS#和WR#都为低电平而A1 为高电平时,D7~D0 上的数据被作为命令码写入CH372芯片中[1]。
3.软件设计
USB数据采集系统的软件部分包括三个方面:单片机中的固件程序,设备驱动程序,和主机上的应用程序。
3.1 固件程序是与USB控制器相连的单片机执行的代码,主要负责两项任务。
(1) 响应主机对设备的枚举实现对设备的配置,也就是使主机检测并识别设备,为主机和设备之间的数据传输做准备。
(2) 根据PC机上的应用程序的要求,传输数据。
由于本系统使用的CH372USB控制器内置固件模式屏蔽了相关的USB协议,自动完成主机的USB枚举配置过程,完全不需要本地端控制器做任何处理,所以固件程序只需要实现涉及对采集数据的传输、采集参数设置的要求即可。
SPCE061A共有7个A/D转换通道,但只有一个ADC,在使用前必须查看P_ADC_MUX_Ctrl单元/P_ADC_Ctrl单元的RDY的值,以确定ADC为空闲状态,通过设置P_ADC_MUX_Ctrl的第2-3位来实现通道切换,而且SPCE061A的A/D转换只能通过读取P_ADC_LINEIN_Data单元的数据来触发[2]。数据采集依靠读P_ADC_LINEIN_Data单元的数据进行连续的数据采集。由于USB的传输速度远远大于数据采集的速度,所以在SPCE061A内部RAM中定义双数据缓冲区,利用缓冲区buf[0]做为缓冲区满标志位和读指针p来确定读数据顺序,实现轮流从两个缓冲区读取数据。当 buf_i[0]==1&&p==buf_i时,表示i缓冲区满且读数据顺序正确,则从此缓冲区读数据。在数据发送完后,改变缓冲区满标志并设置读指针,继续读下一个缓冲区。为使前一次的数据传输与后一次的数据传输连续,主机查询的时间间隔要小于缓冲被写满一次所需要的时间。
CH372的端点0 是默认端点,在内置固件模式下,自动处理USB各种标准事务; 端点1 的下传端点作为辅助端点,用来传输数据采集的控制命令,如数据采集的开始、停止、设置数据采集的各项参数等; 端点2 作为批量数据传输端点,用于对采集数据的传输。
CH372 在计算机应用层与本地端单片机之间提供了端对端的连接,本系统采用请求加应答方式进行通讯。计算机应用层按事先约定的命令码加传输数据的格式将数据请求发送给CH372芯片,CH372 芯片再以中断方式通知单片机,进入中断服务程序。中断服务程序通过执行GET_STUTAS命令获取并分析中断状态,是发送数据成功,执行RD_USB_DATA命令从CH372读取接收到的数据;是上传数据成功,执行WR_USB_DATA命令向CH372写入下一组要发送的数据;是中断数据,分析控制命令类型并转入执行相应的数据采集控制。
3.2 设备驱动程序
USB总线设备的客户端驱动程序设计是开发USB总线外设的关键。USB总线设备采用分层的WDM驱动模型,通过它用户不需要直接和硬件打交道,而只需通过下层驱动程序提供的接口来访问硬件。驱动程序操作的核心是I/O请求包(IRP),各层驱动程序都要通过IRP来进行通信。当应用程序需要对设备进行I/O操作,就调用Windows API函数,WIN32子系统通知I/O管理器根据请求构造一个合适的IRP并把该请求传递至下一层。分发例程常常只执行对IRP的初始处理,如检查所有的参数是否合法的,然后把IRP 分发到下层驱动去处理 [4]。USB功能驱动程序通过USB总线驱动程序接口访问USB总线,所有低层I/O都由USB总线驱动程序处理,所以功能驱动程序只关心数据传输类型、传输时序、传输管道以及如何处理数据等操作。本系统直接应用CH372芯片开发商提供的包含创建、关闭设备、设备控制、设备PnP等操作的设备驱动程序。
3.3应用程序
客户应用程序由Visual C++编写,向用户提供设备打开、关闭,对数据采集的参数调整,并对采集数据进行显示等控制功能。当设备连接好并经配置可使用后,应用程序需要与设备进行通信,就可以启动一次传输。
图2 应用程序流程图
USB设备对应用程序来说只是一个拥有设备名的文件,所以就可以使用Win32的API中的文件函数来对设备进行控制。在应用程序中利用多线程编程思想实现系统的实时性,主线程完成系统参数设置,显示数据等,辅助线程单独完成对数据的采集工作。
4.结束语
随着USB传输数据速度的提高,传输实时性的增强,会出现越来越多的USB设备。本文则根据数据采集系统安装麻烦,价格昂贵,可扩展性差的现状,设计了一个基于USB总线接口的数据采集系统。该系统不仅硬件电路十分简单,而且安装方便,即插即用,有很好的可靠性和稳定性,可以广泛的应用与对各种数据的采集。
本文作者创新点:
本系统对于USB传输应用CH372USB控制芯片的内置固件模式屏蔽了相关的USB协议,默认端点0自动处理主机的USB枚举配置过程,完全不需要本地端控制器做任何处理, 单片机程序非常简洁,并且对数据采集部分的硬件采用自带模拟数字转换功能的单片机,使得整个系统的控制和硬件电路都十分简单。
参考文献
[1] 南京沁恒电子有限公司 CH372S使用手册 [M] 2005
[2] 罗亚非 凌阳16位单片机应用基础[M].北京:北京航空航天大学出版社 2005
[3] Jan Axelson . USB大全 [M]. 北京: 中国电力出版社 2001
[4] Chris Cant . Windows WDM设备驱动程序开发指南[M]. 北京: 机械工业出版社 2003
[5] 曹利钢 USB总线数据采集控制系统的开发与应用 [D].南昌:南昌大学硕士毕业论文 2005
[6] 边海龙.贾少华USB 2.0设备设计与开发 [M]. 北京:人民邮电出版社 2004
[7] 石晓瑛 许智榜 基于AT90S8515和USB接口数据采集系统 [J].微计算机信息 2005
[8] 张弘. USB接口设计 [M]. 西安 : 西安电子科技大学出版社 2002