USB-GPIB控制器的硬件电路设计
扫描二维码
随时随地手机看文章
USB是PC体系中一套全新的工业标准,通用可编程接口GPIB(General Programmable Interface BUS),是Cy-press公司在其EZ-USB FX以及FX2系列单片机里设计的一个可由用户编程的接口,具有快速、灵活等特点;可使用多种协议完成与外围器件的无缝连接,如EIDE/ATAPI、IEEE1284、Utopia等。对其可以根据需要进行编程,且运行中不需要CPU的干预,仅通过一些CPU标志和中断与增强型8051内核通信。作为自动化测试仪器的互联标准历史悠久,使用广泛,组建费用低廉且操作方便,特别是连接台式机的时候尤其显得灵活高效。在很多对测试速度要求不高以及对测试仪器体积不作要求的情况下,GPIB总线也有相当的优势。因此,将USB所具有的独特优点引入到以GPIB为标准的自动测试系统中,设计基于USB总线的GPIB控制器,对提高便携式和无外接插槽的自动测试系统整体性能有很大促进作用。
1 系统总体设计方案
硬件电路的设计分为硬件和固件两部分。硬件要实现PC机与USB芯片的通信以及USB与GPIB接口逻辑之间的通信;同样,固件也要满足USB接口和GPIB逻辑协议。设计思路就是USB接口与PC机实现通信,并且提供给GPIB的信号线,最终建立两者之间的通信,硬件总体框图如图1所示。
USB主芯片选取了Cypress公司CY7C68013控制芯片,芯片结构如图2所示。CY7C68013集成了以下特性:USB2.0收发器、SIE(串行接口引擎)和增强型8051微处理器;8051程序从内部RAM开始运行;4个可编程BULK/INTERRUPT/ISOCH-RONOUS端点;8位 16位外部数据接口;通用可编程接口(GPIF);3.3V电源系统;矢量USB中断;独立的数据缓冲区供SETUP和DATA包控制传输;集成I2C控制器,频率可达100或400 kHz;4个FIFO,可与ASIC和DSP等无缝连接;专门的FIF0和GPIF自动矢量中断。
美国NI公司推出的TMS9914控制芯片是一款高性能CMOS的GPIB接口专用芯片,满足IEEE488协议的要求;工作在TMS9914模式下,能够将GPIB母线上的信号按照GPIB协议进行解码和译码转换为用户可用的格式,同时将用户发过来控制GPIB的信号进行处理,按照协议要求发送到GPIB母线上;内部有16个寄存器,分成两组,一组是只写寄存器,有8个;另一组是只读寄存器,有8个。TMS9914内部各个寄存器的状态决定或标志着芯片及GPIB的工作状态。在GPIB接口设计中,只有通过编程对寄存器进行正确编排,才能实现对GPIB的各种操作。
2 硬件设计
2. 1供电方式
设计中采用了USB总线供电方式。USB接口从PC机能获取的电压为5V,而USB控制芯片CY7C68013的工作电压为3.3V,GPIB控制芯片TMS9914的工作电压为5V,所以本设计中选用了Maxim公司的MAX882进行电压变换。从PC经USB电缆到B端口来的5V电源,
经去耦合和滤波电路后直接提供给系统中要求在5V正常工作的芯片,如TMS9914、75LS160、75LSl62等;而经MAX882分压后得到3.3V则提供给USB控制芯片CY7C68013以及LVC245。这样就可保证整个控制器正常工作。电路中的SN7524,是专门为USB接口电路设计的,抑制USB数据线的瞬时电气噪声,如图3所示。
2.2 外接EEPROM电路
系统上电后,USB内核首先检查I2C总线上是否有EEPROM。如果有,并且其第一位数据是0xC2,则EZUSB FX2将EEPROM中的内容全部拷贝到内部RAM中,然后重列举,并开始执行RAM中的固件程序。由于CY68013芯片已经将I2C总线集成,设计转化为对I2C总线上挂接的EEPROM的设计;由于采用的是24LC64的EEPROM,整个串行I2C总线电路实现的原理如图4所示。
3 固件程序设计
本设计针对的主芯片CY7C68013是以软件为框架的IC。CY7C68013芯片的固件开发所使用的集成开发环境为KEIL μVision2,编程语言为德国Keil公司的C51。把编辑、编译、汇编、连接、调试等各阶段都集成在一个程序内,先用编辑器编写程序,接着调用编译器进行编译、连接后直接运行,因此可以缩短开发周期。
固件程序负责处理PC机发来的各种请求,主要负责设备与外围电路进行数据传输。完成一个完整的事务传输,除了开发环境Keil包括的文件,还需要Fw.c(固件架构原是程序代码)、Dscr.a51(USB描述符表)、Ezusb.lib(EZUSB函数库对象程序代码)、Periph.c(用户函数,也就是设计中实现GPIB功能要编写的函数)以及相关的中断跳转函数USBjmpTB.OBJ。功能函数里的TD_Poll()负责完成用户指定的功能,应该包括一个执行用户外围功能的状态机。从这个函数返回的话,高优先级的任务应该首先执行。
void TD_Poll(void)
if(!(EP2468STAT&bmEP2EMPTY)){
if(!(EP2468STAT&bmEP6FULL))//判断端点2的FIFO缓冲区是否满
{APTRlH=MSB(&EP2FIFOBUF);//自动指针1
APTRlL=LSB(&EP2FIFOBUF):
AUTOPTRH2=MSB(&EP6FIFOBUF);//自动指针2
AUTOPTRL2=LSB(&EP6FIFOBUF);
count=(EP2BCH<<8)+EP2BCL;
for(i=0x0000;l<count;i++){
EXTAUTODAT2=EXTAUTODAT1;//将端点2中断的数据复制到端点6
}
EP6BCH=EP2BCH;//设置端点6的字节数
SYNCDELAY;
EP6BCL=EP2BCL,
SYNCDELAY:
EP2BCL=0x80;} //设置端点6的字节数
}