2024年4月11日发(作者:)

11

章 上位机程序开发

173

pXmitBuf, iXmitBufSize,

pXmitBuf, iXmitBufSize,

&dwReturnBytes, ov);

return pXmitBuf;

}

17.设置电源接口IOCTL_ADAPT_SET_DEVICE_POWER_STATE

设置电源接口IOCTL_ADAPT_SET_DEVICE_POWER_STATE用于设置EZ-USB设备的

电源状态,其使用示例代码如下。

DWORD dwBytes = 0;

UCHAR pwrState = 0;

DeviceIoControl(hDevice, IOCTL_ADAPT_SET_DEVICE_POWER_STATE,//DeviceIoControl函数

&pwrState, sizeof (pwrState),

&pwrState, sizeof (pwrState),

&dwBytes, NULL);

其中,参数hDevice表示当前USB设备的句柄,参数pwrState表示电源状态码,参数

IOCTL_ADAPT_SET_DEVICE_POWER_STATE表示使用该接口进行通信。

18.设置传输字节接口IOCTL_ADAPT_SET_TRANSFER_SIZE

设置传输字节接口IOCTL_ADAPT_SET_TRANSFER_SIZE用于设置EZ-USB的传输字

节,其使用示例代码如下。

DWORD BytesXfered;

SET_TRANSFER_SIZE_INFO SetTransferInfo;

ntAddress = Address; //地址

erSize = 0x2000; //8 KB传输字节

DeviceIoControl(hDevice, IOCTL_ADAPT_SET_TRANSFER_SIZE, //DeviceIoControl函数

&SetTransferInfo, sizeof (SET_TRANSFER_SIZE_INFO),

&SetTransferInfo, sizeof (SET_TRANSFER_SIZE_INFO),

&BytesXfered, NULL);

11.1.2 CyAPI控制函数类

Cypress的cyioctl接口控制函数只是提供了基本的USB控制及传输操作,一般用于测试

USB设备的连接。如果需要进行更加详细的控制操作,则需用使用CyAPI控制函数类。

CyAPI控制函数类提供了更为精细的控制接口来读写EZ-USB FX2LP系列USB接口芯

片。在使用Cypress公司提供的驱动程序基础上,只需在Visual C++主机程序的加入头文件

CyAPI.h和库文件即可调用相应的控制函数。

CyAPI控制函数类主要包括8个控制类,包括块传输端点控制类CCyBulkEndPoint、控

制传输端点类CCyControlEndPoint、中断传输端点控制类CCyInterruptEndPoint、同步传输端

点控制类CCyIsocEndPoint、设备控制类CCyUSBDevice、配置信息类CCyUSBConfig、端点

控制类CCyUSBEndPoint和接口控制类CCyUSBInterface。下面分别进行介绍。

174

应用开发宝典

1.块传输端点控制类CCyBulkEndPoint

块传输端点控制类CCyBulkEndPoint主要用于块传输端点。在该类中最常用的函数是

BeginDataXfer,其函数原型为:

BeginDataXfer函数是一个非常好用的异步I/O传输方法。这个函数建立一个数据传输通

道,初始化传输,并且不用等待传输完毕,立刻返回。其使用代码示例如下。

CCyUSBDevice *USBDevice = new CCyUSBDevice(Handle);

OVERLAPPED outOvLap, inOvLap;

= CreateEvent(NULL, false, false, "CYUSB_OUT");

= CreateEvent(NULL, false, false, "CYUSB_IN");

char inBuf[128];

ZeroMemory(inBuf, 128);

char buffer[128];

LONG length = 128;

//初始化数据输入输出

UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length,

&inOvLap);

UCHAR *outContext = USBDevice->BulkOutEndPt->BeginDataXfer(buffer, length,

&outOvLap);

//等待传输介绍

USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);

USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);

//结束传输

USBDevice->BulkOutEndPt->FinishDataXfer(buffer, length, &outOvLap,outContext);

USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);

//关闭输入输出

CloseHandle();

CloseHandle();

PUCHAR CCyBulkEndPoint::BeginDataXfer(PCHAR buf, LONG len, OVERLAPPED *ov)

2.控制传输端点类CCyControlEndPoint

在CCyControlEndPoint类中,同样定义了BeginDataXfer函数,用于异步I/O操作。这

里的函数原型如下。

该函数同样建立一个数据传输通道,初始化传输,并且不用等待传输完毕,立刻返回。

在这里主要用于控制端点的数据传输,如下所示。

CCyUSBDevice *USBDevice = new CCyUSBDevice(Handle);

PUCHAR CCyControlEndPoint::BeginDataXfer (PCHAR buf, LONG len, OVERLAPPED *ov)

11

章 上位机程序开发

175

// Just for typing efficiency

CCyControlEndPoint *ept = USBDevice->ControlEndPt;

OVERLAPPED OvLap;

= CreateEvent(NULL, false, false, "CYUSB_CTL");

char buffer[128];

LONG length = 128;

ept->Target = TGT_DEVICE;

ept->ReqType = REQ_VENDOR;

ept->Direction = DIR_TO_DEVICE;

ept->ReqCode = 0x05;

//长度

//请求码

在程序中,首先声明控制端点ept,并对ept进行了参数设置。共有5个参数,规定端点

0传输的方向,数据字节数等。下面分别介绍。

 Target:控制传输中的一个重要的参数,其可取值为TGT_DEVICE、TGT_INTFC、

TGT_ENDPT和TGT_OTHER。

 ReqType:请求的类型,其可取值为REQ_STD、REQ_CLASS和REQ_VENDOR。

 Direction:控制端点数据传输的方向,其可取值为DIR_TO_DEVICE和DIR_FROM_

DEVICE两个。

 ReqCode:请求的代码,在USB芯片的固件程序中,对该代码有专门的处理程序。

控制端点的通信,主要便是通过其来实现的。

 Value:控制传输的重要参数,其值依赖于ReqCode参数。

 Index:控制传输的重要参数,其值依赖于ReqCode参数。

本例中,对ept初始化表示数据从USB设备发送到主机,数据长度为128个字节。通过

BeginDataXfer函数将该命令发送USB设备。USB芯片得到这个请求后,在相应的请求代码

程序处理中将128个数据发送给主机,主机将接收到的数据保存在buffer中。

除此以外,该类中还定义了Write和Read函数,其函数原型为如下。

Write函数是一个简化版本的传输函数,将函数的传输方向固定为DIR_TO_DEVICE,即

主机向USB设备发送数据。Write函数的使用代码示例如下。

CCyUSBDevice *USBDevice = new CCyUSBDevice(Handle);

bool CCyControlEndPoint::Write(PCHAR buf, LONG &len)

bool CCyControlEndPoint::Read( PCHAR buf, LONG &len)

ept->Value = 1;

ept->Index = 0;

PUCHAR Context = ept->BeginDataXfer(buffer, length, &OvLap);

ept->WaitForXfer(&OvLap,100);

ept->FinishDataXfer(buffer, length, &OvLap,Context);

CloseHandle();