阅读:1474回复:7
虚心请教:ISP1161 设备枚举时遇到的问题
我现在在调试 ISP1161 USB Device 固件程序。设备枚举时遇到了一个问题。虚心向大家请教,请各位指点迷津,帮帮忙。
开发平台介绍: MCU,是我们自己设计的微处理器, 体系结构与ARM920T 兼容。 USB控制器, ISP1161A1BD,支持usb 2.0规范,支持全速(12Mb/s)、低速(1.5Mb/s)传输。 症状:执行了 get_descriptor 请求后,总是不见主机发送 set_address 请求。 1. 从串口返回的信息来看,程序已经进入 get_descriptor()了。并且发送 设备描述符 报文后,进入了 EndPoint0_IN 中断。串口打印的具体信息如下: ---welcome to:---> main_job() -- get_descriptor() -- endp0_in_interrupt() -- get_descriptor() -- endp0_in_interrupt() -- get_descriptor() --endp0_in_interrupt() 2. 但是,在 bus hound 5.0里却没有捕捉到 get_descriptor请求。bus hound5.0的具体信息在附件里,建议用写字板打开。 问题: 1. 为什么程序接收到 get_descriptor 请求,并执行了 get_descriptor()处理函数,但是在 bus hound 上却没有捕捉到这个请求呢? 2. 为什么总是不见 set_address 请求出现呢? 应该怎样处理? 附件里是bus hound 捕捉到的数据。 联系QQ:283489953 ( Allen Liu ) Email : lyye03@163.com |
|
|
沙发#
发布于:2007-09-30 15:49
1。我也碰到过这个问题。首先,既然你没有受到set address请求,那说明你get_descriptor中回的数据就有可能有问题。其次,即使你是正确的,bus hound也不能看到好像,我的感觉是这个软件要经过后面的一系列过程后才能看到前面的信息。不过这个我也不确定,因为之前试验了几次,好像结果都不一定,致使我现在也搞不清楚了。看了一下你捕捉到的数据,那些都不是你的usb的数据,而是hub的数据,对你没什么参考价值。请参考bus hound的使用指南,钩选自己的设备。
2.不是和问题1一样吗??? 请你仔细点调,特别注意中断,关了没,开了没。状态标志置了没,清除了没??bus hound对你 现阶段没什么用 |
|
板凳#
发布于:2007-09-30 16:32
听说BUSHOUND WINXP下抓不到SET ADDRESS之前的包。
你是WIN2K 还是WIN XP? |
|
地板#
发布于:2007-10-03 01:14
我的系统是 win xp ,谢谢楼上两位了。
|
|
地下室#
发布于:2007-10-03 10:35
我是winxp的
|
|
5楼#
发布于:2007-10-08 11:02
我换了台电脑,重新装了win2000的系统。抓到的数据见附件。主机发了三次GET DESCRIPTOR ,我返回了设备描述符,第一次是0x56 0x79重复发送了,第二次是0xff 0x00 重复发送了。第三次才发送正确。但是仍然没有收到 set address。而且似乎设备返回数据包时花费的时间太长了。这是什么原因呢。多谢了。
13.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 14.1.0 11us 2007-10-06 13:00:13.598 13.0 DI 12 01 00 02 ff 00 00 40 12 34 56 79 56 79 00 01 01 02 .......@.4VyVy.. 14.2.0 5.1sc 2007-10-06 13:00:18.710 13.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 22.1.0 15us 2007-10-06 13:00:19.395 13.0 DI 12 01 00 02 ff 00 ff 00 00 40 12 34 56 79 00 01 01 02 .........@.4Vy.. 22.2.0 5.1sc 2007-10-06 13:00:24.506 13.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 30.1.0 23us 2007-10-06 13:00:25.192 13.0 DI 12 01 00 02 ff 00 00 40 12 34 56 79 00 01 01 02 00 01 .......@.4Vy.... 30.2.0 5.1sc 2007-10-06 13:00:30.303 写设备描述符的函数如下: void Write_Device_descriptor( void ) { //选择端点 *(volatile unsigned short* )( Isp1161_dc_ins ) = (WRITE_EP + EP0_IN_INDEX); //写数据长度到缓冲区,字节数 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x0012; //写设备描述符 // 高字节 低字节 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x0112; //设备描述符类型编号,//设备描述符的字节数大小 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x0200; //USB版本号 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x00ff; //USB分配的子类代码, //USB分配的设备类代码 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x4000; //端点0的最大包大小 64, //USB分配的设备协议代码 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x3412; //厂商编号VID,这里只是作为测试用, *(volatile unsigned short* )( Isp1161_dc_data ) = 0x7956; //产品编号PID,这里只是作为测试用, *(volatile unsigned short* )( Isp1161_dc_data ) = 0x0100; //设备出厂编号 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x0201; //描述产品字符串的索引,//设备厂商字符串的索引 *(volatile unsigned short* )( Isp1161_dc_data ) = 0x0100; //可能的配置数量 //描述设备序列号字符串的索引 } |
|
|
6楼#
发布于:2007-10-08 11:17
SET ADDRESS是在PC得到DEVICE, CONFIGURATION, INTERFACE描述符之后, 你发的仅仅是三次DEVICE DESCRIPTOR, 你怎么能得到SET ADDRESS命令呢?
|
|
|
7楼#
发布于:2007-10-08 13:46
引用第6楼lejianz于2007-10-08 11:17发表的 : 首先, 感谢你的回帖。 1. 前两次的问题在于: bus hound 捕捉到的数据 与 我程序中发出的数据不同。 2. CONFIGURATION, INTERFACE描述符是在SET ADDRESS 之后吧 ? |
|