基于EZ-USB的数据采集与控制*

2006-05-07 15:49:40来源: 互联网

1 概述

在目前PC的I/O模式中,外围设备通常被映射为CPU的I/O地址空间,并且被分配一个指定的IRQ(中断请求),在某些情况下也可以是一个DMA通道。这些系统资源被分配给指定的外围设备。这种地址分配的方法已经成为一种标准,软件开发者要根据这对指定的设备进行访问。这给编程者带来了不便,同时外设消耗了PC的许多系统资源,使许多系统资源不可使用,并且产生了很多冲突,由此造成了许多问题。

Cypress推出的带智能USB接口的单片机EZ-USB,极大地降低了USB外设的开发难度,为PC外设的制造商提供了一性能的优良、价格较低的设计方案。基于EZ-USB的强大功能,让我们看到了应用USB的美好前景。使用该芯片后,我们在很短的时间内便实现了基于USB传输的采集系统。为便于理解,有必要介绍一下相关的USB知识。

1.1 USB信息包

USB传送的数据包由被称为Packet Ids(PIDs)的特定代码所定义,PID表示了正在被传送的包的类型。USB的包中一类有四种PID类型,如表1所列。

表1 USB PID

PID类型

PID名称

数据信号 IN、OUT、SOF、SETUP、DATA0、DATA1
握手信号 ACK、NAK、STALL
特殊信号 PRE

图1举例说明了USB传输。包(1)是一个由OUT标志表示的输出信号,表示主机发出的数据将要通过总线进行传送。包(2)由数据组成,它由DATA1标志表示。包(3)是一个由外设发送的握手信息包。外设使用ACK(确认)标志向主机报告外设已正确地接收数据。接下来发出的OUT信号(4),开始进行第二次传输。紧跟其后的是数据包,这一次使用的是DATA0标志。最后,设备通过传送握手信息包中的ACK标志表示接收成功。

为什么要用到DATA0与DATA1两种数据标志呢?这是因为USB的设计者对待错误的检测非常严格。如前面提到的,ACK握手信号是一个向主机报告外设无差错接收数据的信号(包中的CRC位用于错误检测)。但是如果在传输过程中,握手信号本身出了错,那又该怎么办呢?为了检测这种错误,在主机和外设双方都保留了一个数据轮换位,它在数据信息包的传送过程中轮流改变其状态。内部轮换位的状态与随数据到达的PID相比较,要么是DATA0,要么是DATA1。当传送数据时,主机或设备发出交替的DATA0-DATA1标志。通过比较数据PID和内部轮换位,主机或设备能够检测到一个出错的握手信号包。

    SETUP令牌只针对控制传输。它是数据包中的前8个字节,通过这几个字节外对主机的设备请求进行解码。

SOF信号每ms发生1次,代表1个USB帧的开始。

3个握手信号:ACK、NAK和STALL。

*ACK表示“成功”,即数据无误接收。

*NAK表示“忙,重发”。NAK看上去好像表示“出错”,但其实不是。USB设备不响应,才表示传输有错误。

*STALL表示有意外事件发生。设备发出STALL握手信号,表明它不能接受某个设备请求,或是外部终端出错,或是主机企图访问一个并不存在的资源。该状态有些像“停止”,但要好一些,因为USB提供了从STALL状态中恢复的方法。

PRE(Preamble)PID的传送优先于一个USB低速(1.5 Mbps)传输。EZ-USB系列仅支持USB高速(12 Mbps)传输,因此可以忽略PRE信息包及接下来的低速传输。

1.2 USB主控制器

在USB系统中,主机是控制器。USB设备回应主机的请求,但USB设备之间不能互送信息。当主机向USB外设发送数据时,主机发出1个OUT信号。外设如果有时间接收数据,并接收无误,就返回1个ACK信号给主机;如果忙,就返回1个NAK信号;如果发现错误,就不返回信号,主机过一段时间地重发。USB设备从不主动给主机发送数据。然而,在EZ-USB芯片中,没有什么可以防止8051把要发送给主机的数据放到端点缓冲器以用于传输,但数据会一直留在缓冲器中,直到主机发出1个IN信号到那个端点。如果主机不发出IN信号,数据就一直留在那里。

