FPGA/DSP > DSP系统 > 详情

基于PDIUSBD12的USB数据采集系统的设计

发布时间:2020-06-28 发布时间:
|

1引 言

随着计算机微处理器芯片性能的高速发展,计算机逐渐在各种领域中广泛使用,但随之而来的问题是计算机本身软硬件资源的严重不足。为节省计算机的软硬件资源,USB接口应运而生。

USB在诞生之初便面对许多已趋成熟

的计算机接口的挑战,这既要求它有对于其他接口的明显优势,并不断完善,才可能被广大用户接受。表1[1]是USB和其他常见总线在几个参数上的比较。

表1  USB及其他常用总线的比较

USB的优势特点:

(1)速度快。高速模式速率为12Mbps,低速模式速率也可达到1.5Mbps。USB2.0理论上传输率可以达到480Mbps。

(2)安装配置容易。USB设备支持即插即用,支持热拔插。系统对其进行自动配置,不占用中断资源或者DMA资源。USB为接缆和连接头提供了单一模型,解决了插槽紧张问题。

(3)易于扩展。用USB连接的外围设备数目最多达127个,通过集线器可以使外设距离达到12米。

(4)总线供电。USB总线提供最大达5V,500mA电流,对于功耗较小的设备来说这是非常有效的。

(5)使用灵活。USB共有4种传输模式以适应不同设备的需要。

(6)价格便宜。实现USB功能的模块具有低廉的价格。

2 接口芯片PDIUSBD12[2]介绍

PDIUSBD12是Philips公司推出的一种并行接口芯片,它支持多路复用、非多路复用和DMA并行传输。芯片遵循协议USB1.1,支持不同用途的传输类型。PDIUSBD12需要外接微控制器(MCU)来进行协议处理和数据交换,它对MCU没有特殊的要求,因此设计者可以选择适合类型的MCU对芯片进行控制,也可以利用Philips公司的固件结构来做开发。

图1 PDIUSBD12内部结构

PIDUSBD12内部含有集成收发器接口,可通过端口电阻直接连接到USB通信电缆。PDIUSBD12片内集成有3.3V调节器,可给收发器提供电源。该电压可以外接1.5kΩ的上拉电阻作为输出,也可以连接内部集成的1.5kΩ的上拉电阻作为SoftConnectTM的内部电源;由于片内集成了6~48MHz 倍频PLL,因此只需外接低频晶振就可工作,EMI会相应降低。

位时钟恢复电路将时钟从USB数据流中恢复出来,还可以对频率漂移和信号抖动进行跟踪。

SIE(串行接口引擎)能完整地执行USB协议,它已经被完全固化在芯片内部,因此不需要任何固件干涉。这一部分包括同步识别、并行/串行转换、CRC检测/产生、PID确认/产生、地址识别以及握手评定/产生。

SoftConnect(软连接)可通过MCU将指令发到D+(全速设备)来实现。PDIUSBD12的初始化在MCU发命令之前完成。下一次连接无需拔出USB线就可完成。

对MCU来说,PDIUSBD12是一个有8位数据总线和1位地址线的存储设备,它支持地址数据总线复用、非地址数据总线复用以及DMA数据传输方式。

当外设经PDIUSBD12连接到集线器后,集线器就会检测外设的连接状态并向主机报告。一旦发现有设备连接,主机就发送一系列请求给集线器,使得集线器在主机和设备之间建立一个通信通道。然后主机开始列举设备,列举成功后,主机即可从外设获得相关的配置信息对外设进行配置。只有经过配置以后的外设才能被主机识别,并能和主机进行通信。

3 硬 件 设计

此数据采集系统的硬件框图如图2所示。由于USB的协议框架比较大,所以MCU使用带有8kEPROM的89C52。USB接口芯片为 PDIUSBD12。89C52和D12的连接有独立的地址数据总线方式和复用的地址数据总线方式。由于PDIUSBD12既要接受来自89C52的命令又要和89C52进行通信,而他们使用共同的接口D[0…7],所以D12地址的含义是对命令和数据的选择。在第一种方式中,用A0脚表示地址位:A0为 1表示命令,A0为0表示读写的是数据,将它与89C52的一个IO口相连。在发送命令(数据)前先对A0进行置1(0),然后再把命令(数据)的内容送到数据总线上。此时,D12的ALE脚未使用,可直接接地。而我们在此处是使用第二种连接方式,命令和数据使用不同的地址,地址字节中仅LSB位具有实际意义。对偶数地址赋值表示送往D12的是读/写数据,对奇数地址赋值表示往D12写入一个命令。这种接法中,D12的ALE与89C52的ALE相连,ALE的时序关系与89C52跟一般存储器相连相同,在下降沿对地址锁存。此时,A0不使用,应该接高电平。89C52的P0口直接与D12的数据总线相连,作为并行数据和命令传输通道。它的时钟可以直接从D12的CLKOUT接入,而不需要外接晶振。

