完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通用串行总线(USB,Universal Serial Bus)是现代PC数据传输的发展趋势,PC的所有外设,包括键盘、鼠标、显示器、打印机、录音机、数字音响、电视机顶盒、数码相机、扫描仪、MODEM及各种多媒体音频、视频设备均可通过USB接口接入PC。USB总线同步数据采集系统即为这种总线接入系统。
|
|
|
|
硬件方案
本系统采用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: |
|
|
|
软件接口程序
虽然Win95 OSR2.1 支持USB,但微软推荐在win98或win2000上使用USB。软件部分由WDM驱动程序和应用程序组成。对于USB客户驱动程序,主要是与 USBDI打交道,下面的代码完成了对于IRP_MJ_READ和IRP_MJ_WRITE的响应。 ///////////////////////////////////////////////////////////////////////////// // U***gatherRead: // // Description: // Handle IRP_MJ_READ requests // // Arguments: // Pointer to our FDO // Pointer to the IRP // IrpStack-》Parameters.Read.xxx has read parameters // MdlAddress (direct I/O) // // Return Value: // This function returns STATUS_XXX NTSTATUS U***gatherRead( 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 = U***DoInterruptTransfer( dx, Irp-》AssociatedIrp.SystemBuffer, ReadLen); BytesTxd = ReadLen; } // 完成 IRP CompleteIrp(Irp,status,BytesTxd); UnlockDevice(dx); return status; } ///////////////////////////////////////////////////////////////////////////// // U***gatherWrite: // // 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 U***gatherWrite( 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; U***SendOutputReport( dx, *pData); } // 完成 IRP CompleteIrp(Irp,status,BytesTxd); UnlockDevice(dx); return status; } 应用程序采用标准的文件操作方法。使用CreateFile API打开文件。使用WriteFile API发出开始命令,启动ADC,使用ReadFile读回采样值。 |
|
|
|
USB数据采集系统设计上严格遵循USB1.1协议,实现了USB的即插即用特性,可热插拔,使用便捷;扩展能力强,可扩展多达127个外设,总带宽达12Mbs;实现容易,为特殊设计PC提供了一种简便易行的外设扩展方案。
|
|
|
|
只有小组成员才能发言,加入小组>>
23145个成员聚集在这个小组
加入小组948 浏览 1 评论
1099 浏览 1 评论
12516 浏览 0 评论
5930 浏览 3 评论
17723 浏览 6 评论
1026浏览 1评论
1023浏览 1评论
951浏览 1评论
4790浏览 1评论
1099浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 04:02 , Processed in 0.842579 second(s), Total 56, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号