网站导航:首页 > 论坛 > USB > 帖子浏览
   您正在浏览第 653 号帖子 收藏该帖

楼主 作者:强强  发表时间:2010-4-23 12:23:00

你将设备枚举成哪种类型?有没有提示安装驱动?

从你发的图来看可能是未安装驱动,只要准备正确的驱动就可以了.如果你的设备是标准设备类就可能是相应描述符有问题.关键还是要知道你要实现哪种类型的设备

回复楼主
第1楼 作者:34774113  发表时间:2010-4-23 18:37:33

我做的是USB鼠标【图片】

我做的是USB鼠标
设备枚举是失败的,设备的VID和PID都是0000,如图:








这是什么原因呀?
麻烦强哥再给看看

回复楼主    回复第1楼
第2楼 作者:强强  发表时间:2010-4-24 8:38:12

这样试试

1、插上您的设备,然后在硬件管理器中将“Unknown Device”这个设备删除,再重新插一次。

2、换台电脑试试

3、将串口关掉

如果上述方法还是不行的话,将描述符发上来看看

回复楼主    回复第2楼
第3楼 作者:34774113  发表时间:2010-4-24 16:14:51

换了台机器也不行

强哥,换了台机器还是不行,串口关了也不行,还是那样
描述符在这儿:

//USB设备请求的各字段
uint8 bmRequestType;
uint8 bRequest;
uint16 wValue;
uint16 wIndex;
uint16 wLength;
//当前发送数据的位置
uint8 * pSendData;
//需要发送数据的长度
uint16 SendLength;
//是否需要发送0数据包的标志。在USB控制传输的数据过程中,
//当返回的数据包字节数少于最大包长时,会认为数据过程结束。
//当请求的字节数比实际需要返回的字节数长,而实际返回的字节
//数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
//来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
//一个0长度的数据包。
uint8 NeedZeroPacket;

//当前的配置值。只有在设置非0配置后
uint8 ConfigValue;

//端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
//当缓冲区中空闲时,该标志为假。
uint8 Ep1InIsBusy;

//USB设备描述符的定义
code uint8 DeviceDescriptor[0x12]= //设备描述符为18字节
{
//bLength字段。设备描述符的长度为18(0x12)字节
0x12,

//bDescriptorType字段。设备描述符的编号为0x01
0x01,

//bcdUSB字段。这里设置版本为USB1.1,即0x0110。
//由于是小端结构,所以低字节在先,即0x10,0x01。
0x10,
0x01,

//bDeviceClass字段。我们不在设备描述符中定义设备类,
//而在接口描述符中定义设备类,所以该字段的值为0。
0x00,

//bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
0x00,

//bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
0x00,

//bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
0x10,

//idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
//注意小端模式,低字节在先。
0x88,
0x88,

//idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。
//注意小端模式,低字节应该在前。
0x01,
0x00,

//bcdDevice字段。我们这个USB鼠标刚开始做,就叫它1.0版吧,即0x0100。
//小端模式,低字节在先。
0x00,
0x01,

//iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
//字符串索引就从1开始吧。
0x01,

//iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
//注意字符串索引值不要使用相同的值。
0x02,

//iSerialNumber字段。设备的序列号字符串索引值。
//这里取3就可以了。
0x03,

//bNumConfigurations字段。该设备所具有的配置数。
//我们只需要一种配置就行了,因此该值设置为1。
0x01
};
//////////////////////////设备描述符完毕//////////////////////////////

