1 前言
USB(Universal Serial Bus,通用串行总线)作为PC史上最成功的接口之一,它不仅成为PC的标准接口,而且发展成为消费类电子、移动设备的标准接口。它具有安装方便、高速、灵活、低成本、易扩展,支持热插拔等优点,已经逐渐成为现代数字设备进行数据传输主要接口标准。
C8051F020是高集成的单片机系统,它集成了模/数控制器,外部存储器,和串行通讯接口,但是没有集成USB控制器;USBN9604是遵循USB1.1标准的USB端点控制器,如果把两者集合到一起,把C8051F020的高速数据采集和USB的接口的优点集合起来,将大大提高数据采集系统的性能和数据传输效率。
2 芯片特点
2.1 C8051F020微控制器
C8051F020系列器件使用Silicon Labs的专利CIP-51微控制器内核。CIP-51与MCS-51TM
指令集完全兼容,可以使用标准803x/805x的汇编器和编译器进行软件开发。CIP-51 内核具有标准8052的所有外设部件,包括5个16 位的计数器/定时器、两个全双工UART、256 字节内部RAM、128 字节特殊功能寄存器(SFR)地址空间及8/4个字节宽的I/O 端口。
C8051F020系列MCU对CIP-51内核和外设有几项关键性的改进,提高了整体性能,更易于在最终应用中使用。
2.2 USB控制器USBN9604[2]
USBN9604是National Semiconductor公司设计生产的一款较新型的专用USB通信控制芯片,它支持12Mbps全速传输,4种传输方式和总线供电方式,可满足USB1.0和1.1协议。它具有8位并行接口,可支持DMA、MICRWIRE/PLUS接口,能适应大多数设备规范的设计,可以广泛应用于很多外围设备。芯片提供了3种访问外部数据的方式:非复用并行方式、复用并行方式和MICRWIRE方式。其主要特点如下:
1) 外部24MHZ晶振,因为芯片内部有倍频电路,因而内部可得到48MH时钟。
2) 可编程时钟发生器能产生不同频率的时钟,可以作为外部器件(如CPU)提供的时钟信号。
3) 带有串行引擎接口(SEI),包含物理层接口和介质访问控制层协议,支持USB1.0和USB1.1协议。
4) 带有7个端点的USB功能控制器,每个端点对应一个FIFO。其中端点0是双向控制端点,另有3个发送端点和3个接收端点。除端点0外其余端点缓存区都是64字节。
USBN9604内部有64个映射到内存的寄存器,主要有主控制寄存器(MCTL)、时钟配置寄存器(CCONF)、主事件寄存器(MAEV)、ALT事件寄存器(ALTEV)、接收事件寄存器(RXEV)和发送事件寄存器 (TXEV)以及各端点的控制寄存器和收发数据及状态寄存器等。固件的大部分功能就是完成对此寄存器组的读写,实现对接口的配置、接口状态的转换以及数据在外设和计算机之间的传输等。
3 USB接口的扩展
C8051F020专门提供了丰富的I/O端口,它可以提供8个8位的数字接口,其中P0、P1、P2、P3为低端口,它既可以按位寻址,也可以按字节寻址,C8051F020丰富的数字资源(UART、SMBUS、SPI、PCA、定时器)均要通过交叉开关配置到4个低端口才能使用。P4、P5、P6、P7为高端口,它只能按字节寻址,C8051F020虽工作电压为2.7-3.6V,但其I/O端口均与TTL电平兼容。对于外部扩展存储器和存储器映射的I/O设备可采用总线复用模式和非复用模式扩展。
USBN9604与微控制器的并行连接有两种方式:即非复用方式和复用方式。它们可通过设置引脚MODE0、MODE1来选择。当MODE0和MODE1连接低电平时USBN9604采用非复用模式;当MODE0接高电平,MODE1接低电平时采用复用方式。在非复用方式时,可用控制引脚CS、RD、WR、地址引脚A0和双向数据线D[7:0]实现相应的地址读写。而在复用方式时,则使用控制引脚CS、RD、WR、地址锁存信号ALE和双向数线D[7:0]实现其地址读写。
本设计采用总线复用方式进行数据交换。图1所示是C8051F020单片机和USBN9604的接口电路,该电路由一片C8051F020单片机、USB控制芯片USBN9604、时钟振荡电路以及相应的外围电路组成。其中USBN96O4通过外部中断INT与单片机进行通信。
图1为低端口复用总线扩展实例。数据总线和低8位地址总线共享相同的端口引脚:AD[7:0],地址锁存信号ALE连接到USBN9604的A0引脚,用于控制USBN9604内部地址锁存寄存器,保持低8位地址。通过交叉开关的特殊寄存器将数据总线和数据总线定义到相应的端口。当我们在选用总线复用模式,用低端口作为扩展外部数据存储器总线时需要做以下工作:
1) 用外部存储器接口(EMIF)设置寄存器EMIOCF选择端口:EMIOCF.5置0,将P3、P2、P1、P0选用外部扩展总线。
2) 选择复用方式:将EMIOCF.4置0,定义复用方式。定义P3.7-P3.0为数据总线D7-D0和低8位复用地址总线A7-A0,P2.7-P2.0定义为高8位地址总线A15-A8,P0.7定义为写控制(WR),P0.6定义为读控制(RD),P0.5定义为ALE。
图1 C8051F020单片机和USBN9604接口电路示意图
3) 选择存储器模式:用EMIOCF.3-2,选择EMIF的工作模式,当EMIOCF.3-2为01时外部存储器接口工作在不带块选择的分片方式,在这种模式下寻址低于4K 边界的地址时访问片内存储器,寻址高于4K 边界的地址时访问片外存储器,也就是说该设备的寄存器地址范围是0X1000-0X10FF。
4) 设置外设接口时序:外设读写时序通过EM0TC特殊寄存器设置,EM0TC.7-6设置EMIF地址建立时间,EM0TC.5-2设置EMIF的WR和RD脉冲宽度,EM0TC.1-0设置EMIF地址保持时间。
所以通过上面步骤我们设置EMIF的相关特殊寄存器为以下值:
EMI0CF = 0x07; //使用低端口,复用方式以不带片选方式工作
EMI0TC =0x21; //地址建立时间为0,RD/WR持续时间为9个系统时钟周期,地址保持时间为1个系统周期。
在设置EMIF之后,我们读取USBN9604的寄存器就像读取普通外部数据存储器一样。我们可以这样编写对USBN9604读取的函数:
#define USBN9604 (byte xdata *)(0x1000)
extern void write_usb(byte adr,byte dta)
{
*(USBN9604 +adr)= dta;
}
byte read_usb(byte adr)
{
return *(USBN9604+adr);
}
4 设备固件(firmware)设计
USB接口的程序包括三个基本的部分:①初始化,这部分程序用来对单片机C8051F020、USB控制芯片USBN9604和所有外围电路进行初始化;②主循环,发送USB请求、处理USB总线事件和用户事件处理;③中断服务程序,对USBN9604产生的中断进行处理。
初始化程序中对USBN9604的初始化包括:①进行软件复位,它不影响时钟输出,相当于一个硬件复位;②设置中断方式,确定中断输出是高电平有效还是低电平有效;③设置缺省地址,这是由于USB规范规定设备在总线为其分配地址之间要以0作为缺省地址;④设置中断屏蔽,在USBN9604中各个端点的发送数据、接收数据和发送NAK握手包等事件可能产生中断;设置中断屏蔽这个步骤确定了哪一个端点的哪一种事件能够产生中断。
设备固件是设备运行的核心,其主要功能是控制芯片USB9604接受并处理USB驱动程序的请求(如请求设备描述符、请求或设置设备状态、请求设备设置、请求或设置设备接口等供10种USB1.1标准请求)。描述符包括设备描述符和配置描述符,USB规范给出了它们的格式,想要计算机正确识别设备并安装驱动程序,这些描述符必须根据具体设备的情况填写。如果这些设置正确,这时该已经成为一个USB设备,能够被计算机正确识别。由于Windows XP自带了多种USB驱动程序,所以现在一般不用开发USB驱动程序,用其自带的USB驱动程序即可正确和PC进行通讯,用户只需开发应用软件即可。
5 结论
基于USB外设的应用目前在国内处于高速发展阶段,利用USB进行数据采集和工业控制已得到成功应用,虽然随着USB协议2.0,特别是无线USB协议的推出,USB总线发生了巨大的变化,但是基于USB1.1协议的数据采集系统在工业应用中仍占主导地位。该方案经实验证明正确有效,能够应用于多种数据采集系统,具有重要的应用价值。