您的位置:首页 > 其它

EZ-USB 68013学习笔记--CYAPI的使用之批量传输方式

2012-03-22 11:35 411 查看
cyapi一些重要函数说明见:/article/1759698.html

最近一直在调slavefifo,做上位机的时候总是调不过去,总是报错:说内存不能为写。或者乱起八糟的错误。我总结了一下应该注意一下几点:

1、cyapi.lib这个库的位置放在哪,在工程中添加的lib文件路径要和Tools->Option->directories里的lib路径要一致,否则可能报错!我开始添加的cyapi.lib是我拷到工程目录下的,而Tools->Option->directories下设置的却是cypress安装目录下的路径。最后添加相应的cyapi.h的头文件。这个最好也一致。不过我没一致。



2、(这一步不是必须的)有时候会报LIBCMT库相关的错误,设置方法, 工程(PROJECT)-设置(settings)-链接(link)-输入(input)-忽略库:LIBCMT

3、其他你就按照cybulk那个例程自己慢慢添加,一定要信心,这需要说明的一点的是 USBDevice结构体中的EndPoints[i]这个EndPoints,我一直没搞清楚 i 值对应哪个端点,今天试了试,大家千万注意了EndPoints[1]对应的是端点2,EndPoints[2]对应的端点4,EndPoints[3]对应的端点6,EndPoints[4]对应的端点8.CY的API帮助文档中根本没有说,而且给的例程里,这里的值是通过列表框返回的,单步跟一下,返回的值,就知道了。

4、变量的定义,最好按照他的,都定义成对话框的成员变量,我后来测试,不能定义成全局的,必须在一个窗口中定义 new CCyUSBDevice(m_hWnd); 最初创建的时候m_hWnd不能丢掉。

bool bLooping;

CUSB20Dlg(CWnd* pParent = NULL);// standard constructor

CCyUSBDevice *USBDevice;

CCyUSBEndPoint *OutEndpt;

CCyUSBEndPoint *InEndpt;

int DeviceIndex;

CWinThread *XferThread;

5、在OnInitDialog()函数里要完成USBDevice 初始化和线程初始化

XferThread = NULL;

USBDevice = new CCyUSBDevice(m_hWnd); // Create an instance of CCyUSBDevice

6、在添加启动线程按钮

void CSECGDlg::OnStartBtn()

{

// TODO: Add your control notification handler code here

if (XferThread)

·{

bLooping = false;

m_StartBtn.SetWindowText("Start");

}

else

{

LONG xfer = 1024;

int n = USBDevice->DeviceCount();

if (n != 0)

{

USBDevice->Open(0);

OutEndpt = USBDevice->EndPoints[2];

InEndpt = USBDevice->EndPoints[4];

if (xfer && USBDevice->IsOpen())

{

bLooping = true;

XferThread = AfxBeginThread(XferLoop, this);//启动线程

}

m_StartBtn.SetWindowText("Stop");

}

}

}

7.线程函数

UINT XferLoop( LPVOID params ) {

OVERLAPPED outOvLap, inOvLap; // OVERLAPPED 结构体,用于异步IO可以看这篇文章有介绍 /article/1759698.html

CSECGDlg *dlg = (CSECGDlg *) params;

char s[24];
ZeroMemory(s, 24);

LONG xfer = 512;

PUCHAR data = new UCHAR[512];ZeroMemory(data,512);

PUCHAR inData = new UCHAR[512];ZeroMemory(inData,512);

outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");

inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");

LONG seed = 1;

stuffBuff(data,xfer,seed,1); ///此函数在后面有定义,或者直接用cybulk例程即可

bool success;

LONG nSuccess = 0;

LONG nFailure = 0;

dlg->OutEndpt->TimeOut = 2000;

dlg->InEndpt->TimeOut = 2000;

for (;dlg->bLooping;) {

LONG outlen,inlen,len;

outlen = inlen = len = xfer; // Use temp var because XferData can change the value of len

UCHAR *outContext = dlg->OutEndpt->BeginDataXfer(data,outlen,&outOvLap);

UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);

dlg->OutEndpt->WaitForXfer(&outOvLap,2000);

dlg->InEndpt->WaitForXfer(&inOvLap,2000);

success = dlg->OutEndpt->FinishDataXfer(data, outlen, &outOvLap,outContext);

success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);

if (success) {

bool pass = (memcmp(data,inData,len) == 0);

if (pass)

nSuccess++;

else

nFailure++;

} else

nFailure++;

sprintf(s,"%d",nSuccess);

dlg->m_SuccessCount.SetWindowText(s);

sprintf(s,"%d",nFailure);

dlg->m_FailureCount.SetWindowText(s);

if ((!success) ) dlg->bLooping = false;

}

CloseHandle(outOvLap.hEvent);

CloseHandle(inOvLap.hEvent);

delete [] data;

delete [] inData;

dlg->XferThread = NULL;

dlg->USBDevice->Close();

return true;

}

8、stuffBuff函数

void stuffBuff(PUCHAR buf, LONG len, LONG seed, int method) {

DWORD *dwBuf = (DWORD *) buf;

srand((UINT)seed);

int cnt = (method == 3) ? len / 4 : len;

for (int i=0; i<cnt; i++)

switch (method) {

case 0:

buf[i] = (CHAR) seed;

break;

case 1:

buf[i] = rand();

break;

case 2:

buf[i] = (UCHAR)seed + i;

break;

case 3:

dwBuf[i] = seed + i;

break;

}

}

其他的没了,我个人经历总结,难免不对,只是给大家个参考。祝大家顺利
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