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

楼主 作者:34774113  发表时间:2010-4-23 11:39:12

d12上拉成功,枚举失败【图片】

我用的是89S52+D12做USB实验 D12上拉成功,发现无法识别的USB设备,但是不能枚举,GoodLink灯一下都没闪,串口输出信息如下:

Your D12 chip's ID is: 0x1012. ID is correct! Congratulations!
断开USB连接。
连接USB。
USB总线复位。
USB总线挂起。
USB总线挂起。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线复位。
USB总线挂起。


任务栏弹出无法识别的USB设备,如下图:



另外,GoodLink一直不亮,clkout输出正常,与模式里设置的一致

  麻烦各位高手给看看为什么不能枚举!
不胜感激!


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

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

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

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

我做的是USB鼠标【图片】

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








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

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

这样试试

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

2、换台电脑试试

3、将串口关掉

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

回复楼主    回复第3楼
第4楼 作者: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
};
//////////////////////产品序列号字符串结束/////////////////////////

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

没有看出什么问题

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

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

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

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


回复楼主    回复第6楼

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