ppsun
驱动牛犊
驱动牛犊
  • 注册日期2004-05-10
  • 最后登录2009-03-25
  • 粉丝1
  • 关注0
  • 积分50分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1991回复:8

请教 批量传输 问题 多谢(附程序)

楼主#
更多 发布于:2004-09-14 21:59
我现在枚举成功 得知 设备有4个可用端点(0, BULK―IN, BULK―OUT,以及一个中断传输用的端点),我做了一个INQUIRY命令准备获取设备的一些信息, 但是总是返回TIME――OUT。我是在设备枚举之后就紧着调用INQUIRY命令的,不知道这样行不行?除了0号端点外的其它端点是不是在枚举之后就可以使用了,还是需要进行初始化之类的工作?请问是怎么回事呀 多谢多谢

[编辑 -  9/15/04 by  ppsun]
ppsun
驱动牛犊
驱动牛犊
  • 注册日期2004-05-10
  • 最后登录2009-03-25
  • 粉丝1
  • 关注0
  • 积分50分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-16 11:01
不好意思 程序贴错了。 我本来用的是在枚举阶段获得的Bulk_Out和 Bulk_In 两个端点,由于始终有错误,所以试了试端点0.

另外 我的U盘的bInterfaceSubClass为06, (SCSI透明命令集),是不是我就不能用UFI命令呢来操作它, 而必须用SCSI命令呢 多谢

回复都会加分的 但不知道怎么 加分 烦请告诉一下 :)
ppsun
驱动牛犊
驱动牛犊
  • 注册日期2004-05-10
  • 最后登录2009-03-25
  • 粉丝1
  • 关注0
  • 积分50分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-16 10:53
解决了问题一定给分,我这就去按照你的思路做一下。朋友,有你的联系方式么?我是第一次做USB的项目,希望能得到你的指点
hemonel
驱动牛犊
驱动牛犊
  • 注册日期2004-09-08
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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)这两个步骤

答对了要给分
ppsun
驱动牛犊
驱动牛犊
  • 注册日期2004-05-10
  • 最后登录2009-03-25
  • 粉丝1
  • 关注0
  • 积分50分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-15 23:04
地址应该没问题 我是在枚举阶段 通过 端点描述符的 端点方向和用途来确定 BULK-IN 和BULK-OUT的

另外,我测试的U盘是 SCSI命令的 是不是用UFI命令不行的呀 :(
mdwsun
驱动牛犊
驱动牛犊
  • 注册日期2004-08-23
  • 最后登录2004-10-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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?
我不确定?
ppsun
驱动牛犊
驱动牛犊
  • 注册日期2004-05-10
  • 最后登录2009-03-25
  • 粉丝1
  • 关注0
  • 积分50分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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]
ppsun
驱动牛犊
驱动牛犊
  • 注册日期2004-05-10
  • 最后登录2009-03-25
  • 粉丝1
  • 关注0
  • 积分50分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-15 15:50
我在设备枚举之后 紧接着就调用INQUIRY命令 是不是这样不行呀?
除了端点0之外的其它端点是不是在枚举之后就可以用了呢 还是需要什么初始化之类的工作?
多谢
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-15 09:14
超时,没数据返回.
建议你看一下发送的命令是否是你要发的,到固件里跟一下,流程是否
正确.
新手上路,请多关照.
游客

返回顶部