1.3 USB的方向

如果知道了主机是控制器,就很容易记住USB的方向:OUT表示从主机到外设,IN表示从外设到主机。例如,送数据给主机的端点是IN端点,即EZ-USB送数据到IN端点缓冲器。也就是说,8051的OUT就是对主机的IN。

1.4 帧

USB主机通过每1ms传送1个SOF(起始帧)包,向所有USB设备提供时间基准。SOF包包括一个递增的、11位的帧计数器。8051可以从两个EZ-USB寄存器中读该帧计数器。SOF时间对同步端点具有意义。EZ-USB内核为同步端点数据服务提供给8051一个中断请求。

1.5 USB设备的加载过程

当USB设备接入HUB(集线器)后,主机控制器和主机软件能自动侦测到设备的接入。然后,主机软件读取一系列的数据用于确认设备特征,如Vendor ID、Product ID、接口工作方式、功率消耗等参数。之后,主机分配给外设一个单独的地址。地址是动态分配的,各次可能不同。在分配完地址之后,对设备进行初始化,初始化完成以后,就可以对设备进行I/O操作了。

2 EZ-USB的端点和描述符

EZ-USB芯片具有软配置特性。通过USB接口从主机下载的8051代码和数据被存放在内部RAM。使用EZ-USB的外设,可以在无ROM、EPROM或FLASH存储器的情况下操作。为支持软配置的特性, 当USB设备没有固件时,EZ-USB芯片自动进行枚举,所以USB接口本身可用来下载8051代码和描述符。

一个叫“ReNum”的EZ-USB控制位决定是SIE内核还是8051处理端点0上的设备请求。开机时,RENUM位是0,表明EZ-USB内核自动处理设备请求。一旦8051运行,它就置RENUM=1,表明使用下载的8051代码处理接下来的设备请求。

以下是枚举模式。

当EZ-USB芯片脱离复位状态时,EZ-USB芯片根据I2C总线上的外部EEPROM的内容,对如何枚举做出描述。如表2所列,其中VID表示厂家识别码,PID表示产品识别码,DID表示设备识别码。

表2 EZ-USB枚举方式

EEPROM的第一个字节

EZ-USB内核的处理

既不是0xB2也不是0xB0 由EZ-USB 内核提供描述符,PID/VID/DID。置RENUM=0
0xB0 由EZ-USB 提供描述符,由EEPROM提供PID/VID/DID。置RENUM=0
0xB2 将EEPROM的内容写入EZ-USB的RAM,置RENUM=1。由8051提供描述符,PID/VID/DID

(1)如果没有EEPROM或EEPROM的第一字节,既不是0xB0也不是0xB2。EZ-USB芯片使用其内部存储的描述符数据枚举,它包含Cypress半导体的VID、PID、DID。这些ID字节使主机操作系统装载Cypress半导体设备驱动程序。

USB主机在枚举过程中询问设备,读取设备描述符并使用表2字节决定下载哪一个固件驱动程序到操作系统。

(2)如果串行EEPROM与I2C总线相连且每一个字节的0xB0,EZ-USB芯片使用内部存储的描述符数据枚举。但是,由外部的EEPROM提供6字节的PID/VID/DID数据,它使主机操作系统装载与之有关的设备驱动程序。

(3)如果EEPROM的第一字节是0xB2,EZ-USB内核将EEPROM的内容写到内部RAM。EZ-USB内核置RENUM位为1,表明8051(而不是EZ-USB内核)通过控制端点0对设备请求作出应答。当然,所有的描述符数据,包括VID/DID/PID的值,由8051固件提供。

3 EZ-USB的传输类型

EZ-USB支持四种传输类型,可满足不同的通信要求。

(1)块传输。块传输用于支持突发的大量的数据,以8、16、32或64字节的信息包传送。