//USB报告描述符的定义
code uint8 ReportDescriptor[]=
{
//每行开始的第一字节为该条目的前缀,前缀的格式为:
//D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。

//这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)
//后面跟一字节数据(bSize为1),后面的字节数就不注释了,
//自己根据bSize来判断。
0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标
0x09, 0x02, // USAGE (Mouse)

//这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
//该集合是一个应用集合。它的性质在前面由用途页和用途定义为
//普通桌面用的鼠标。
0xa1, 0x01, // COLLECTION (Application)

//这是一个局部条目。说明用途为指针集合
0x09, 0x01, // USAGE (Pointer)

//这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个
//物理集合,用途由前面的局部条目定义为指针集合。
0xa1, 0x00, // COLLECTION (Physical)

//这是一个全局条目,选择用途页为按键(Button Page(0x09))
0x05, 0x09, // USAGE_PAGE (Button)

//这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
0x19, 0x01, // USAGE_MINIMUM (Button 1)

//这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
0x29, 0x03, // USAGE_MAXIMUM (Button 3)

//这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)
//最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
0x15, 0x00, // LOGICAL_MINIMUM (0)

//这是一个全局条目,说明逻辑值最大为1。
0x25, 0x01, // LOGICAL_MAXIMUM (1)

//这是一个全局条目,说明数据域的数量为三个。
0x95, 0x03, // REPORT_COUNT (3)

//这是一个全局条目,说明每个数据域的长度为1个bit。
0x75, 0x01, // REPORT_SIZE (1)

//这是一个主条目,说明有3个长度为1bit的数据域(数量和长度
//由前面的两个全局条目所定义)用来做为输入,
//属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
//这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
//这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,
//第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示
//按键3(中键)是否按下。
0x81, 0x02, // INPUT (Data,Var,Abs)

//这是一个全局条目,说明数据域数量为1个
0x95, 0x01, // REPORT_COUNT (1)

//这是一个全局条目,说明每个数据域的长度为5bit。
0x75, 0x05, // REPORT_SIZE (5)

//这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,
//数量为1个。它的属性为常量(即返回的数据一直是0)。
//这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据
//而已,所以它是没有实际用途的。
0x81, 0x03, // INPUT (Cnst,Var,Abs)

//这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//这是一个局部条目,说明用途为X轴
0x09, 0x30, // USAGE (X)

//这是一个局部条目,说明用途为Y轴
0x09, 0x31, // USAGE (Y)

//这是一个局部条目,说明用途为滚轮
0x09, 0x38, // USAGE (Wheel)

//下面两个为全局条目,说明返回的逻辑最小和最大值。
//因为鼠标指针移动时,通常是用相对值来表示的,
//相对值的意思就是,当指针移动时,只发送移动量。
//往右移动时,X值为正;往下移动时,Y值为正。
//对于滚轮,当滚轮往上滚时,值为正。
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)

//这是一个全局条目,说明数据域的长度为8bit。
0x75, 0x08, // REPORT_SIZE (8)

//这是一个全局条目,说明数据域的个数为3个。
0x95, 0x03, // REPORT_COUNT (3)

//这是一个主条目。它说明这三个8bit的数据域是输入用的,
//属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明
//这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示
//Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。
0x81, 0x06, // INPUT (Data,Var,Rel)

//下面这两个主条目用来关闭前面的集合用。
//我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
//通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。
//第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。
//第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示
//滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的
//鼠标数据。
///////////////////////////报告描述符完毕////////////////////////////

