阅读:1990回复:8
请教 批量传输 问题 多谢(附程序)
我现在枚举成功 得知 设备有4个可用端点(0, BULK―IN, BULK―OUT,以及一个中断传输用的端点),我做了一个INQUIRY命令准备获取设备的一些信息, 但是总是返回TIME――OUT。我是在设备枚举之后就紧着调用INQUIRY命令的,不知道这样行不行?除了0号端点外的其它端点是不是在枚举之后就可以使用了,还是需要进行初始化之类的工作?请问是怎么回事呀 多谢多谢
[编辑 - 9/15/04 by ppsun] |
|
沙发#
发布于:2004-09-15 09:14
超时,没数据返回.
建议你看一下发送的命令是否是你要发的,到固件里跟一下,流程是否 正确. |
|
|
板凳#
发布于:2004-09-15 15:50
我在设备枚举之后 紧接着就调用INQUIRY命令 是不是这样不行呀?
除了端点0之外的其它端点是不是在枚举之后就可以用了呢 还是需要什么初始化之类的工作? 多谢 |
|
地板#
发布于:2004-09-15 16:54
这是我测试用的程序,但返回超时错误,请大家看看我程序思路存在什么问题么?正确的思路又是什么呢?
测试:调用 Bulk_Only(Inquiry, 0x24, tmpbuf1); 返回超过错误。 ///////////////////////////////// void Bulk_Transfer_OUT(WORD Length, char* pDataBuf) { USB_Transaction(PID_OUT, Bulk_OUT_EP, Device_Address, Length, pDataBuf); } ///////////////////////////////////////// ///////////////////////////////////////// void Bulk_Transfer_IN(WORD Length, char* pDataBuf) { USB_Transaction(PID_IN, Bulk_IN_EP, Device_Address, Length, pDataBuf); } //////////////////////////////////////// void Bulk_Only(BYTE BulkCMD, WORD Length, char* pDataBuf) { CBW MS_CBW; BYTE UFI_Cmd; char infobuf[32]; int i; pCBW pMS_CBW; pMS_CBW = &MS_CBW; UFI_Cmd = BulkCMD; //set the value of struct CBW MS_CBW.dCBWSignature = 0x55534243; //protocol spevified //MS_CBW.dCBWSignature = 0x43425355; //protocol spevified MS_CBW.dCBWTag = 0x12345678; //set by the host MS_CBW.bCBWLUN = 0; MS_CBW.CBWCD[12] = 0; MS_CBW.CBWCD[13] = 0; MS_CBW.CBWCD[14] = 0; MS_CBW.CBWCD[15] = 0; if ((BulkCMD == Inquiry)) { printf("the UFI command is %x.n", Inquiry); MS_CBW.bmCBWFlags = 0x80; MS_CBW.bCBWCBLength = 0x0C; MS_CBW.dCBWDataTransferLen= 0x24000000; MS_CBW.CBWCD[0] = Inquiry; //command: Inquiry MS_CBW.CBWCD[1] = 0x00; MS_CBW.CBWCD[2] = 0x00; MS_CBW.CBWCD[3] = 0x00; //MS_CBW.CBWCD[4] = 0x24; MS_CBW.CBWCD[4] = 0x00; MS_CBW.CBWCD[5] = 0x00; MS_CBW.CBWCD[6] = 0x00; MS_CBW.CBWCD[7] = 0x00; MS_CBW.CBWCD[8] = 0x00; MS_CBW.CBWCD[9] = 0x00; MS_CBW.CBWCD[10] = 0x00; MS_CBW.CBWCD[11] = 0x00; Bulk_Transfer_OUT(0x1F, (char*)&MS_CBW); Bulk_Transfer_IN(0x24, pDataBuf); Bulk_Transfer_IN(0x0D, infobuf); for (i = 0; i < 0x0D; i++) { infobuf[1] = 0; } for (i = 0; i < 0x0D; i++) { if (!(i % 5)) printf("n"); printf("nnnCSE[%d]: %x. ", i, infobuf); } } } [编辑 - 9/16/04 by ppsun] |
|
地下室#
发布于:2004-09-15 21:06
void Bulk_Transfer_OUT(WORD Length, char* pDataBuf)
{ USB_Transaction(PID_OUT, 0, Device_Address, Length, pDataBuf); } 你的Bulk_Transfer_OUT();中端点地址是否应为Bulk_OUT_EP? 我不确定? |
|
5楼#
发布于:2004-09-15 23:04
地址应该没问题 我是在枚举阶段 通过 端点描述符的 端点方向和用途来确定 BULK-IN 和BULK-OUT的
另外,我测试的U盘是 SCSI命令的 是不是用UFI命令不行的呀 :( |
|
6楼#
发布于:2004-09-16 10:19
/////////////////////////////////
void Bulk_Transfer_OUT(WORD Length, char* pDataBuf) { USB_Transaction(PID_OUT, 0, Device_Address, Length, pDataBuf); } ///////////////////////////////////////// 你的这一段程序错了,批量传输所用的端点号不是0,而是你枚举阶段所得的BULK-OUT端点 而且在进行批量传输前,在枚举时应该有 Set_Address(Device_Address)和Set_Configuration(ConfigurationDecriptor->bConfigurationValue)这两个步骤 答对了要给分 |
|
7楼#
发布于:2004-09-16 10:53
解决了问题一定给分,我这就去按照你的思路做一下。朋友,有你的联系方式么?我是第一次做USB的项目,希望能得到你的指点
|
|
8楼#
发布于:2004-09-16 11:01
不好意思 程序贴错了。 我本来用的是在枚举阶段获得的Bulk_Out和 Bulk_In 两个端点,由于始终有错误,所以试了试端点0.
另外 我的U盘的bInterfaceSubClass为06, (SCSI透明命令集),是不是我就不能用UFI命令呢来操作它, 而必须用SCSI命令呢 多谢 回复都会加分的 但不知道怎么 加分 烦请告诉一下 :) |
|