阅读:2841回复:15
USB应用程序求救!怎么和固件配合不起来啊,一定给分
用CYPRESS的控制面板就可以和自己写的固件程序配合起来,但自己写的应用程序和自己的固件配合不起来,这是怎么回事啊?我想用端点0传输数据(只想传输一两个数据),写了三个函数试了之后,都不行,郁闷啊!!!
第一个函数: BOOL writedata( BYTE data) { BOOL Success ; VENDOR_OR_CLASS_REQUEST_CONTROL VR; unsigned long nBytes; if (hDevice != INVALID_HANDLE_VALUE ) { VR.direction = 0; VR.requestType = 2; VR.recepient = 0; VR.request = VR_WRITEDATA; VR.requestTypeReservedBits = 0; VR.value = data; Success = DeviceIoControl (hDevice, IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST, &VR, sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL), NULL, 0, &nBytes, NULL); } return Success; } 第二个函数是: BOOL WRITEDATA( ) { BOOL Success ; VENDOR_REQUEST_IN VR; unsigned long nBytes; if (hDevice != INVALID_HANDLE_VALUE ) { VR.direction =0X00 ; VR.bRequest=0xb6; VR.wLength=0x00; VR.wValue=0x5555; VR.wIndex=0x0000; Success = DeviceIoControl (hDevice, IOCTL_Ezusb_VENDOR_REQUEST , &VR, sizeof(VENDOR_REQUEST_IN), NULL, 0, &nBytes, NULL); } return Success; } 第三个函数是: BOOL writedata( BYTE data) { BOOL Success ; VENDOR_OR_CLASS_REQUEST_CONTROL VR; unsigned long nBytes; if (hDevice != INVALID_HANDLE_VALUE ) { VR.direction = 0; VR.requestType = 2; VR.recepient = 0; VR.request = VR_WRITEDATA; VR.requestTypeReservedBits = 0; Success = DeviceIoControl (hDevice, IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST, &VR, sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL), &data, 1, &nBytes, NULL); } return Success; } 望高人指点啊!! |
|
最新喜欢:lhaih |
沙发#
发布于:2004-06-29 17:45
救命啊!
|
|
板凳#
发布于:2004-06-29 18:56
先用bushound查看你发的数据下去了没
或者直接用bushound向端点0发厂商请求看看USB底层有什么返回先 |
|
|
地板#
发布于:2004-06-30 10:02
分我给过了,我再试试!
|
|
地下室#
发布于:2004-06-30 15:11
我顶!!
|
|
5楼#
发布于:2004-06-30 19:37
先用bushound查看你发的数据下去了没 不行吗?先说说试过后的现象吧 |
|
|
6楼#
发布于:2004-06-30 21:47
还是不行啊?
|
|
7楼#
发布于:2004-07-01 10:53
我再顶!
|
|
8楼#
发布于:2004-07-01 15:29
你光顶有什么用?把下面这段代码加到deviceiocontrol函数后面,看看有什么现象
LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Process any inserts in lpMsgBuf. // ... // Display the string. AfxMessageBox((LPCTSTR)lpMsgBuf,MB_OK | B_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); |
|
9楼#
发布于:2004-07-01 16:04
任兄,我都快崩溃了,导师这两天出差,一旦他回来。。。。。。。。我死定了!!
|
|
10楼#
发布于:2004-07-01 16:58
你按下面的程序试一试,前提是你必须能正确打开设备并获得句柄!
应用程序中: VENDOR_REQUEST_IN MyRequest; HANDLE hDevice = INVALID_HANDLE_VALUE; ULONG nBytes = 0; UCHAR ucData = 0; if(!bOpenDevice(&hDevice))//打开设备,换成你的代码,cy提供了这个函数 { AfxMessageBox("无法打开设备!", MB_OK); return; } MyRequest.direction = 0x01;//要求设备回传数据 MyRequest.wLength = 0x01;//回传数据长度为1 MyRequest.wValue = 0x01;//这个参数是传给设备的 MyRequest.bRequest = 0xC0;//请求号是c0,设备固件程序中要求处理这个请求的程序段,后面我会说明 bResult = DeviceIoControl (hDevice, IOCTL_Ezusb_VENDOR_REQUEST, &MyRequest, sizeof(VENDOR_REQUEST_IN), &ucData, sizeof(ucData), &nBytes, NULL); if(!bResult) { AfxMessageBox("发送请求失败!"); CloseHandle(hDevice); return FALSE; } 固件程序: 你把下面的代码放到SetupCommand函数里的 switch(SETUPDAT[1])的最上一层,如下: void SetupCommand(void) { switch(SETUPDAT[1]) { case SC_GET_DESCRIPTOR: // *** Get Descriptor ..... ..... case 0xC0: EP0BUF[0] = 0xC0; EP0BCH = 0; EP0BCL = 1; break; } } 应用程序里发送命令了之后,固件程序就会执行case 0xc0: 此时Setup包里的wValue域应该是1,固件程序执行后应用程序中的ucData里面应该是0xC0, 你可以先在开发板里试,我的这段程序可是验证过的! 除非你的固件程序根本就下的不对,也就是说你的程序根本就没有执行!你可以作如下的实验,将下面这段程序中的if限制去掉,看设备是否进行了重枚举,也就是在设备管理器的设备列表里面会先卸掉设备然后再加载一次 if(!(USBCS & bmRENUM)) { EZUSB_Discon(TRUE); // renumerate } 或者在下面函数里加上让某个IO口输出方波的代码,这样就能判定你的程序运行了没有。 while(TRUE) // Main Loop { } 如果发现没有运行,可能你的固件程序下到外部了,检查option for target里的bl51 locate选项卡里的code:和xdata域你设置的是多少,应该是0x80-0x0FFF和0x1000-0x1FFF才对,如果超出了0x2000,说明你的程序下到内部SRAM外了,当然程序不能正常执行了! |
|
11楼#
发布于:2004-07-01 17:39
任兄,感激你的热情和才华,我晚上好好试一下,有机会的话想请你吃饭!!
|
|
12楼#
发布于:2004-07-02 11:34
解决问题是最重要的,其它的都是次要的
可惜的是我不是专门做技术支持的, 如果能现场调试一下也许很快就能解决 现在只能靠你自己努力了 |
|
13楼#
发布于:2004-07-03 12:29
jinghuiren:
真是佩服你佩服的不行了!! 热心和才华横溢!!! |
|
|
14楼#
发布于:2004-07-03 12:33
极具人格魅力!!!!
对我极有刺激,很有影响。 |
|
|
15楼#
发布于:2004-07-03 16:56
呵呵,过奖过奖!
助人乃快乐之本 更何况当初我也曾受过别人这样的帮助。 |
|