微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于PDIUSBD12的USB数据采集系统的设计

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

时间:01-31 来源:互联网 点击:

成:第一、初始化单片机和所有的外围电路(包括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连接提供了一种参考。

参 考 文 献:

[1]边海龙,贾少华. USB2.0设备的设计与开发[M].北京:人民邮电出版社,2004年1月.

[2]陈军波,刘海华,陈亚光.USB接口芯片PDIUSBD12及应用[J].国外电子元器件,2002第11期.

[3]程 谰,杨子杰. 基于PDIUSBD12的USB设备的固件程序开发[J]. 计算机应用,2004年第7期.

[4]周立功. PDIUSBD12固件编程与驱动开发[M].北京:北京航空航

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top