USB总线在同步相量测量单元中的应用
扫描二维码
随时随地手机看文章
1 引言
同步相量测量单元(PMU)测量装置与上位计算机之间的通讯速率普遍较低,不能将测量数据及时传送到上位机进行分析处理,通讯接口已成为整个系统性能提高的一个瓶颈,因此有必要使用一种传输速率、时延、稳定性均能满足同步相量测量数据传输的通用接口。
采用USB接口作为上位机与下位机的通讯接口方式可以解决这些问题。利用USB接口中断传输速率大,时延小,差错率极低的特点来完成实时相量数据的传输。在USB接口的实际应用中,驱动程序的开发是最为困难的部分,由于USB接口诞生较晚,目前尚未成为多数单片微机的标准设备,还需要使用专门的接口芯片进行连接,用户必须编写相应的驱动程序将数据转化为符合USB系统协议的格式进行传输。
本文叙述了ATMAGE128单片机使用PDIUSBD12接口芯片完成USB接口数据通讯的过程。通过驱动程序完成对相关硬件设备的操作。该驱动程序完成USB接口的中断传输功能,用户调用通用命令就可以像使用一个普通的存储器一样使用USB接口芯片。该接口实现了各采样点的低延时上传功能,可以在1ms内完成一个工频周期全部采样值的传输。
2 USB系统及其器件选择介绍
2.1 USB体系概述
USB(Universal Serial Bus)是一种通用串行总线,为了实现整个计算机系统中总线的一致性,由COMPAQ/ INTEL/MICRSOFT和NEC等公司共同开发出的一种新的、快速的、双向的、同步传输的并可以热拔插的数据传输总线,简称USB总线。USB总线由以下四个主要部分构成:①主机和设备:是指USB系统中的主要构件。②物理构成:是指USB元件的连接方法。③逻辑构成:不同的USB元件所担当的角色和责任,以及从主机和设备的角度出发USB总线所呈现的结构。④客户软件与设备功能接口的关系。
USB总线有四种数据传输方式:①控制传输:主要用于主机把命令传给设备以及设备把状态返回给主机。②中断传输:用来支持那些偶然需要少量数据通信,但服务时间受限制的设备。③批量传输:用来传输大量的数据而没有周期和传输速率的设备上。批量传输方式并不能保证传输的速率,但可以保证传输的可靠性,当出现错误的时候会要求发送方重发。④同步传输:以一个恒定的速率进行传输。同步传输的方式的发送和接收方都必须保证传输速率的匹配,不然会造成数据的丢失。
2.2 USB器件简介及应用
实现USB传输的方法主要有使用接口转换芯片和专用的接口芯片两种。前者就是将USB接口转换为标准的RS232接口使用,在操作方式和传输速度上与RS232接口完全相同。后者则可以实现真正的USB传输,使用USB1.1标准的接口芯片如PDIUSBD12可以达到最高12Mb/s的传输速率,使用USB2.0标准的接口芯片如ISP1581则可以达到480Mb/s的传输速率。如果要使用专用的USB接口芯片就必须编写相应的下位机与上位机驱动程序,由于USB传输不同于串口传输,USB传输的方式都是通过协议规定的数据包来完成的,所以下位机的软件必须实现对接口器件的硬件管理功能,及对协议发出的各种请求作出响应。而上位机驱动程序需完成对接口芯片的枚举、地址分配等工作。
2.3 USB接口在本系统中的作用
USB接口在本系统中用来完成下位机与上位机的通讯,具体就是连接AVR单片机与PC,将下位机采集的数据及一些相关信息传送到PC进行处理。传输的数据包括:①电压值(每周期采样64个点,12位数据)。②电流值(每周期采样64个点,12位数据)。③同步时间信号(取自GPS)。
上位机在接收到这些信息后将会对其进行描点,故障录波,远程传送等处理。12位的电压电流数据都要经过变换,成为16位数据,占一个字节。每通道1秒钟传输的数据在6KB以上,多个通道合计,接口的传输速率至少要40KB/s,这一要求已经超过RS232接口所能提供的传输速率。如果使用CAN总线进行传输,则硬件设备较为复杂。综合比较后,采用PDIUSBD12作为接口芯片进行数据传输是较合适的选择。采用塑料极小封装的PDIUSBD12可以很容易安置在电路板上。而且对上位机的要求也较为宽松,只要有USB接口的计算机都可以作为本系统的上位机。
3 ATMAGE128单片机
3.1 ATMAGE128单片机介绍
ATMAGE128单片机是由ATMEL公司出品的一款高性能低功耗的8位微型控制器,最高时钟频率可以达16MHz。片内集成有容量为128KB的闪存作为程序存储器,4KB的EEPROM,以及4KB的片内存储器,最高可支持64KB的片外存储器。
3.2 开发过程简述
TMAGE128的开发一般是由ATMEL公司提供的免费仿真工具avrstudio完成的,与常用的51单片机略有不同,使用c语言进行开发的时候必须使用第三方编译器对源代码进行编译后才能在仿真环境下运行。本次采用的是icc作为编译器,本文所有的单片机程序都在此环境下运行调试。USB接口器件采用总线控制方式,数据传输形式采用中断传输。USB接口器件在使用上与一个普通的外部存储器相同,所有的控制与数据传输都必须对ATMAGE128中相应的寄存器进行读写操作才能完成。
4 USB驱动程序MCU部分
MCU即设备方控制器,可以是各类型单片机或者是PC,它们的驱动程序在结构上是类似的,而具体的代码,由于使用的系统环境不同,存在较大差异,下面就详细说明以ATMAGE128单片机作为设备方控制器的USB驱动程序结构以及具体实现的代码。
4.1 程序整体结构
对于CPU而言,PDIUSBD12芯片与一个外部存储器完全相同,CPU通过总线控制的方式对PDIUSBD12进行操作。USB接口的传输并不会占用许多CPU资源,CPU可以执行前台操作,而USB接口传输的工作则在后台完成,两者之间通过中断服务程序连接。当PDIUSBD12 从USB 收到一个数据包,那么就对CPU 产生一个中断请求,CPU 立即响应中断。在ISR中固件将数据包从PDIUSBD12 内部缓冲区移到循环数据缓冲区,并在随后清零PDIUSBD12 的内部缓冲区以使能接收新的数据包CPU 可以继续它当前的前台任务直到完成,然后返回到主循环检查循环缓冲区内是否有新的数据,并开始其它的前台任务。无论是上传或者下载数据都是对循环缓冲区内的数据进行处理,主循环只要检查循环缓冲区内是否有要处理的新数据。程序整体结构框图如图1所示。
各模块分工如下:
(1)硬件提取层:对单片机的I/O口、数据总线等硬件接口进行操作。
(2)PDIUSBD12命令接口:对PDIUSBD12器件进行操作的模块子程序集。
(3)中断服务程序:当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并进行相关处理。
(4)标准请求处理程序:对USB的标准设备请求进行处理。
(5)厂商请求处理程序:对用户添加的厂商请求进行处理。
(6)主循环程序:发送USB请求、处理USB总线事件和用户功能处理等。
图1 USB驱动MCU整体结构图
4.2 硬件提取层相关程序
硬件提取层执行对单片机I/O口、数据总线等的操作,包含向PDIUSBD12发送数据或命令的子程序及从PDIUSBD12读取数据的子程序,该部分代码需对地址总线和数据总线进行直接操作。PDIUSBD12的任何操作都是由命令指令和数据指令组合完成的,通过改变A0引脚的电平就可以完成命令模式/数据模式的切换。
4.3 命令接口
该部分是由一系列命令接口子程序构成的,包含了所有PDIUSBD12给出的访问功能接口的命令。在命令接口中调用了硬件提取层中的子程序。PDIUSBD12的所有功能都必须由类似的方法完成,先发送一条命令,然后写该命令的具体参数。有的命令参数是多个字节的,如设置模式命令,此时就必须调用两次写数据线的指令。命令接口程序的编写格式相对固定,按照PDIUSBD12说明书中给出的命令汇总表依次编写即可。
4.4 中断服务程序
中断服务程序代码处理由PDIUSBD12产生的中断,它将数据从PDIUSBD12内部的缓冲区内取出,并建立正确的标志,通知主循环进行处理。当PDIUSBD12向单片机发出中断请求后,单片机调用读取中断寄存器的标准命令接口子程序d12_readinterruptregister( )来决定中断源,然后跳转到相应的中断服务子程序进行处理。中断服务程序从PDIUSBD12收集数据,而主循环程序对数据进行处理。当中断服务程序收集到足够的数据时,它通知主程序已经做好准备等待处理。例如在发送数据包阶段建立包时,中断服务程序将建立包和数据都存入缓冲区内,然后将setup_packet标志送到主循环,这样主循环就可以节省不必要的服务时间。
4.5 总线复位和挂起
当接收到总线复位或挂起的请求时,中断服务程序将bus_set或suspends标志位置位,然后退出。
控制传输总是由建立阶段开始,之后为可选的数据阶段,然后结束于状态阶段。单片机需通过选择控制输出端点来提取建立包的内容来决定端点是为满还是为空。如果控制端点是为满,单片机将从缓冲区内读出内容并将其存入存储区。之后,单片机将从存储区使主设备请求生效。如果是一个有效的请求,单片机需向控制端点发送应答建立命令,以重新使能下一个建立阶段。接下来单片机需要证实传输是控制读还是写,这可以通过建立包重定向的请求类型位来实现。
建立阶段结束后,主机就会执行数据阶段。PDIUSBD12等待接收控制输入包。单片机首先需要读取最后处理状态寄存器清零中断标志位。确认PDIUSBD12处于传输模式后,进行数据包的发送。
当下一个控制输入标志来到时,单片机将确定剩余的字节是否为零。如果已经没有数据要发送,单片机需要发送一个空的包以指示主机数据已经发送完毕。如果建立包的为获得描述符请求,那么建立包中的控制传输将指示此包为控制写类型。在执行完获得描述符请求过程后,单片机处于等待数据阶段。主机发送一个控制输出的标志,单片机从PDIUSBD12缓冲区内减去数据。此时单片机确认PDIUSBD12是否处于USB接收模式,然后单片机通过检查选择控制输出端点确认缓冲区是否已满,并将数据从缓冲区内读出。
4.6 标准请求处理程序
标准设备请求是由USB协议决定的,由主机发出,以数据包的形式传送到单片机。当单片机接收到这些标准设备请求时就转入相应的处理程序。其过程包括:①获取状态。②清除特性。③设置特性。④设置地址。⑤获取设备描述符。⑥设置配置。⑦获取配置信息。⑧获取接口信息。⑨设置接口。⑩同步帧。其中同步帧用来设置和报告一个端点的同步帧,在同步传输中才使用,如果设备不支持这个请求,返回停止标志。
4.7 主循环程序
主循环程序主要功能是设置单片机的初始化,以及设定各个相关子程序的入口。由于使用了中断服务程序和一系列的命令接口子程序,主循环程序中涉及USB接口的部分只是设定相关的寄存器。
5 USB驱动程序上位机部分
5.1 驱动程序基本概念
主机驱动程序的功能是将硬件与用户应用程序连接起来。编写的方法有多种,可以直接与硬件相连接,在应用程序中直接读写系统应将,或者将与硬件直接交换数据的底层工作交给操作系统自动完成,应用程序象读写普通文件一样完成对硬件设备的操作。前一种方法的代码开销少,但是编写的工作量非常大,移植性也较差。后一种方法需要大量库函数支持,但编写较为简单,且移植性好,甚至只需少许修改就可以完成对另一种硬件的支持。在本系统中使用的是由厂商提供的驱动程序,为了充分说明USB系统的工作,还是有必要对主机驱动程序的工作方式做一个介绍。
从驱动程序的角度出发,每个设备都被看成若干个设备对象,这些设备对象的来历各不相同,每个对象都有驱动程序与之对应。它们根据一定的规则组成设备对象堆栈,也就是对应的驱动程序堆栈。处于最底层的是物理设备对象,它一般由总线生成,驱动程序到达这里的时候,总线只是按照标准作一些动作,即可完成对设备物理上的操作。一个设备只能有一个物理设备对象,但可以有若干个其它的设备对象。功能设备对象是由所编写的驱动程序生成的,它负责从逻辑上操作设备。其它的层次设备对象可以处于功能设备对象的上面或下面,它由另一些驱动程序或者其它的系统组件生成,可以记录一些设备信息,但层次设备对象不是必须的。由于驱动程序的这种层次结构,在编写驱动程序的时候不必考虑内存分配、IO端口配置、DMA申请等。Windows将资源申请全部自动化,由总线完成,编写驱动程序时只要考虑控制设备本身即可。
5.2 即插即用设备状态及它们之间的转换
USB接口设备的一个显著特点就是接入或者拔出时不需要关闭主机和重新启动系统,而是可以在系统运行时直接插入或者拔出。这与USB接口的硬件设置有关,USB接口是通过检测接口上拉电阻来判别是否有设备存在的。当然,还必须有相应的驱动程序来完成对此功能的支持。下面就将简要描述一个设备完成即插即用的过程。
用户将设备插入计算机,此时设备还没有被系统检测到。要开始对设备进行软件配置,必须由即插即用管理器以及总线驱动对设备进行枚举。即插即用管理器,有时还可能要在用户模式下的组件工作,检测出设备的驱动程序,包括功能驱动程序以及其它的层次驱动程序。如果此时驱动程序尚未调入,则即插即用管理器调用设备插入例程。驱动程序完成初始化之后,接着必须对设备进行初始化。即插即用管理器调用驱动程序中添加设备的例程来初始化该驱动程序控制的每个设备。当一个驱动程序从即插即用管理器中收到开始设备的请求时,驱动程序使设备启动并且做好处理IO操作。在Windows2000及更高版本的操作系统中,和停止有关的请求只有在重新分配硬件资源的时候才会使用。意外卸载时是指硬件在物理上被卸载(热拔出),驱动程序处理这个请求使系统的损失尽可能降低。硬件卸载时,调用相应的卸载请求,使得该设备在软件上也不可用。如果不对意外卸载进行处理,就有可能造成硬件在物理意义上已不存在,但在系统逻辑中依然存在,造成系统访问该设备的时候出现错误,严重的情况可能会造成处理器进入死循环。当在软件意义上对设备进行停止时,需要等其它请求都操作完毕后才能进行。
5.3 驱动程序结构
USB驱动程序从结构上可以分成两大部分,驱动程序入口以及处理各个事件的例程。驱动程序入口是由系统定义的一组常数,该部分主要完成两件工作:一件是将注册表项复制到一个全局变量中;另一件是给不同的设备事件指示处理例程。剩下的工作就是按照这些设备事件编写各自的例程。这些设备事件主要包括下面几个部分:
(1)打开文件:当用户以打开文件的名义打开设备准备读写的时候,调用该部分例程进行准备。
(2)关闭文件:当用户关闭文件(关闭设备)的时候,调用该例程清扫系统。
(3)即插即用处理:处理即插即用相关的事件,该部分例程包括许多硬件相关的子程序,具体功能见第2节。
(4)处理读操作:当用户读取文件时,调用该例程将接口芯片缓冲区内的信息返回主机。
(5)处理写操作:当用户写文件时,调用该例程将数据以包的形式发送到接口芯片。
(6)设备操作:该部分例程完成对设备硬件的控制,一般含有IO控制码,这些控制码在用户头文件中定义,该例程根据不同的IO控制码,完成对设备的各项控制任务。
(7)驱动程序初始化:当第一次安装硬件时调用该部分例程,创建物理设备对象。对所涉及的各个变量进行初始化。这部分程序一般操作系统中有自带。
(8)驱动程序的卸载:用于清除硬件在系统中留下的痕迹,释放全局变量中注册表路径字符串所占用的内存,将资源归还系统。
(9)电源管理:所有和电源相关的例程都由这里发出,它发出的请求可以是指定一种新的电源状态,或者查询更改一种状态是否可靠。此部分对于总线供电的USB设备较为重要,涉及设备的挂起和唤醒等操作。在本系统中此部分无作用,所有下位机设备都是自供电形式的,设备处于长时工作状态。
5.4 USB设备读写
USB设备的读写操作是大部分用户主要关心的内容。由于设备驱动程序的作用,用户应用程序和USB设备的读写操作变的非常简单,用户打开USB设备就像打开文件一样。这是在添加设备中申请了一个符号链接,并在启动设备例程中将此链接激活而实现的。USB中的读写操作分为四种:
(1)控制型:控制型传输主要为对USB本身的配置,前面所描述的USB配置实际上都是通过控制传输实现的。
(2)批量型:批量型传输用来处理大量的对时间要求不紧迫的数据。底层协议保证了无差错的传输,但不保证传输时延。
(3)中断型:中断型传输对服务时间有较强的限制,但一次传输的数据量不多,主要为一些需要实时相应的消息。
(4)同步型:同步传输可以保证传输时延、保证带宽和保证恒定的数据传输速率,但是在传送失败的情况下。不使用“重试”来传输数据,因而可能会有一定的出错概率。
对USB接口的读写是按照与数据文件读写相同的方式进行的,第一步要打开文件,即打开设备。当用户以打开文件的名义打开设备时,首先要检查设备的状态,看设备是否处于工作状态,设备的接口信息是否已经准备好。接着检查从上面传下来的文件对象的合法性(指针不为空)。然后检查文件名的长度,当为0时,说明打开的只是设备本身;不为0时说明打开的是某个管道,调用管道相关例程,将管道明转换为指向对应管道综合信息的指针即可。读写USB设备实际上是调用同一个传输例程的,所区别的是传输方向符不同,由于通讯双方遵守的都是USB协议,所有的数据包的格式都是一致的,所以这没有什么问题。驱动程序控制的上位机读写过程和单片机的情况类似,所不同的是,单片机使用的接口芯片将数据放入硬件缓冲区内,而上位机的驱动程序则会构建一个虚拟的缓冲区来完成相同的工作。当要发送的数据大于缓冲区的容量时,同单片机的情况一样,也要对数据进行分割。当数据发送完毕之后,例程返回一个发送成功的标志。
5.5 USB上位机应用程序设计简介
编写好驱动程序以后,要在应用程序中调用USB设备,其做法就与调用硬件类似,可以使用WIN32 API函数像调用程序文件一样对设备进行读写,也可以使用如同串口的mscomm那样的控件来实现。由于本系统的上位机程序是用VB开发的,显然调用成品动态链接库能减少很多工作量。这里就调用由广州周立功单片机发展有限公司开发的称为easyd12.dll的动态链接库。
6 结论
USB接口的驱动程序编写是一项繁琐的工作,由于硬件条件的限制,上述程序仅在仿真器上运行通过,无法实地调试,其中必然存在很多漏洞和不足。USB接口本身是并不是为智能仪表开发的,作为批量数据传输用的USB总线在智能仪表上使用显得有些复杂。在更高性能的通用型总线出现以前,为了实现信息的高速传输使用USB还是一个性价比较好的方案。本系统只使用了USB的部分功能,付出的软硬件资源代价却与一个完整功能的USB传输系统没有多大区别。如果能开发出一种比USB总线更简便易用的通用型总线,那一定会引起智能仪表的革命。实际上,现在用驱动程序完成的工作完全可以用纯硬件的方式来实现,不过目前而言,代价必然较大。如果能找到一个方法来直接控制USB接口各个引脚的电平,那么即使用中规模集成电路也可以完成同步串行通讯的工作,遗憾的是,在整个设计过程中,本人始终没有发现这种方法,涉及USB协议以及计算机主板上相关控制器的最底层内容仍然无法洞悉。