//USB配置描述符集合的定义
//配置描述符总长度为9+9+9+7字节
code uint8 ConfigurationDescriptor[9+9+9+7]=
{
/***************配置描述符***********************/
//bLength字段。配置描述符的长度为9字节。
0x09,

//bDescriptorType字段。配置描述符编号为0x02。
0x02,

//wTotalLength字段。配置描述符集合的总长度,
//包括配置描述符本身、接口描述符、类描述符、端点描述符等。
sizeof(ConfigurationDescriptor)&0xFF, //低字节
(sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节

//bNumInterfaces字段。该配置包含的接口数,只有一个接口。
0x01,

//bConfiguration字段。该配置的值为1。
0x01,

//iConfigurationz字段,该配置的字符串索引。这里没有,为0。
0x00,

//bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
//并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
0x80,

//bMaxPower字段,该设备需要的最大电流量。由于我们的板子
//需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
//电流为2mA,所以这里设置为50(0x32)。
0x32,

/*******************接口描述符*********************/
//bLength字段。接口描述符的长度为9字节。
0x09,

//bDescriptorType字段。接口描述符的编号为0x04。
0x04,

//bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
0x00,

//bAlternateSetting字段。该接口的备用编号,为0。
0x00,

//bNumEndpoints字段。非0端点的数目。由于USB鼠标只需要一个
//中断输入端点,因此该值为1。
0x01,

//bInterfaceClass字段。该接口所使用的类。USB鼠标是HID类,
//HID类的编码为0x03。
0x03,

//bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
//只规定了一种子类:支持BIOS引导启动的子类。
//USB键盘、鼠标属于该子类,子类代码为0x01。
0x01,

//bInterfaceProtocol字段。如果子类为支持引导启动的子类,
//则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。
0x02,

//iConfiguration字段。该接口的字符串索引值。这里没有,为0。
0x00,

/******************HID描述符************************/
//bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。
0x09,

//bDescriptorType字段。HID描述符的编号为0x21。
0x21,

//bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。
0x10,
0x01,

//bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。
0x21,

//bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。
0x01,

//bDescritporType字段。下级描述符的类型,为报告描述符,编号为0x22。
0x22,

//bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。
sizeof(ReportDescriptor)&0xFF,
(sizeof(ReportDescriptor)>>8)&0xFF,

/**********************端点描述符***********************/
//bLength字段。端点描述符长度为7字节。
0x07,

//bDescriptorType字段。端点描述符编号为0x05。
0x05,

//bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
//D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
0x81,

//bmAttributes字段。D1~D0为端点传输类型选择。
//该端点为中断端点。中断端点的编号为3。其它位保留为0。
0x03,

//wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
//注意低字节在先。
0x10,
0x00,

//bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。
0x0A
};
////////////////////////配置描述符集合完毕//////////////////////////

/************************语言ID的定义********************/
code uint8 LanguageId[4]=
{
0x04, //本描述符的长度
0x03, //字符串描述符
//0x0409为美式英语的ID
0x09,
0x04
};
////////////////////////语言ID完毕//////////////////////////////////


//字符串“电脑圈圈的USB专区 Http://group.ednchina.com/93/”的Unicode编码
//8位小端格式
code uint8 ManufacturerStringDescriptor[82]={
82, //该描述符的长度为82字节
0x03, //字符串描述符的类型编码为0x03
0x35, 0x75, //电
0x11, 0x81, //脑
0x08, 0x57, //圈
0x08, 0x57, //圈
0x84, 0x76, //的
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x13, 0x4e, //专
0x3a, 0x53, //区
0x20, 0x00, //
0x48, 0x00, //H
0x74, 0x00, //t
0x74, 0x00, //t
0x70, 0x00, //p
0x3a, 0x00, //:
0x2f, 0x00, ///
0x2f, 0x00, ///
0x67, 0x00, //g
0x72, 0x00, //r
0x6f, 0x00, //o
0x75, 0x00, //u
0x70, 0x00, //p
0x2e, 0x00, //.
0x65, 0x00, //e
0x64, 0x00, //d
0x6e, 0x00, //n
0x63, 0x00, //c
0x68, 0x00, //h
0x69, 0x00, //i
0x6e, 0x00, //n
0x61, 0x00, //a
0x2e, 0x00, //.
0x63, 0x00, //c
0x6f, 0x00, //o
0x6d, 0x00, //m
0x2f, 0x00, ///
0x39, 0x00, //9
0x33, 0x00, //3
0x2f, 0x00 ///
};
/////////////////////////厂商字符串结束/////////////////////////////

//字符串“《圈圈教你玩USB》之USB鼠标”的Unicode编码
//8位小端格式
code uint8 ProductStringDescriptor[34]={
34, //该描述符的长度为34字节
0x03, //字符串描述符的类型编码为0x03
0x0a, 0x30, //《
0x08, 0x57, //圈
0x08, 0x57, //圈
0x59, 0x65, //教
0x60, 0x4f, //你
0xa9, 0x73, //玩
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x0b, 0x30, //》
0x4b, 0x4e, //之
0x55, 0x00, //U
0x53, 0x00, //S
0x42, 0x00, //B
0x20, 0x9f, //鼠
0x07, 0x68 //标
};
////////////////////////产品字符串结束////////////////////////////

//字符串“2008-07-07”的Unicode编码
//8位小端格式
code uint8 SerialNumberStringDescriptor[22]={
22, //该描述符的长度为22字节
0x03, //字符串描述符的类型编码为0x03
0x32, 0x00, //2
0x30, 0x00, //0
0x30, 0x00, //0
0x38, 0x00, //8
0x2d, 0x00, //-
0x30, 0x00, //0
0x37, 0x00, //7
0x2d, 0x00, //-
0x30, 0x00, //0
0x37, 0x00 //7
};
//////////////////////产品序列号字符串结束/////////////////////////

回复楼主    回复第3楼
第4楼 作者:强强  发表时间:2010-4-24 22:55:10

没有看出什么问题

没有看出有什么问题,但可以试试将设备描述符里的iManufacturer、iProduct、iSerialNumber
三个字段的值设为零,看看会不会发生奇迹。

回复楼主    回复第4楼
第5楼 作者:鱼丫丫啊  发表时间:2010-9-30 11:10:54

d12上拉成功,枚举失败

站长好,我也遇到了相同的问题
我用的也是89S52+D12做USB实验 D12上拉成功,GoodLink灯闪三下之后,发现无法识别的USB设备,之后goodlink灯也不闪了。好像是驱动没装好,我下的是开源项目里的驱动,更新驱动失败。请问这是怎么回事?我的设备描述符没有改动,就是用的开源项目里的,只是D12config.h稍微改动了一下。下面是bushound捕获的
Bus Hound 5.00 capture. Complements of www.perisoft.net

Device - Device ID (followed by the endpoint for USB devices)
(7) SiS 7001 PCI to USB Open Host Controller
(8) USB Root Hub
(9) SiS 7001 PCI to USB Open Host Controller
Phase - Phase Type
CTL USB control transfer
DI Data in
Data - Hex dump of the data transferred
Descr - Description of the phase
Cmd... - Position in the captured data


Device Phase Data Description Cmd.Phase.Ofs(rep)
------ ----- ------------------------------------------------------------------------------------------------------ ---------------- ------------------
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 1.1.0(2)
8.0 DI 01 01 01 00 .... 1.2.0
8.0 CTL 23 01 10 00 03 00 00 00 CLEAR FEATURE 3.1.0
8.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 4.1.0
8.0 DI 00 01 00 00 .... 4.2.0
8.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 5.1.0
8.0 DI 03 03 00 00 .... 5.2.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 6.1.0(2)
8.0 DI 01 01 00 00 .... 6.2.0
8.0 CTL 23 03 04 00 03 00 00 00 SET FEATURE 8.1.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 9.1.0
8.0 DI 03 01 10 00 .... 9.2.0
8.0 CTL 23 01 14 00 03 00 00 00 CLEAR FEATURE 10.1.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 11.1.0(2)
8.0 DI 03 01 00 00 .... 11.2.0
8.0 CTL 23 03 04 00 03 00 00 00 SET FEATURE 13.1.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 14.1.0
8.0 DI 03 01 10 00 .... 14.2.0
8.0 CTL 23 01 14 00 03 00 00 00 CLEAR FEATURE 15.1.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 16.1.0(2)
8.0 DI 03 01 00 00 .... 16.2.0
8.0 CTL 23 03 04 00 03 00 00 00 SET FEATURE 18.1.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 19.1.0
8.0 DI 03 01 10 00 .... 19.2.0
8.0 CTL 23 01 14 00 03 00 00 00 CLEAR FEATURE 20.1.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 21.1.0
8.0 DI 03 01 00 00 .... 21.2.0
8.0 CTL 23 01 01 00 03 00 00 00 CLEAR FEATURE 22.1.0
8.0 CTL a3 00 00 00 04 00 04 00 GET STATUS 23.1.0
8.0 DI 00 01 00 00 .... 23.2.0
8.0 CTL 80 00 00 00 00 00 02 00 GET STATUS 24.1.0(12)
8.0 DI 01 00 .. 24.2.0
8.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 36.1.0
8.0 DI 00 01 00 00 .... 36.2.0
8.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 37.1.0
8.0 DI 03 03 00 00 .... 37.2.0
8.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 38.1.0


回复楼主    回复第5楼
第6楼 作者:719704155  发表时间:2010-6-1 14:39:39

请问楼主的问题解决了吗?我也遇到了这个问题,不知道时什么原因?

请问楼主的问题解决了吗?我也遇到了这个问题,不知道时什么原因?


回复楼主    回复第6楼
第7楼 作者:鱼丫丫啊  发表时间:2010-9-30 11:09:41

请问楼上问题解决了么?我也遇到相同问题了


回复楼主    回复第7楼
第8楼 作者:鱼丫丫啊  发表时间:2010-9-30 11:09:41

请问楼主问题解决了么?我也遇到相同问题了


回复楼主    回复第8楼

 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4