摘要:本文介绍了PDIUSBD12芯片的工作性能与特点,利用该芯片,经过硬件设计和软件调试,开发出了一种USB设备接口。该接口适用于虚拟仪器的开发,其性能稳定,可靠性高,具有广阔的应用前景。
关键词:USB接口;PDIUSBD12;固件
USB接口是近年来应用在PC领域的新型接口技术,它基于单一的总线接口技术来满足多种应用领域的需求。它的即插即用、支持热插拔、易于扩展等特性极大的方便了用户的使用,使其成为开发虚拟仪器接口的首选,具有极好的应用前景。本文利用USB的接口芯片PDIUSBD12,经过硬件设计和软件调试,开发了一种USB接口设备。
1、芯片的选择
在进行任何USB设备开发之前,首先应选择适合的USB控制器芯片。目前市场上供应的USB控制器主要有两种:带USB接口的单片机和纯粹的USB接口芯片。带USB接口的单片机从应用上可分为两类:一类是从底层设计专用于USB控制的单片机;另一类是增加了USB接口的普通单片机,选择这类USB控制器的最大好处是开发者对系统结构和指令集非常熟悉,开发工具简单,但对于简单或低成本系统,价格高将会是最大的障碍。纯粹的USB接口芯片仅处理USB通信,必须有个外部微处理器来进行协议处理和数据交换。纯粹的USB接口芯片主要特点是价格便宜、接口方便、可靠性强,尤其适用于产品的改型设计。典型的产品有Philips公司的PDIUSBD11/12、NS公司的USBN9603/9604(并行接口)、NetChip公司的NET2888。这里选择功能强大、支持总线供电和设备自供电两种方式的PDIUSBD12作为接口芯片来设计USBS设备接口。
2、 PDIUSBD12芯片的性能与特点
PDIUSBD12是PHILIPS在USB1.1协议设备端使用最多的芯片之一,此芯片是带有并行总线和局部DMA传输能力的全速USB接口器件。片内集成了高性能的USB接口器件、SIE、FIFO存储器以及电压调整器等,可与任何外部微控制器/微处理器实现高速并行接口。
PDIUSBD12芯片的功能框图如图1所示
图1 D12的功能框图
PDIUSBD12是一款性价比很高的USB器件,它采用28PIN脚模式,有SO28和TSSOP28封装,SIE实现了全部的USB协议层,且完全由硬件实现而不需要固件的参与。其具体功能如下:同步方式识别、并/串转换、比特填充/解填充、CRC校验/生成、PID确认/生成、地址识别和握手信号的鉴定/生成、批处理数据传输可达1MB/s,3±0.3V双极性输入范围,可接受4.5~5.5V工作电压、工业级标准工作环境温度范围为-40~+85℃。利用该芯片可以高效地完成微控制器所送出的信号到USB规范的信号的转换。
3、 USB设备接口的硬件设计
利用PDIUSBD12芯片来实现USB接口,允许设计者挑选一种适合的微控制器进行开发。设计者可以根据需要和实际情况进行合理选择。这样,不仅减少了开发成本,而且大大缩短了开发周期。本设计采用了80C51作为微控制器,由于80C51是应用比较广泛的一种单片机微控制器,具有比较成熟的软件开发平台,且大多数电子工程师对其指令操作比较熟悉。因此,使用者可以利用比较熟悉80C51进行核心程序的设计,即用80C51来实现数据传输的功能,而具体的数据信号的转换则由PDIUSBD12来完成。
USB设备接口的硬件设计主要以PDIUSBD12为中心,设计它与USB物理接口及微控制器(80C51)之间的连接。这里采用总线供电方式设计全速USB设备接口,其接口电路如图2所示:
图2 USB设备接口电路
当P27=1时,80C51给PDIUSBD12发命令;当P27=0时,向PDIUSBD12写数据或从PDIUSBD12读数据。PDIUSBD12的GL_N接LED,对其工作状态进行监控,LED在USB被连接时会发光,在进行数据传输时会闪烁,LED常亮或一直不亮说明USB接口有问题。R1,R2是串联终端电阻。L1,L2是磁珠,分别串联在电源和地中,USB总线电源从L1引入。如果是设备自供电,可以不接L1。对于自供电设备的电源必须要与总线的电源进行隔离,自供电电源与USB总线的电源之间只能共地,同时设备不能通过USB口向VBUS输出电流。PDIUSBD12片内集成了6MHz—8MHZ时钟乘法PLL,这样就可以使用低成本的6MHZ晶振,EMI也随之降低。同时,PDIUSBD12的时钟输出可以作为微处理器的外部晶振输入。
4、 USB设备接口的固件程序设计
USB设备接口固件的开发在整个USB接口设计中具有举足轻重的地位。设备接口硬件需要软件的协同来完成相应的工作,然而固件的编制并不受具体微处理器种类的限制。对于开发者而言,接口硬件的工作是不可见的,可见的是接口固件在控制整个接口时所做的工作。
PDIUSBD12的固件设计成完全的中断驱动,当CPU处理前台任务时,USB的传输可在后台进行。这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。后台ISR(中断服务程序)和前台主程序循环之间的数据交换通过事件标志“EPPFLAGS”和Setup包数据缓冲区“CONROL_XFER”来实现,其原理如图3所示。
图3 前后台工作原理
对于这种结构,主循环不用考虑数据的来源,只要检查循环缓冲区内需要处理的新数据。这样,主循环可以专注于数据的处理,而ISR能够以最大可能的速度进行数据的传输。
D12固件编写成分层结构简洁且易于修改和测试,既增加了代码的可读性,又增加了程序的通用性。固件的积木式结构如图4所示。
图4 固件结构和数据流向
各模块程序的分工如下:
硬件提取层:对单片机的I/O口、数据总线等硬件接口进行操作。
PDIUSBD12命令接口:对PDIUSBD12器件进行操作的模块子程序集。
中断服务程序:当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并设定事件标志“EPPFLAGS”和Setup包数据缓冲区“CONROL_XFER”传输给主循环程序。
标准请求处理程序:对USB的标准设备请求进行处理。
厂商请求处理程序:对用户添加的厂商请求进行处理。
主循环程序:发送USB请求、处理USB总线事件和用户功能处理等。
下面是固件程序主循环的部分代码:
#include<reg51.h>
#define D12_COMMAND (*(unsigned char xdata*)0xff01)
#define D12_DATA (*(unsigned char xdata*)0x7f02)
extern void D12_int();
sbit D12_suspend=P3^4;
sbit D12_int_n=P3^2;
void main(void)
{
unsigned char ist;
P3=0xff;
D12_COMMAND=0xf3;
D12_DATA=0x06;//设置模式0
D12_DATA=0x03;//初始化频率
D12_COMMAND=0xd0;
D12_DATA=0x80;//设置地址0使能
D12_COMMAND=0xf3;//连接主机
D12_DATA=0x16;
While(1)
{ if(!D12_int_n)
{ D12_int(); }
}
}
5、 USB设备接口数据通信的两个阶段
USB设备接口的一系列状态转换和不同类型的数据传输共同构成了USB数据通信的两个阶段,即列举阶段和应用阶段。列举阶段是指主机与设备在进行实际数据交换之前,主机了解设备并根据设备要求进行系统配置的阶段。为了进行列举,所有设备的接口必须都支持控制传输、标准USB请求和端点0功能。
应用阶段是指主机和设备进行实际数据交换的通信过程。经过了列举过程,应用阶段显得相对简单 。在主机一侧,应用程序可以用标准的Windows API函数从指定的设备读取数据或将数据写入设备。在设备一侧,主要工作是对配置过的端点进行端点操作,同时对一些寄存器的状态进行实时处理。数据传输使用HID规定的控制、中断两种传输类型,每一种类型都有适合特殊用途的格式和协议。
6、 结束语
本文详细介绍了基于PDIUSBD12的USB设备接口的设计,从硬件设计及软件调试两方面讨论了设备接口的设计方法。这种通用USB设备接口适用于基于USB总线的虚拟仪器,以及各种现场测试环境,使设备实现了真正意义上的即插即用,简洁方便,可靠性高,具有广阔的应用前景。