USB接口与上位机软件设计
2020-06-04邹连英
邹连英,高 宁
(武汉工程大学 电气信息学院,武汉430205)
在现代科学研究、工业生产和工作环境下,对各种电子设备产生的数据进行采集、处理和传输的过程是必不可少的。USB 接口作为外设和主机间的一种高速、稳定、灵活的双向数据通道,在数据采集、工业控制和日常生活中具有广泛的应用[1]。由于其支持热插拔且价格低廉的特性,如今已成为各种计算机和电子设备外设接口的首选解决方案[2]。
USB2.0 支持低速1.5 Mb/s、全速12 Mb/s、高速480 Mb/s 三种速率,本文结合USB2.0 的Slave FIFO工作方式和高速的传输速率,以Cypress 公司的CY7C68013 芯片为核心,设计和开发了满足一般微处理器实现数据传输和控制的固件程序和上位机人机界面程序。
1 USB 芯片选型
USB 芯片将USB 总线的底层协议封装起来提供指令给用户使用,使用户脱离复杂的底层逻辑,直接通过发送指令控制数据传输实现主机和设备间的通讯和控制。为了实现复杂的数据传输和指令控制功能,一般USB 芯片需要通过多个I/O 接口驱动外围逻辑电路[3-4]。
USB 接口芯片根据内部是否嵌入微控制器分为2 种类型。内部没有嵌入微控制器的USB 接口芯片只能处理与USB 相关的通信工作,但价格比较低廉。这种类型的芯片有National Semiconductor 公司的USBN9602/9603,Philips 公 司 的PDIUSB11/11A/12 系列等。对于内部已经嵌入微控制器的USB 接口芯片类型,它们能够完成扩展的USB 基础功能,这类芯片资料丰富,一般具有官方例程提供API 函数实现USB 功能,易于芯片的开发。如Cypress 公司的基于增强型8051 内核的EZ-USB FX2 系列,Atmel公司的基于AVR 的AT76C711 等。
在本设计中选择Cypress 公司生产的CY7C68013A芯片。该芯片提供的资料丰富,功能完整,应用比较广泛,能够满足数据传输速度的要求,价格比较合理。此外,拥有内嵌微处理器的CY7C68013A 可以将USB 固件程序通过USB 下载到片上RAM 存储器,且不需要额外设备,开发比较方便。
2 USB 固件程序设计
2.1 Slave FIFO 工作模式介绍
EZ-USB 系列的芯片在进行数据的批量传输时,主要有Slave FIFO 和GPIF 两种模式。Slave FIFO模式相对来说更加常用,这种工作模式将数据的传输都看作为对普通FIFO 的读和写,外部逻辑电路作为USB 的主控制器,上位机作为从控制器,USB芯片作为传输的通道脱离出来。外部逻辑电路产生Slave FIFO 需要的传输时序,即可与上位机进行通讯。图1为Slave FIFO 工作模式的连接示意图。其中FD 数据总线作为外部逻辑和USB 芯片的传输通道,FIFOADR[1:0]用于选择缓冲区端点,FLAGA、FLAGB、FLAGC 用于给出缓冲区空满标志,SLRD和SLWR 分别是FIFO 读/写选通信号,SLOE 控制输出。
由于Slave FIFO 的读写是由外部逻辑控制的,则需要在外部逻辑芯片上设计读写状态机以控制读写引脚逻辑。为了便于对整个系统的控制,本设计对端点间FIFO 数据采用异步方式进行读、写。读写逻辑可以根据FIFO 的空满标志,在外部逻辑上通过状态机编程实现。
图1 Slave FIFO 工作模式连接图Fig.1 Slave FIFO connection diagram
2.2 固件程序功能设计
设计固件程序的目的就是为了控制硬件设备完成预定的目标,基于微控制器及其外围电路的硬件设备的正常工作都需要固件的参与和控制[5]。本设计采用了基于Slave FIFO 的自动数据传输模式,这种模式能将配置好后的端点FIFO 内的数据自动发送或接收到USB 主机,只需要配置相应寄存器即可。USB 芯片的固件程序主要负责处理上位机发来的USB 设备请求,同时也控制芯片的外围电路进行数据传输。包括5 个方面:
(1)给特殊功能寄存器赋值,初始化设备;
(2)对主机的设备请求进行响应,完成主机对设备的控制;
(3)设备枚举、数据传输、标准主机请求等动作过程中会向微控制器申请中断,响应这些中断以保证USB 芯片的正常工作;
(4)对发送和接收数据的端点进行配置和控制,实现数据的正确发送和接收;
(5)对外围电路进行控制,保证设备正常工作。
2.3 固件程序框架
Cypress 公司的官方网站为设计者提供了开发固件的程序框架和丰富资料。设计者可以在这些框架的基础上在相应的地方添加合适的代码以完成特定用户需求,即可让USB 固件完成和实现相关设计。
固件框架通过一个任务循环来控制和使用USB 传输,首先会初始化所有设备内部状态变量,然后调用用户初始化函数TD_Init(),接着进行重枚举,重枚举完成后固件程序开始进行任务调度。主要任务有用户任务函数TD_Poll(),标准设备请求和挂起事件。其中TD_Init()函数需要定义全局变量和参数的初始化,设置Slave FIFO 的时钟频率、传输方向、端点选择、端点深度等。TD_Poll()函数实现任务的调度和实施,包含了用户预期工作任务的主要部分,通过主循环不断被调用,本设计端点工作方式为自动读写,所以这个函数没有相应设置。
3 上位机人机界面设计
3.1 应用程序开发
USB 数据采集系统应用场合多、领域广,界面程序的开发不同于其他部分开发的特殊要求,用户一般希望界面可以实现设备管理和数据处理的功能并且尽可能的直观、简洁。从用户的需求出发在上位机界面上有如下构想:
(1)上位机的角色一般由PC 机来承担,工作在Windows 操作系统下,所以上位机界面的设计需要Windows 平台下的开发工具,如VB、VS、LabVIEW、DELPHI 等,本设计采用Visual Studio 2010(简称VS2010)。
(2)应用软件采用在MFC 框架基础上开发的对话框程序界面。MFC(Microsoft Foundation Classes)是微软基础类库的简称,主要封装了大部分Windows API 函数。本质上MFC 类库是C++语言和Windows 操作系统间的接口,使用MFC 编程是选择类库中合适的类,通过调用类中的成员函数实现相应功能[6]。使用MFC 框架的程序界面可以使用户更容易学习和熟悉程序的使用方法。
(3)使用Cypress 公司提供的开发包中的CyAPI控制函数类库,在使用Cypress 公司的通用USB 驱动程序的基础上,在VS2010 的界面工程中加入CyAPI.h 和CyAPI.lib 即可调用USB 设备控制函数,完成USB 传输任务。
3.2 功能模块介绍
Windows 应用程序工作的基本流程是与用户发出的命令进行交互,然后把交互处理结果输出到屏幕,这样的过程就需要用户接口,即对话框,也即一个可以接收消息、反馈消息、被移动、被关闭的窗口。综合用户的功能要求对界面的模块进行了划分,整个界面分为了设置区、设备区、路径保存区和执行区4 个部分,如图2所示。
其中设置区对USB 设备的端点进行选择,设置每个包传输的最大大小、传输初值和遇错停止等。设备区的下拉菜单选择连接到上位机的USB 设备,刷新程序。路径选择区点击按钮选择文件存储路径。执行区能够开始和停止USB 传输任务,复位USB 设备和查看USB 任务执行过程中的信息。
图2 上位机界面图Fig.2 Interface diagram of upper computer
4 USB 设备驱动程序的使用
4.1 驱动程序的介绍
应用程序在访问硬件设备时需要通过驱动程序作为软件接口,驱动程序让应用程序在访问硬件时,屏蔽具体设备的物理连接和底层协议。USB 总线设备驱动程序遵循由微软定义的Win32 驱动程序模型WDM(Windows Drivers Model),扩展名一般为.sys。WDM 驱动程序负责在一个特权层实现应用程序和操作系统的通信,例如一个驱动程序通过允许或保留某个应用程序对硬件的使用权限实现对硬件中断的响应和DMA 传输[7]。开发驱动程序是整个USB 开发中最难、涉及知识最多、实现方式较底层的部分,但Cypress 公司针对EZ-USB 系列芯片提供了一套通用的驱动程序(ezusb.sys),能够完成一般的USB 任务。除非项目中需要特殊USB 功能,通常使用通用驱动程序即可。
4.2 驱动程序的加载
Windows 使用USB 设备描述符中的产商ID(VID)和产品ID(PID)来寻找匹配设备的驱动程序。INF 文件描述了驱动程序和VID、PID 的连接关系。当Windows 发现新的设备连入时,会扫描所有可以选择的INF 文件,选择与ID 最匹配的INF 文件,若找不到则需用户指定地址。找到INF 文件后,系统将驱动程序可执行文件复制到正确地址,驱动程序被装入内存,然后就可以进行正常的I/O 操作了。
5 实验结果
对数据采集的结果进行验证,在上位机程序中选定USB 设备并输入开始按钮特征值,点击开始按钮,外部电路或模拟信号收到开始特征值数据包并解析其中参数,根据开始包中的参数确定实验时间和实验次数。系统开始工作后上位机接收到的数据会直接存入txt 文件中,测试结果如图3所示,可以看出,经实际测试,数据传输准确无误,没有出现数据的丢包、混乱等错误,传输速率可达30 MHz/s 以上,满足设计要求。
图3 数据传输结果图Fig.3 Result diagram of data transmission
6 结语
本文以外部电路的数字信号采集平台和PC 机之间的数据传输及指令控制的工程研究为背景,进行了基于USB 总线技术的Slave FIFO 工作模式的数据传输系统的设计与实现,并对这个系统的功能和模块进行了详细的研究和分析。USB 控制器CY7C68013 已经被广泛应用到许多数据传输领域,由于USB 具有灵活的接口和可编程特性,提高了系统可靠性和可扩展性。希望本文能够为数据采集和传输的研究学者提供一些参考和启发。