(2)中断传。中断传输用于量少且不经常传送的周期性数据。中断数据的包长限制在64。字节内。

(3)同步传输。同步传输主要用于音频和视频数据流,不具USB定义的格式。

(4)控制传输。控制传输应用于控制命令和状态命令的传送。

4 EZ-USB内核在块(bulk)传输中的作用

在每一个USB设备中都有1个串行接口引擎(SIE)。SIE与USB数据线D+和D-相连,传输发向或来自USB设备的字节。在块传输中,SIE对PID信息包解码,并通过CRC位对数据进行错误检测,然后发送有效数据。如果SIE发现1个出错的数据,它会自动地不进行响应,而不是提供1个PID握手信号,并告诉主机延时重发。

块传输是异步传输,采取了使用ACK和NAK握手PID的数据流控制机制。SIE通过发出1个NAK,向主机报告其“busy”状态。当外设传送数据成功,它就会要求SIE发送一个ACK信号,表示发送成功。

SIE接收来自USB设备的数据和控制信号,将它们变为USB传输格式,并通过2根USB数据线传送。因为USB传输采用的编码方式是NRZI(反向归零制)编码方式,所以,SIE还必须在位数据流的适当位置上插入位,以确保数据发送的完整性。这种做法称为“位填充”,它由SIE完成。

EZ-USB芯片采用软配置,即包含内部程序/数据RAM。EZ-USB可作为USB设备进行连接,将程序下载到内部RAM,这一切都是由改进后的SIE完成。SIE能够用内部描述符表进行枚举操作。

5 EZ-USB块传输

为了简化设计,我们采用了块传输方式进行数据的采集。因此,在制定设计方案前,必须对块传输的特点有一个深入的了解。

块传输用于支持突发的大量的数据,对连续性不做要求,如打印数据。它可以利用任何可获得的带宽:

(1)以可获得的带宽访问总线;

(2)总线错误导致传送失败时,可以重发;

(3)可以保证数据传送,但不能保证传送的带宽和延迟。

仅当有可获得的带宽地,块传输才会发生。当空闲带宽很多时,块传输进行得较快;空闲带宽少时,可能在很长时间内不发生块传输。

(1)块传输的包长限制及使用的端点

USB规格说明允许块传输数据的最大信息包长度为8、16、32或64字节。EZ-USB为0~7IN和0~OUT16个端点中的每一个提供了最多能容纳64字节的缓冲区。

(2)与块传输相关的控制位及寄存器

块端点中有6个端点:2-IN、4-IN、6-IN、2-OUT、4-OUT它6-OUT可与下一个连续编号的端点配对,以提供双缓冲器。这就允许8051为一个数据信息包服务,而另一个正确过USB进行传输。6个端点的成对位(USBPAIR寄存器)控制双缓冲器。

8051在初始化时,设置了14个端点有效位(IN07VAL、OUT07VAL寄存器),以及1个2位的控制和状态(CS)寄存器。8051可读取CS寄存器中的位,以判定端点是否忙,并写入另一位强制进入端点STALL状态。当设置端点忙位时,8051绝对不能读写端点缓冲器或字节计数器。

当为8051服务的端点变忙时,EZ-USB内核设1个中断请求位。为了自动把控制权移交到为端点请求服务的ISR(中断服务程序),EZ-USB中断向量系统要对端点发出的中断请求继续划分。

(3)BULK IN传输

USB的BULK IN数据从设备流向主机。主机通过向EZ-USB内核发出1个IN标志,请求1次IN传输,当EZ-USB准备好时响应数据。8051通过装载端点的字节计数器表明准备好。如果EZ-USB内核接收到1个未准备好的端点的IN信号,它将用NAK握手信号响应IN信号。

在BULK IN传输中,8031在端点缓冲器中已装入了1个数据信息包,然后在端点字节计数寄存器中装入信息包的字节数,以协助下一个IN传输的进行。这时设置了BUSY位。主机发出1个IN信号。EZ-USB内核通过传送IN端点缓冲器中的数据响应IN信号。当BZ-USB发出一个表示数据接受正确的ACK信号时,EZ-USB内核清除端点的BUSY位,并设置它的中断请求位,告诉主机端点缓冲器为空。如果这是一个多信息包传输,那么主机将发出另一个IN信号,以得到下一个信息包。

