阅读:1160回复:2
请教ezusb中主从机块通信问题
各位大虾帮帮忙啦,
我用ezusb开发板调试的程序,从机端是一个例子程序EzBulk_asm 主机端是自己编的,目的是主机能从从机得到64字节的数据。从机端 没有描述表, 1。我想请教一下:从机端没有描述表可以通信吗? 2。问什么我的通信能打开驱动,读取缺生描述符,但是IOCTL_EZUSB_BULK_READ时,就返回false。 我的程序如下: 从机: start: mov SP,#STACK-1 mov dptr,#IN07VAL mov a,#03h movx @dptr, a mov dptr,#OUT07VAL mov a,#03h movx @dptr, a mov dptr,#IN2BUF mov r7,#64 ; fill EP2IN buffer with 64 fill: mov a,r7 movx @dptr,a inc dptr djnz r7,fill ; load decrementing counter starting w. 64 ; mov r1,#0 ; count the IN transfers mov r2,#0 ; count the OUT transfers mov dptr,#IN2BC mov a,#64 movx @dptr,a loop: mov dptr,#IN2CS movx a,@dptr jnb acc.1,service_IN2 mov dptr,#OUT2CS ; movx a,@dptr jb acc.1,loop service_OUT2: inc r2 ; OUT packet counter mov dptr,#IN2BUF+1 ; mov a,r2 movx @dptr,a mov dptr,#OUT2BC mov a,#1 ; any value movx @dptr,a sjmp loop ; service_IN2:inc r1 mov dptr,#IN2BUF mov a,r1 movx @dptr,a mov dptr,#IN2BC mov a,#64 ; 64 byte payload movx @dptr,a sjmp loop ; END 主机:typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT bcdUSB; UCHAR bDeviceClass; UCHAR bDeviceSubClass; UCHAR bDeviceProtocol; UCHAR bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UCHAR iManufacturer; UCHAR iProduct; UCHAR iSerialNumber; UCHAR bNumConfigurations; } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; void DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR deviceDescriptor); void _cdecl main() { HANDLE handle = NULL; BOOLEAN success; ULONG nBytes; PUCHAR buffer = NULL; BOOLEAN bResult; BULK_TRANSFER_CONTROL bulkControl; int inPacketSize=64; UINT inBuffer[64]; ULONG i; buffer = (PUCHAR) malloc(sizeof(USB_DEVICE_DESCRIPTOR)); // // get a handle to our device // handle = CreateFile(\"\\\\\\\\.\\\\ezusb-0\", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (handle == INVALID_HANDLE_VALUE) { printf(\"Failed to open driver\\n\"); return; } else { printf(\"Opened successfully.\\n\"); } success = DeviceIoControl(handle, IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR, NULL, 0, buffer, sizeof(USB_DEVICE_DESCRIPTOR), &nBytes, NULL); if (success) { DumpDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR) buffer); bulkControl.pipeNum=8; bResult=DeviceIoControl(handle,IOCTL_EZUSB_BULK_READ, &bulkControl,sizeof(BULK_TRANSFER_CONTROL), &inBuffer[0],inPacketSize,&nBytes,NULL); if(!bResult) { printf(\"Correct pipe not found.\"); } else { for(i=0;i<64;i++) { printf(\"%2d\\t\",inBuffer); } } } else { printf(\"IOCTL Failed\\n\"); } CloseHandle(handle); } 多谢了!!! |
|
最新喜欢:![]() |
沙发#
发布于:2003-01-10 19:33
1.没有描述符,主机辨识不了你的设备
2.再要wdm驱动在内存中,又没有设置独占属性,那么程序就可以打开他. 3.你把你的 firmwire 装载到 usb 芯片中了吗? 你的 firmwire 实现了 bulk-read 吗? 你的端口使能正确吗? |
|
|
板凳#
发布于:2003-01-10 19:54
再请教楼上的大虾:
您好,我还是不太明白,再请教。我的固件是调试的时候下载道芯片的ram中的,而且这个固件是example,我想应该没社么问题。 至于描述符,好多例子程序中都有desc.a51这个文件,是不是把它加入到我的工程中就可以了,需要自己编写诸如get_descriptor()等函数吗?从机是怎么将描述符告诉主机的? 开发系统带的一个example:bulktest中有好多读取各种描述附的函数,都有必要吗?它是用c51编写的,我只会汇编,看不懂,你有关于块传输的程序(主从机)吗?能不能给我一份参考,在此谢过了! |
|