网站首页
IC库存
IC展台
电子资讯
技术资料
PDF文档
我的博客
IC72论坛
ic72 logo
搜索关键字: 所有资讯 行业动态 市场趋势 政策法规 新品发布 技术资讯 价格快报 展会资讯
  • 达普IC芯片交易网 > 新闻中心 > 最新产品 > 正文
  • RSS
  • 基于USB总线的多路同步数据采集系统
    http://www.ic72.com 发布时间:2007/12/12 14:58:53

      摘要:本文针对计算机外设通过通用串行总线(USB)接口接入问题,设计了USB总线的数据同步采集系统,配以相应USB接口驱动程序,可实现各种计算机外设即插即用地接入。

      关键词:USB,同步数据采集,SIE 

    The Multi-channel synchronal data collecting system based on USB
    Zhao Li Bai Zhitao Wang peng
    (Xi’an Sunfield Digital Science &Technology Co.,Ltd., Xi’an 710075)

    Abstract This Paper discussed how to design a computer perpheral via USB,and demonstrated a Multi-channel synchronal data collecting system based on USB, which can realize PC perpheral’s plug&play. with USB interface driver
    Keyword USB synchronal data collecting SIE

        1. 引言

      通用串行总线(USB,Universal Serial Bus)是现代PC数据传输的发展趋势,
    PC的所有外设,包括键盘、鼠标、显示器、打印机、录音机、数字音响、电视机顶盒、数码相机、扫描仪、MODEM及各种多媒体音频、视频设备均可通过USB接口接入PC。USB总线同步数据采集系统即为这种总线接入系统。

        2. 硬件方案

      本系统采用MAXIAM公司的MAX125四路12位同步采集芯片,只需一个

      启动信号即可实现同步采集、数据转换,完成后给出一个转换完成信号,可从端口依次读取A/D转换数据,送入单片机处理;USB接口芯片采用PHILIPS公司的PDIUSBD12,此芯片单片集成SIE、FIFO存储器、收发器及电压变换器,
    并严格遵从USB1.1协议,PHILIPS SIE完成USB协议层,并且完全高速硬连接,无须任何软件干预。此模块功能包括:同步模式识别,并/串转换,位填充/解填充,CRC检验/产生,PID确认/产生,地址识别,握手响应/产生;类似于控制其它接口芯片(如并口芯片)一样控制此接口芯片,单片机将A/D转换结果送至PIDUSBD12,PIDUSBD12将自动完成通过USB接口传输数据至PC的功能(按USB1.1协议),

        3. 软件接口程序

      虽然Win95 OSR2.1 支持USB,但微软推荐在win98或win2000上使用USB。软件部分由WDM驱动程序和应用程序组成。对于USB客户驱动程序,主要是与USBDI打交道,下面的代码完成了对于IRP_MJ_READ和IRP_MJ_WRITE的响应。


    /////////////////////////////////////////////////////////////////////////////
    // UsbgatherRead:
    //
    // Description:
    // Handle IRP_MJ_READ requests
    //
    // Arguments:
    // Pointer to our FDO
    // Pointer to the IRP
    // IrpStack->Parameters.Read.xxx has read parameters
    // User buffer at: AssociatedIrp.SystemBuffer (buffered I/O)
    // MdlAddress (direct I/O)
    //
    // Return Value:
    // This function returns STATUS_XXX

    NTSTATUS UsbgatherRead( IN PDEVICE_OBJECT fdo,
    IN PIRP Irp)
    {
    PUSBgather_DEVICE_EXTENSION dx = (PUSBgather_DEVICE_EXTENSION)fdo->DeviceExtension;
    if( dx->IODisabled)
    return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED, 0);
    if (!LockDevice(dx))
    return CompleteIrp( Irp, STATUS_DELETE_PENDING, 0);

    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS status = STATUS_SUCCESS;
    ULONG BytesTxd = 0;

    // 得到参数
    LONGLONG FilePointer = IrpStack->Parameters.Read.ByteOffset.QuadPart;
    ULONG ReadLen = IrpStack->Parameters.Read.Length;

    // 检查文件指针
    if( FilePointer<0)
    status = STATUS_INVALID_PARAMETER;
    else
    {
    status = UsbDoInterruptTransfer( dx, Irp->AssociatedIrp.SystemBuffer, ReadLen);
    BytesTxd = ReadLen;
    }

    // 完成 IRP
    CompleteIrp(Irp,status,BytesTxd);
    UnlockDevice(dx);
    return status;
    }

    /////////////////////////////////////////////////////////////////////////////
    // UsbgatherWrite:
    //
    // Description:
    // Handle IRP_MJ_WRITE requests
    //
    // Arguments:
    // Pointer to our FDO
    // Pointer to the IRP
    // IrpStack->Parameters.Write.xxx has write parameters
    // User buffer at: AssociatedIrp.SystemBuffer (buffered I/O)
    // MdlAddress (direct I/O)
    //
    // Return Value:
    // This function returns STATUS_XXX

    NTSTATUS UsbgatherWrite( IN PDEVICE_OBJECT fdo,
    IN PIRP Irp)
    {
    PUSBgather_DEVICE_EXTENSION dx = (PUSBgather_DEVICE_EXTENSION)fdo->DeviceExtension;
    if( dx->IODisabled)
    return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED, 0);
    if (!LockDevice(dx))
    return CompleteIrp( Irp, STATUS_DELETE_PENDING, 0);

    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS status = STATUS_SUCCESS;
    ULONG BytesTxd = 0;

    // 得到参数
    LONGLONG FilePointer = IrpStack->Parameters.Write.ByteOffset.QuadPart;
    ULONG WriteLen = IrpStack->Parameters.Write.Length;

    if( FilePointer<0 || WriteLen<1)
    status = STATUS_INVALID_PARAMETER;
    else
    {
    // 仅写一个字节
    BytesTxd = 1;
    PUCHAR pData = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
    UsbSendOutputReport( dx, *pData);
    }

    // 完成 IRP
    CompleteIrp(Irp,status,BytesTxd);
    UnlockDevice(dx);
    return status;
    }

      应用程序采用标准的文件操作方法。使用CreateFile API打开文件。使用WriteFile API发出开始命令,启动ADC,使用ReadFile读回采样值。

    4. 结束语

      USB数据采集系统设计上严格遵循USB1.1协议,实现了USB的即插即用特性,可热插拔,使用便捷;扩展能力强,可扩展多达127个外设,总带宽达12Mbs;实现容易,为特殊设计PC提供了一种简便易行的外设扩展方案。




    www.ic72.com 达普IC芯片交易网
  • 行业动态
  • 市场趋势
  • 政策法规
  • 新品发布
  • Baidu

    IC快速检索:abcdefghijklmnopqrstuvwxyz0123456789
    COPYRIGHT:(1998-2010) IC72 达普IC芯片交易网
    客户服务:service@IC72.com 库存上载:IC72@IC72.com
    (北京)联系方式: 在线QQ咨询:点击这里给我发消息 联系电话:010-82614113 传真:010-82614123
    京ICP备06008810号-21 京公网安备 11010802032910 号 企业资质