如果第二个IN信号在8051有时间装满端点缓冲器之间到达,EZ-USB将发出1个NAK握手信号,表示忙。主机继续发出IN信号,直到数据准备好。最终,8051将端点缓冲器装满数据,并将信息包的字节数装入端点的字节计数寄存器(INnBC),为下一次的传输做准备。

(4)BULK OUT传输

USB BULK OUT数据从主机到达外设。主机通过向EZ-USB发出一个紧跟在数据信息包后的OUT信号,请求一次OUT传输。如果EZ-USB内核正确地接收数据,那么EZ-USB内核响应ACK信号。如果端点没有准备好接收数据,EZ-USB丢掉主机的OUT数据并返回一个NAK信号,表明没有准备好。相反地,主机将继续发出OUT信号和数据给端点,直到EZ-USB内核响应ACK信号。

每一个EZ-USB的BULK OUT端点都有一个字节计数寄存器,它有两个作用。8051读取字节寄存器,以确定来自主机的最后一次OUT传输期间,接收了多少字节。8051写字节计数器(用任何值),告诉EZ-USB内核已经完成了从缓冲器中读字节的动作,使缓冲器能够接收下一个OUT传输。

(5)错误恢复

EZ-USB内核自动检查错误,如果它用建立在USB上的错误检测器件(CRC检测和数据替换)时,发现错误,就请求主机再次传输数据。

6 程序设计

我们采用EZ-USB系列单片机的AN2131QC芯片实现块传输的应用。AN2131QC芯片采用80引脚的封装,除了具有24个I/O引脚外,还包含1个16位地址总线和1个8位数据总线,以用作外部存储器的扩展。在该芯片内部有1个8KB的RAM,使得固件可以从主机下载。

BULK传输源程序清单:

;-----------------------------------------------------------

$NOMOD51 ;取消默认的8051寄存器定义

$nolist

$include(.inc) ;EZ-USB寄存器申明

$list

NAME ezbulk

ISEG AT 60H ;堆栈段

STACK:DS20 ;申明使用20个堆栈单元

CSEG AT 00h

LJMP START

ORG 200h

START:MOV SP,#STACK-1 ;设置堆栈指针

LOOP:MOV DPTR,#OUT2CS;EP2IN控制和状

;态寄存器

MOVX A,@DPTR

JB ACC.1,LOOP;检查“忙”位,为

;低时允许进行服务处理

MOV DPTR,#IN2CS;EP2OUT控制和

;状态寄存器

MOVX A,@DPTR

JB ACC.1,LOOP ;检查是否处于“忙”

;状态,为“1”时表示忙

service_IN2:

MOV DPTR,#OUT2BC

MOVX A,@DPTR

MOV R2,A

MOV DPTR,#OUT2BUF

MOV R3,DPL

MOV R4,DPH

MOVX A,@DPTR

MOV DPTR,#IN2BUF

MOV R5,DPL

MOV R6,DPH

MOVX @DPTR,A

DEC R2

LOOP1:MOV DPL,R3

MOV DPH,R4

INC DPTR

MOVX A,@DPTR

MOV R3,DPL

MOV R4,DPH

MOV DPL,DPH

MOV DPL,R5

MOV DPH,R6

INC DPTR

MOVX @DPTR,A

MOV R5,DPL

MOV R6,DPH

DJNZ R2,LOOP1

MOV DPTR,#OUT2BC;装载任意值到

;字节计数器,以清除输入缓冲区

MOVX A,@DPTR

MOVX @DPTR,A

MOV DPTR,@IN2BC;将收到的数据通过

;EP2IN发送出去

MOVX @DPTR,A ;写发送字节计数器

SJMP LOOP

END

编辑: 引用地址:http://www.eeworld.com.cn/designarticles/control/200605/1741.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部

小广播

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved