基于MAX125芯片和串行总线实现同步数据采集系统的设计

描述

  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协议),

  具体实现电路如图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( FilePointer0)

  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( FilePointer0 || WriteLen1)

  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提供了一种简便易行的外设扩展方案。

  责任编辑:gt


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分