3 应用程序
该应用程序主要负责读取系统硬件所采集的数据,并实时的以波形方式显示出来,同时还可以读取USB设备描述符、配置描述符和下载EZ—USB FX2固件代码的功能。它所使用的编程语言是微软公司的Visual C++。
1)EZ-USB FX2中寄存器CPUCS的第0位控制着增强型8051的复位操作,该位为1则锁定CPU为复位状态;该位为0则结束对CPU的锁定,使其开始正常工作。在该程序中8051的锁定和复位通过使用供应商自定义请求代码IOCTL-Ezusb_VENDOR_REQUEST来实现。其中,CPUCS控制寄存器的地址为0xE600,VENDOR_REQUEST_IN中的bData为1表示锁定,为0则为复位。实现8051锁定的部分代码如下:
- BOOLEAN CUsbhostDlg::usb8051hold
- (HANDLE *phDeviceHandle)
- {
- VENDOR_REQUEST_IN myRequest;
- ……
- myRequest.bRequest=0xA0;//固件加载请求
- myRequest.wValue=0xE600;//cpucs寄存器的地址
- myRequest.wIndex=0x00;
- myRequest.wLength=0x01;
- myRequest.bData=1;//传输的数据值,为1标示锁定,为0表示复位
- myRequest.direction=0x00;
- bResult= DeviceloControl
- (hDevice,
- IOCTL_Ezusb_VENDOR_REQUEST,
- &myRequest,sizeof(VENDOR_REQUEST_IN),
- NULL,
- 0,
- (unsigned long *)&nBytes,
- NULL);
- ……
- }
2)下载程序按钮用于从主机上下载EZ-USB FX2的芯片固件程序,由增强型8051执行。该程序下载的文件类型为.hex,容量小于8 Kb,且仅能下载至FX2的片内RAM 中。其部分代码如下所示。它首先调用UsbOpenDriver来打开指定的USB设备;然后读取所下载文件的内容;最后使用IOCTL_Ezusb_ANCHOR_DOWNLOAD请求完成数据下载。在进行下载之前,要锁定EZ-USB FX2,下载结束后,要使用8051复位来结束锁定。其中的部分代码如下:
- void CUsbhostDlg::OnDownloadFile()
- {
- if(UsbOpenDriver(&hDevice,DeviceName)!= TRUE)
- {
- MessageBox("无效设备,请重试!");
- return ;
- }
- BOOLEAN res1=usb8051hold(&hDevice);
- if(res1==TRUE)
- {
- CFileDialog dlgLoad(
- TRUE,0,0,
- OFN_HIDEREADONLY
- OFN_OVERWRITEPROMPT,
- dlgLoad.m_ofn.lpstrTitle=
- "Anchor Download";
- if(dlgLoad.DoModal()!= IDOK)
- return;
- m_strDldFile= dlgLoad.m_ofn.lpstrFile;
- ……
- bResult= DeviceIoControl(hDevice,IOCTL_Ezusb_ANCHOR_DOWNLOAD,
- buffer,
- numreadfile,
- NULL,
- 0,
- &nBytes,
- NULL);
- ……
- //进行数据传输前,首先通过//IOCTL_Ezusb_RESETPIPE来复位管道6
- bResultl= DeviceIoControl(hDevice,IOCTL_Ezusb_RESETPIPE,
- &input,sizeof(unsigned long),
- NULL,
- 0,
- &nBytes1,
- NULL);
- ……
- //启动接收数据的线程
- g_KeepGoing = true;
- if(_beginthread(ReceiveThreadFunction,0,hDevice)< 0)
- {
- AfxMessageBox("启动接收数据线程失败!");
- }
- }
- }
3)在复位管道6之后,就准备接受数据了,然后调用_beginthread函数来启动接收数据的线程,其函数名是ReceiveThreadFunction。在该线程中,循环向块端点6发出IOCTL_EZUSB_BULK_READ 请求,来读取系统硬件所上传的数据,如果返回的数据长度是512字节,则说明读取数据成功了,同时把这些数据存储在硬盘上。ReceiveThreadFunction函数的部分代码如下所示:
其余部分的代码不再赘述。
- void _cdecl ReceiveThreadFunction(HANDLE hDeviee)
- {
- ……
- //读取数据
- while(g_KeepGoing)
- {
- nBytes = 0;
- bulkContro1.pipeNum = 6;
- g_Transfering= FALSE;
- bResult= DeviceIoControl(hDevice,IOCTL_EZUSB_BULK_READ,&bulkC6ntrol,
- sizeof(BULK_TRANSFER_CONTROL),InBuffer,512,&nBytes,
- NULL);
- ……
- }
- }