具有USB2.0接口的高速数据采集卡设计
iceInterface)进行通信,其主要任务是将采集进来的数据流,根据所需处理功能的要求来完成各种基于Windows程序的处理。
3.1EZ-USBFX2的初始化
通过固件程序的调度,主机才能得到设备的描述符以及完成端点数据的传输。对于固件程序的编程,其基本结构如下:
①初始化,包括处理器和外围电路的初始化;
②主函数,包括完成符合设备特定要求的代码;
③中断处理,包括处理各种中断的程序代码。
总
的来说,固件程序的编写有两种方式。其一,对于熟悉8051汇编语言的用户来说,可以直接利用汇编语言编写结构紧凑、高效率的固件代码;其二,EZ-USB以利用现成的固件程序框架函数,根据设备的需求添加相庆的用户,来完成特定的目的。
为了加快USB接口的开发过程,利用EZ-USBFX2提供的一些框架函数来简化用户代码,使用相应端口(端口2输入,端口6输出)利用EZ-USBFX2的SlaveFIFO结构采用此处理传输,基本的固件程序框架函数如下:
voidTD_Init(void)//该函数用来完成EZ-USBFX2的初始化
{CPUCS=0x10;//工作频率48MHz
IFCONFIG=0xC3;//决定FX2的工作模式(slaveFIFO)及相关设置
IN07VAL=bmEP2;
OUT07VAL=bmEP6;//使能端点2输入和端点6输出
…
EP2FIFOCFG=0x6D;//AUTOOUT=0,AUTOIN=1,WORDWIDE=1
SYNCODELAY;
EP6FIFOCFG=0x75;//AUTOOUT=1,AUTOIN=0,WORDWIDE=1
SYNCDELAY;//对端点2和端点6的配置,WORDWIDE=1配置的是使用16位数据线。
EP2CFG=0xEA;//端点2:输入、批量传输、最大包字节为1024,双缓冲
SYNCDELAY;
EP6CFG=0xAA;//端点6:输出、批量传输、最大包字节为1024、双缓冲
SYNCDELAY;
}
voidTD_Poll(void)//此函数在设备运行时反复被调用,它包括完成用户任务的函数
{
}
BOOLTD_Suspend(void)//该函数在设备进行挂起状态前调用
{
return(TRUE);
}
BOOLTD_Resume(void)//设备重启后调用
{
return(TRUE);
}
在整个固件程序中,EZ-USBFX2设备上电或复位后,首先对所有的内部状态变量初始化,随后调用TD_Init()函数,并开中断,此时固件程序不断检测控制端口0是否收到SETUP包。一旦收到,固件程序就开始调用用户函数TD_Poll(),其中用户需要完成的功能代码就在TD_Poll()函数一。调用完成后,重复检测端口0是否收到SETUP包,若有,继续执行设备请求,调用TD_Poll()函数;否则,检测USB核是否有USB挂起事件,若有,调用TD_Suspend()函数,其返为真时,检测USB核是否有重新开始事件,没有时,设备进入挂起状态,反之,调用TD_Resume(),进行下一次循环;当TD_Suspend()函数返回为假时,直接转入下次循环。
此外,固件程序框架中还定义了许多中断处理函数,当用到时可以在相应的九加入自己编写的代码,这样既清晰又便于理解,用户就可以在不用改变整个程序的前提下,仅仅通过改变相应的模块,来实现自己的功能。
3.2主机软件部分
主机软件部分包括USB客户驱动程序主和机应用程序。USB客户驱程序是支持即插即用功能的标准WDM驱动程序,它为实现控制传输、中断传输和批传输提供了标准接口函数。而主机应用程序的作用在于与操作系统相互作用,当操作系统认为有新设备接入时,就会自动调用相应的设备驱支以。加之该软件需要一个图形用户界面来控制所用的函数,这里采用VC++来编制应用程序,利用CreateFile得到USB句柄,用DeviceIoControl来向设备驱动程序发送请求,完成在EZ-USBFX2中的数据批传输的读取 《具有USB2.0接口的高速数据采集卡设计(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/143680.html
3.1EZ-USBFX2的初始化
通过固件程序的调度,主机才能得到设备的描述符以及完成端点数据的传输。对于固件程序的编程,其基本结构如下:
①初始化,包括处理器和外围电路的初始化;
②主函数,包括完成符合设备特定要求的代码;
③中断处理,包括处理各种中断的程序代码。
总
的来说,固件程序的编写有两种方式。其一,对于熟悉8051汇编语言的用户来说,可以直接利用汇编语言编写结构紧凑、高效率的固件代码;其二,EZ-USB以利用现成的固件程序框架函数,根据设备的需求添加相庆的用户,来完成特定的目的。
为了加快USB接口的开发过程,利用EZ-USBFX2提供的一些框架函数来简化用户代码,使用相应端口(端口2输入,端口6输出)利用EZ-USBFX2的SlaveFIFO结构采用此处理传输,基本的固件程序框架函数如下:
voidTD_Init(void)//该函数用来完成EZ-USBFX2的初始化
{CPUCS=0x10;//工作频率48MHz
IFCONFIG=0xC3;//决定FX2的工作模式(slaveFIFO)及相关设置
IN07VAL=bmEP2;
OUT07VAL=bmEP6;//使能端点2输入和端点6输出
…
EP2FIFOCFG=0x6D;//AUTOOUT=0,AUTOIN=1,WORDWIDE=1
SYNCODELAY;
EP6FIFOCFG=0x75;//AUTOOUT=1,AUTOIN=0,WORDWIDE=1
SYNCDELAY;//对端点2和端点6的配置,WORDWIDE=1配置的是使用16位数据线。
EP2CFG=0xEA;//端点2:输入、批量传输、最大包字节为1024,双缓冲
SYNCDELAY;
EP6CFG=0xAA;//端点6:输出、批量传输、最大包字节为1024、双缓冲
SYNCDELAY;
}
voidTD_Poll(void)//此函数在设备运行时反复被调用,它包括完成用户任务的函数
{
}
BOOLTD_Suspend(void)//该函数在设备进行挂起状态前调用
{
return(TRUE);
}
BOOLTD_Resume(void)//设备重启后调用
{
return(TRUE);
}
在整个固件程序中,EZ-USBFX2设备上电或复位后,首先对所有的内部状态变量初始化,随后调用TD_Init()函数,并开中断,此时固件程序不断检测控制端口0是否收到SETUP包。一旦收到,固件程序就开始调用用户函数TD_Poll(),其中用户需要完成的功能代码就在TD_Poll()函数一。调用完成后,重复检测端口0是否收到SETUP包,若有,继续执行设备请求,调用TD_Poll()函数;否则,检测USB核是否有USB挂起事件,若有,调用TD_Suspend()函数,其返为真时,检测USB核是否有重新开始事件,没有时,设备进入挂起状态,反之,调用TD_Resume(),进行下一次循环;当TD_Suspend()函数返回为假时,直接转入下次循环。
此外,固件程序框架中还定义了许多中断处理函数,当用到时可以在相应的九加入自己编写的代码,这样既清晰又便于理解,用户就可以在不用改变整个程序的前提下,仅仅通过改变相应的模块,来实现自己的功能。
3.2主机软件部分
主机软件部分包括USB客户驱动程序主和机应用程序。USB客户驱程序是支持即插即用功能的标准WDM驱动程序,它为实现控制传输、中断传输和批传输提供了标准接口函数。而主机应用程序的作用在于与操作系统相互作用,当操作系统认为有新设备接入时,就会自动调用相应的设备驱支以。加之该软件需要一个图形用户界面来控制所用的函数,这里采用VC++来编制应用程序,利用CreateFile得到USB句柄,用DeviceIoControl来向设备驱动程序发送请求,完成在EZ-USBFX2中的数据批传输的读取 《具有USB2.0接口的高速数据采集卡设计(第3页)》