图2 硬件框图

单片机采集外界模拟量,转换成数字量,再经过PDIUSBD12通过USB接口传送给PC机。这其中主要的难点是89C52和PDIUSBD12之间的通信问题,所以我们把主要精力集中在USB协议这一部分上,重点调通它们之间的通信。

4 软 件 设 计

4.1固件设计[3][4]

USB单片机固件程序通常由三部分组成:第一、初始化单片机和所有的外围电路(包括PDIUSBD12);第二、主循环部分:这部分是可中断的;第三、中断服务程序,可以立即执行。根据USB协议,任何传输都是由主机开始的,这样单片机作它的前台工作,等待中断。主机首先要发令牌包给USB设备(这里是PDIUSBD12),PDIUSBD12接收到令牌包后就给单片机发中断,单片机进入中断服务程序,首先读PDIUSBD12的中断寄存器,判断 USB令牌包的类型,然后执行相应的操作,因此USB单片机程序主要就是中断服务程序的编写。在 USB单片机程序中要完成对各种令牌包的响应,其中比较难处理的是SETUP包,主要是端口0的编程。

单片机与PDIUSBD12的通信主要是靠单片机给PDIUSBD12发命令和数据来实现的。 PDIUSBD12的命令字分为三种:初始化命令字、数据流命令字和通用命令字。PDIUSBD12给出了各种命令的代码和地址。单片机先给PDIUSBD12的命令地址发命令,根据不同命令的要求再发送或读出不同的数据。因此,可以将每种命令做成函数,用函数实现各个命令,以后直接调用函数即可。

在编写USB的单片机固件程序时,需要注意:

单片机的中断应设置为电平触发;中断后一定要读上次传输状态寄存器(命令40-45H),以清除中断寄存器中的中断标志。这样PDIUSBD12的中断输出才能变回高电平,这一点非常重要。

4.2驱动程序[4]

尽管系统已经提供了很多标准接口函数,但编制驱动程序仍然是USB开发中最困难的一件事情,通常采用Windows DDK来实现。目前有许多第三方软件厂商提供了各种各样的生成工具,像 Compuware的driver works,Blue Waters的Driver Wizard等,它们能够很容易地在几分钟之内生成高质量的USB 的驱动程序。作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的 WIN95的VXD方式的驱动程序不同。它是WDM类型的。

在调试USB设备时,可使用UsbView程序检测设备是否能被Windows枚举并配置,如果成功,还可在该程序中查看设备描述符、配置描述符和端点描述符是否正确,之后可以使用Driver Wizard生成一个通用驱动程序,在Windows提示安装驱动程序时,选择Driver Wizard生成的驱动程序。其实Driver Wizard生成的仅是一个Windows控制台的应用程序,它会调用安装Driver Wizard时安装在系统中的通用USB驱动程序。使用该程序就可测试设备是否能够正确传输数据以及传输速度。该程序也可作为最终产品USB传输部分的框架;如果不能满足要求,也可用WDM重新编制驱动程序,用调试好的USB设备来开发、调试主机软件。

4.3用户程序

用户程序是系统与用户的接口,它通过通用驱动程序完成对外设的控制和通信。主机用户程序的编写使用VC编译环境下的API函数实现。程序中主要用到两个API函数:CreateFile( )和DeviceIoControl( )。首先查找设备,打开设备的句柄:调用Win32函数CreatFile( )得到设备驱动程序的句柄。然后进行读写和控制操作:调用Win32函数DeviceIoControl()通过得到的句柄把IOControlCode 和相关的输入输出缓冲区提交给驱动程序。最后关闭设备句柄:当退出用户程序时,用CloseHandle ( )关闭设备。

4.4软件设计框图及主要程序框架

图3   固件结构和数据流向

这里只给出主循环程序和中断程序的主要框架:

void main (void)

{

         init_port ( );                  //初始化I/O口

         init_timer0 ( );               //初始化定时器0

         init_special_interrupts ( );   //设置中断

         reconnect_USB( );      //重新连接USB

while ( TRUE )

         {

if (bEPPflags.bits.timer)

//定时器溢出,检测按键状态

                   if (bEPPflags.bits.bus_reset)

//总线复位处理

                   if (bEPPflags.bits.suspend) 

//挂起改变处理

                   {

                            if(D12SUSPD == 1)   

//挂起处理

                   }

if(bEPPflags.bits.setup_packet)

//Setup包处理

                   {

                            control_handler( );   

//调用请求处理子程序

                   }

         }

}

void control_handler( )      //请求处理子程序

{

if (type == USB_STANDARD_REQUEST) //调用标准请求

                   ( *StandardDeviceRequest [ req ] ) ( );

}

5 总 结 

此数据采集系统已经应用于一种自主开发的近红外光谱仪中,它满足此近红外光谱仪采集速度快的要求。以上方案为中小型智能仪器和计算机的高速USB连接提供了一种参考。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于NI Scope实时数据采集系统设计