引言
USB是近年来应用在PC领域的新型接口技术,是一些PC大厂商,如Microsoft、Intel等为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信的标准,自1995年在Comdex上亮相以来至今已广泛地为各PC厂家所支持。现在生产的PC几乎都配备了U SB接口,Microsoft的Windo ws98、NT以及MacOS、 Linux、FreeBSD等流行操作系统都增加了对USB的支持。
USB的主要优点:
- 使用方便。连接外设不必再打开机箱。允许外设热插拔,而不必关闭主机电源。
- 速度快。USB接口的最高传输率可达12Mb/s,提供低速方式速率为1.5 Mb/s,扣除用于总线状态控制和错误检测等数据传输最大理论速度,也能达到1.2 Mb/s和9.6 Mb/s。
- 接灵活一个USB口理论上可以连接127个。USB设备连接的方式也十分灵活,既可以使用串行连接也可以使用集线器Hub把多个设备连接在一起,再同PC机的USB口相接。
- 独立供电。USB接口提供了内置电源。
现在的USB生产厂商很多,几乎所有的硬件厂商都有USB的产品。USB控制器一般有两种类型,一种是MCU集成在芯片里面的,如Intel的8X930AX,CYPRESS的EZ-USB,SIEM ENS的C541以及MOTOLORA、National、Semiconductors等公司的产品。另一种就是纯粹的USB接口芯片仅处理USB通信,如PHILIPS的PDIUSBD11(I2C接口)、PDIUSBP11A 、PDIUSBD12(行接口),NationaSemicon ductor的USBN9 602、USBN9 603、USBN960等,前一种由于开发时需要单独的开发系统,因此开发成本较高,而后一种只是一个芯片与MCU接口实现USB通信功能,因此成本较低而且可靠性高。本文主要介绍PHILIPS公司的PDIUSBD12器件。
1 PDIUSBD12芯片特点和内部结构
PDIUSBD12是一个性能优化的USB器件,通常用于基于微控制器的系统并与微控制器通过高速通用并行接口进行通信,也支持本地DMA传输。该器件采用模块化的方法实现一个USB接口,允许在众多可用的微控制器中选择最合适的作为系统微控制器。允许使用现存的体系结构并使固件投资减到最小。这种灵活性减少了开发时间、风险和成本,是开发低成本且高效的USB外围设备解决方案的一种最快途径。PDIUSBD12完全符合USB1.1规范,也能适应大多数设备类规范的设计,如成像类、大容量存储类、通信类、打印类和人工输入设备等,因此,PDIUSBD12非常适合做很多外围设备,如打印机、扫描仪、部大容量存储器(Zip驱动器)和数码相机等。现在用SCSI实现的很多设备如果用USB来实现可以直接降低成本。
PDIUSBD12挂起时的低功耗以及LazyClock输出符合ACPI、OnNOW和USB电源管理设备的要求。低功耗工作允许实现总线供电的外围设备。
PDIUSBD12还集成了像SoftConnect 、GoodLink、可编程时钟输出、低频晶振和终端电阻等特性所有这些特性。都能在系统实现时节省成本,同时在外围设备上很容易实现更高级的USB功能。
1.1 主要特性
- 符合USB 1.1协议规范
- 集成了SIE FIFO存储器、收发器和电压调整器的高性能USB接口芯片
- 适应大多数设备类规范的设计
- 与任何微控制器/微处理器有高速(2MB/s)的并行接口
- 完全自动DMA操作
- 集成了320 B的多配置FIFO存储器
- 主端点有双缓存配置,增加吞吐量容,易实现实时数据传输
- 在块传输模式下有1MB/s的数据传输率,在同步传输模式下有1Mb/s的数据传输率
- 有总线供电能力,有非常好的EMI性能
- 在挂起时有可控制的LazyClock输出
- 可通过软件控制USB总线连接SoftConnect
- 在USB传输时有闪亮的USB连接指示灯GoodLink
- 时钟频率输出可编程
- 符合ACPI OnNOW和USB电源管理要求
- 具有内部上电复位和低电压复位电路
- 有SO18和TSSOP28封装
- 能在40~85℃工业级工作
- 片内8kV静电保护
- 双电压工作(3.3 0.3 V)或扩大的5 V电压范围(3.6~5.5 V)
- 多多中断模式方便块传输和同步传输
1.2 内部结构
PDIUSBD12的内部框图如图1所示
图1 PDIUSBD12内部结构框图
- 模拟收发器。集成的收发器直接通过终端电阻与USB电缆接口
- 电压调整器。片上集成的1个3.3 V电压调整器为模拟收发器供电,也提供连接到外部1.5 kΩ上拉电阻的输出电压。作为选择,PDIUSBD12提供集成1.5 kΩ上拉电阻的SoftConnect技术
- PLL。片上集成1个6~48 MHz的倍频PLL(锁相环),允许使用6 MHz的晶振,EMI也由于使用低频晶振而减小。PLL的工作不需要外部器件。
- 位时钟恢复位。时钟恢复电路用4倍过采样原理从输入的USB数据流中恢复时钟,能跟踪USB规范中指出的信号抖动和频率漂移。
- PHILIPS串行接口引擎PSIE。 PHILIPS的SIE完全实现USB协议层。考虑到速度,它是全硬件的,不需要固件微程序介入。这个模块的功能包括:同步模式识别、并/串转换、位填充/不填充、CRC校验、PID确认、地址识别以及握手鉴定。
- SoftConnect。高速设备与USB的连接是靠把D通过1个1.5 kΩ的上拉电阻接到高电平来建立的。在PDIUSBD12中,这个上拉电阻是集成在芯片内的,缺省是没有连接到VDD,这个连接是靠外部MCU发一个命令来建立的。这使得系统微处理器可以在决定建立USB连接之前完成初始化。重新初始化USB总线连接也可以不用拔掉电缆来完成
- GoodLink。 GoodLink是靠一个引脚接发光二极管实现的。在USB设备枚举时LED指示灯将立即闪亮:当PDIUSBD12被成功枚举并配置时,LED指示灯将会始终亮,经过PDIUSBD12的USB数据传输过程中,LED将一闪一闪,传输成功后LED熄灭。在挂起期间,LED熄灭。这种特性可以使我们知道PDIUSBD12的状态,方便电路调试。
- 存储器管理单元MMU和集成RAM 。MMU和集成RAM能缓冲USB(工作在12Mb/s)数据传输和微控制器之间并行接口之间的速度差异,这允许微控制器以自己的速度读写USB包。
- 并行和DMA接口并行接口。容易使用、速度快并且能直接与主微控制器接口。对于微控制器,PDIUSBD12可以看成是一个有8位数据总线和1位地址线的存储设备。PDIUSBD12支持多路复用和非多路复用的地址和数据总线。在主端点端点2和局部共享存储器之间也可使用DMA(直接存储器存取)传输。它支持单周期模式和块传送模式两种DMA传输。
2 PDIUSBD12的引脚说明及典型连接
2.1 PDIUSBD12引脚说明
PDIUSBD12引脚如图2所示,引脚如表1所列。
图2 PDIUSBD12的引脚图
表1 PDIUSBD12引脚说明
2.2 PDIUSBD12的典型连接
PDIUSBD1与80C51的连接电路如图3所示。在这个例子中,ALE始终接低电平,说明采用单独地址和数据总线配置。A0脚接80C51的任何I/O引脚,控制是命令还是数据输入到PDIUSBD12 。80C51的P0口直接与P D I U S B D 1 2的数据总线相连接,CLKOUT时钟输出为80C51提供时钟输入。
图3 PDIUSBD12与80C51的连接电路图
3 软件设计
3.1 单片机方面软件设计
对于单片机控制程序,目前没有任何厂商提供自动生成固件(firmware)的工具,因此所有程序都要由自己手工编制。USB单片机控制程序通常由三部分组成:第一,初始化单片机和所有的外围电路(包括PDIUSBD12)。第二,主循环部分,其任务是可以中断的。第三,中断服务程序,其任务是对时间敏感的,必须马上执行。根据USB协议,任何传输都是由主机(host)开始的,这样,单片机作它的前台工作,等待中断。主机首先要发令牌包给USB设备(这里是PDIUSBD12), PDIUSBD12接收到令牌包后就给单片机发中断,单片机进入中断服务程序,首先读PDIUSBD12的中断寄存器,判断USB令牌包的类型,然后执行相应的操作。因此,USB单片机程序主要就是中断服务程序的编写。在USB单片机程序中要完成对各种令牌包的响应,其中比较难处理的是SETUP包,主要是端口0的编程。
单片机与PDIUSBD12的通信主要是靠单片机给PDIUSBD12发命令和数据来实现的。PDIUSBD12的命令字分为三种:初始化命令字、数据流命令字和通用命令字。PDIUSBD12给出了各种命令的代码和地址。单片机先给PDIUSBD12的命令地址发命令,根据不同命令的要求再发送或读出不同的数据。因此,可以将每种命令做成函数,用函数实现各个命令,以后直接调用函数即可 。
在编写USB的单片机程序时,需要注意:
- 单片机的中断应设置为电平触发,中断后一定要读上次传输状态寄存器(命令40-45H),以清除中断寄存器中的中断标志。这样,PDIUSBD12的中断输出才能变回高电平,这一点非常重要。
- 在接收到Setup包后,一定要调用ACK setup命令重新使能端口0。
- 在向IN端点写完数据后,一定调用ValidateBuffer(命令FAH)指明缓冲区中的数据有效,可以发送到主机。
- 当读完数据后,一定调用Clear Buffer(命令F2H)以保证可以接收新的包。
- 可以通过调用Read Chip ID(命令FDH)检查PDIUSBD12是否工作。该命令要读两个字节数据。
USB初始化过程为:
- Set Address Enable
- Set Endpoint Enable(此时LED亮)
- Disconnect
- delay (1~2 s)
- Connect(即用43h参数调用SetMode,此时LED灭)
- Read Interrupt Register
完成初始化工作后,就可作其它的前台工作了,并在前台判断是否有Setup包(通过一个变量,当中断服务程序检测到有Setup包时,设置该变量),然后执行响应的控制传输。
在调试USB单片机程序时,还要特别注意Windows对USB设备的枚举顺序:
- GetDeviceDescriptor。主机主要对Length域感兴趣,发送内容一定要正确,特别是第2字节type一定为0x01,即Device,否则,主机将不响应,或者再重复2次后放弃。可检查一下对EP0的RX、TX的设置次序。
- SetAddress。一般为02或03
- 连续3次GetDeviceDescriptor,读取全部设备描述符,一般为18 B,分为多次传输。如果不正确,主机将不响应或重复2次后放弃
- GetConfigDescriptor。注意第2字节一定为0x02,即config
- GetStringDescriptor(可能没有),根据在设备描述符中是否有String索引而定。一般先读取LanguageID,再读取product string
- 读取全部ConfigDescriptor,次数根据描述符的大小决定(端点个数不同,描述符大小不同),如果不正确,主机将不响应或再重复2次后放弃
- 如果以上步骤都正确,主机将找到新设备,提示安装驱动程序,否则找到未知设备,不可用。安装驱动程序后,以后的每次PlugIn,枚举次序与以上步骤略有不同,之后会有SetConfiguration、GetConfiguration和GetInterface等调用
3.2 主机方面软件设计
Windows98提供了多种USB设备的驱动程序,但好像还没有一种是专门针对数据采集系统的,所以必须针对特定的设备来编制驱动程序。尽管系统已经提供了很多标准接口函数,但编制驱动程序仍然是USB开发中最困难的一件事情,通常采用Windows DDK来实现。目前有许多第三方软件厂商提供了各种各样的生成工具,像Compuware的driverworks, Blue Waters的Driver Wizard等,它们能够很容易地在几分钟之内生成高质量的USB的驱动程序。作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的WIN95的VXD方式的驱动程序不同。它是WDM类型的。
在调试USB设备时,可使用UsbView程序检测设备是否能被Windows枚举并配置,如果成功,还可在该程序中查看设备描述符、配置描述符和端点描述符是否正确。之后可以使用Driver Wizard生成一个通用驱动程序,在Windows提示安装驱动程序时,选择Driver Wizard生成的驱动程序。其实Driver Wizard生成的仅是一个Wind ows控制台的应用程序,它会调用安装Driver Wizard时安装在系统中的通用USB驱动程序。使用该程序就可测试设备是否能够正确传输数据以及传输速度。该程序也可作为最终产品USB传输部分的框架,如果不能满足要求,也可用WDM重新编制驱动程序,用调试好的USB设备来开发、调试主机软件。