lyyebreeze
驱动牛犊
驱动牛犊
  • 注册日期2005-08-08
  • 最后登录2009-02-24
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
阅读:1474回复:7

虚心请教:ISP1161 设备枚举时遇到的问题

楼主#
更多 发布于:2007-09-28 20:05
我现在在调试 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

附件名称/大小 下载次数 最后更新
bus_hound_0928-1816.rar (3KB)  7 2007-09-28 20:05
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-30 15:49
1。我也碰到过这个问题。首先,既然你没有受到set address请求,那说明你get_descriptor中回的数据就有可能有问题。其次,即使你是正确的,bus hound也不能看到好像,我的感觉是这个软件要经过后面的一系列过程后才能看到前面的信息。不过这个我也不确定,因为之前试验了几次,好像结果都不一定,致使我现在也搞不清楚了。看了一下你捕捉到的数据,那些都不是你的usb的数据,而是hub的数据,对你没什么参考价值。请参考bus hound的使用指南,钩选自己的设备。
2.不是和问题1一样吗???
请你仔细点调,特别注意中断,关了没,开了没。状态标志置了没,清除了没??bus hound对你 现阶段没什么用
vip0126
驱动牛犊
驱动牛犊
  • 注册日期2006-08-31
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分162分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-30 16:32
听说BUSHOUND   WINXP下抓不到SET ADDRESS之前的包。
你是WIN2K 还是WIN XP?
lyyebreeze
驱动牛犊
驱动牛犊
  • 注册日期2005-08-08
  • 最后登录2009-02-24
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-03 01:14
我的系统是 win xp ,谢谢楼上两位了。
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-03 10:35
我是winxp的
lyyebreeze
驱动牛犊
驱动牛犊
  • 注册日期2005-08-08
  • 最后登录2009-02-24
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
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; //可能的配置数量 //描述设备序列号字符串的索引    
}
附件名称/大小 下载次数 最后更新
bus_hound_1006_2110.txt (23KB)  3 2007-10-08 11:02
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-10-08 11:17
SET ADDRESS是在PC得到DEVICE, CONFIGURATION, INTERFACE描述符之后, 你发的仅仅是三次DEVICE DESCRIPTOR, 你怎么能得到SET ADDRESS命令呢?
一起交流,共同提高!
lyyebreeze
驱动牛犊
驱动牛犊
  • 注册日期2005-08-08
  • 最后登录2009-02-24
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-08 13:46
引用第6楼lejianz于2007-10-08 11:17发表的  :
SET ADDRESS是在PC得到DEVICE, CONFIGURATION, INTERFACE描述符之后, 你发的仅仅是三次DEVICE DESCRIPTOR, 你怎么能得到SET ADDRESS命令呢?


首先, 感谢你的回帖。

1. 前两次的问题在于: bus hound 捕捉到的数据 与 我程序中发出的数据不同。

2. CONFIGURATION, INTERFACE描述符是在SET ADDRESS 之后吧 ?
游客

返回顶部