jrmforever
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2010-05-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1155回复:8

to:metalwing 还有一点疑问,能否帮忙解答

楼主#
更多 发布于:2004-09-07 08:44
谢谢metalwing 前一段的讲解,对我帮助很大。这个星期我看了一些东西,发现了问题所在,但是不知道怎样解决,希望metalwing 能够
帮忙解决以下,下面是我遇到的问题:

我用你说的那个usb monitor来观察数据,结果最后的是命令

80 06 00 02 00 00 09 00    用周立功的板子和我的板子观察的都

是这个命令,但是周立功的板子却出来了从配置到端点的所有46字节

的描述符,而我的只有配置的九个字节的描述符。而且我在程序中看

到了中断过程,就是:读设备描述符--设置地址--读设备描述符--读

配置描述符--读描述符集合(80 06 00 02 00 00 ff 00)

但是不知道为什么,就是读不出来。

一开始我想是程序的问题,但是后来我觉得不应该是程序的事。因为

读设备描述符的时候18个字节都读出来了。他们都是用同一个函数读

取的。所以我怀疑是声明描述符结构体的问题。现在我有一点不明白

的是周立功的程序上面配置描述符的结构体是这样的声明的:


typedef struct _USB_CONFIGURATION_DESCRIPTOR {
    UCHAR bLength;
    UCHAR bDescriptorType;
    USHORT wTotalLength;
    UCHAR bNumInterfaces;
    UCHAR bConfigurationValue;
    UCHAR iConfiguration;
    UCHAR bmAttributes;
    UCHAR MaxPower;
} USB_CONFIGURATION_DESCRIPTOR,*PUSB_CONFIGURATION_DESCRIPTOR;


然后赋值:


//配置描述符
const USB_CONFIGURATION_DESCRIPTOR ConfigDescr[] =
{
   sizeof(USB_CONFIGURATION_DESCRIPTOR),
   USB_CONFIGURATION_DESCRIPTOR_TYPE,
   0x002e,//在我的编译器里面,这个数据不能高低位交换否则是
                               出不来任何结果的
    1,
    1,
    0,
    0xa0,
    0x1
};


然后他在程序里面就是调用的配置描述符,但是不知道为什么

在获取描述符集合的时候,所有的端点和接口描述符也可以读出来

这一点我就不明白了 ,虽然声明了配置描述符的长度是46个字节

但是具体的数值是怎么得到的阿??虽然后面有对接口和端点描述

符的各自说明,但是是怎么联系起来的啊。而且我用周立功的程序

就出不来结果。只能读取配置描述符。然后我有自己声明了一个

描述符集合的结构体,将配置,接口和端点描述符都包含进去了

然后再得到读取描述符的结合的时候将这个结构体的值串过去

结果还是不可以。所以我就不明白现在问题到底应该怎么解决!!!

希望metalwing能够给我一些解答,十分感谢!!!!
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-07 09:13
在USB协议里,对读取配置描述符(80 06 00 02 00 00 09 00 )是有说
明的.
"80 06 00 02 00 00 09 00  "的最后两个字节是要求读取的长度.一般在枚举时,他先给你发一个要求长度为9的,就是光读取配置
描述符(CONFIG DESCRIPTOR).然后再根据你的配置描述符里声明的长
度读取一个总长度的配置描述符(一般发给你的长度为:0XFF),就是:
80 06 00 02 00 00 ff 00.你在接收时应该对这个命令进行分析,取
得他的最后两个字节,确认他要求你返回的是什么,如果是9,只返回配
置描述符,如果大于9,在返回配置描述符后,跟着返回接口描述符,端
点描述符,总长度应不大于他要求的总长度.也就是说,对于读取配置
描述符有两种返回方式:仅返回配置描述符(对于80 06 00 02 00 00
09 00命令);返回配置,接口,端点描述符(对于80 06 00 02 00 00
ff 00命令).
新手上路,请多关照.
jrmforever
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2010-05-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-07 10:12
正像你说的那样,我把这两次不同的要求分开了


但是我有两点疑问,如果我配置描述符声明的长度是0X2E

那么第一次我传输九个字节数据的时候,是不是只传九个

还有,我自己写了一个描述符集合,当长度大于9的时候,

我就发送这个描述符集合,结果不管怎么样就是只发送配置描述符

所以我就不知道怎么办好了

还有一个疑问就是如果不声明描述符集合,那么这几种描述符是怎么联系到一起的呢!!


我上面的声明是否有问题呢!!??























metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-07 11:29
你是用仿真器吗?是的话,我建议你跟一下.
看看是否进入了发送你所说的描述符集合的程序里.我判断可能没有
进,或你发送描述符集合的程序有问题.如果没有进,看看你的指令分
析程序,跟一下,看他在收到80 06 00 02 00 00 ff 00指令后干了什
么,最好跟到发送完描述符阶段,看是否正确.
实际上,不用声明描述符集合,因为你已经声明了配置(CONFIG),接口
(INTERFACE),端点(ENDPOINT)描述符,当你在收到80 06 00 02 00
00 ff 00后,先发送配置描述符,发完了后,再发送接口描述符,最后是
端点描述符,都发完了后,跳出程序.
你的声明没问题.如果可以的话,把你的指令分析程序和发送程序(配
置的)帖出来我看看.
新手上路,请多关照.
jrmforever
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2010-05-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-07 11:59
太感谢了!!!


呵呵,我下午准备检查一下


以前也检查过,但是还是找不出毛病


我怕单拿出部分程序有点乱,因为我用的是RABBIT的MCU

这个东西不支持头文件的形式


所以我把所有的都写进了一个程序里面

现在我把我现在的完整程序贴给你!!!

可以执行到我说的读取到配置描述符,识别出飞利浦芯片

但是却有问号,没有读取描述符集合


大体我是修改了周立功的程序,因为编译器不同所以有所改动

非常感谢你帮我看一下,看看能不能发现什么问题,

因为我找不到了

 :( :( :( :( :(,再次感谢!!!!!
附件名称/大小 下载次数 最后更新
2004-09-07_usb_no_lib.c (41KB)  0
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-07 12:30
      else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
   {//获取配置描述符
     code_transmit((unsigned)ConfigDescr, blength);
  } else
   stall_ep0();
你的程序里当收到80 06 00 02 00 00 ff 00时,判断他是要求配置描
述符,然后你就直接返回配置描述符,那当然有问题了.
你试试:
      else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
   {//获取配置描述符
     IF (DEVICE_REQUEST.WLENGTH ==9)
     code_transmit((unsigned)ConfigDescr, blength);
       ELSE IF (DEVICE_REQUEST.WLENGTH > 0X2E)
         {
           CODE_TRANSMIT((UNSIGNED)CONFIGDESCR, BLENGTH);
           CODE_TRANSMIT((UNSIGNED)INTERFACEDESCR, BLENGTH);
           CODE_TRANSMIT((UNSIGNED)ENDPOINTDESCR, BLENGTH);
         }
/*这个传输要一次传完,而不是分成三次,你注意下,改一下.*/  
  } else
   stall_ep0();
新手上路,请多关照.
jrmforever
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2010-05-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-09-07 17:09
真得很感谢你对我的问题这么认真
      下午我照你的方法做一下,方法我没有想到别的,还是声明了
一个配置、接口、和端点1、2,得描述符集合的结构体

然后将这个结构体用CODE_TRANSMIT(),函数来进行输入。

但是我发现为什么,总是读取完配置描述符之后就不再读取

其它的描述符了,甚至我怀疑想你说的那样,第二次读取描述符集合

的命令根本就没有执行!!!

那么如果这样应该怎么板呢?读取设备描述符都没有问题

为什么读取描述符集合就会出问题呢。是不是有什么时序

或者端点势能,或者缓冲区需要什么样的命令呢??


真的不知道怎么解决了!!!呵呵!!!!!

 :( :( :( :( :( :( :( :( :( :( :( :( :(
jrmforever
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2010-05-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-07 17:33
对了对了,还有一个奇怪的现象。。。。

我一直没说,就是每次虽然能够识别到设备了

但是并不是只是读两次配置描述符和集合

而是四次

也就是说,分配地址之后,先发送了一次配置描述符

再进入中断发送描述符集合

但是并没有结束,接下来又进两次中断分别来发送配置描述符

和描述符集合,这样连续两次发送,是不是说明没成功啊?

呵呵,这也是我疑惑的一点。在这之后就可以识别器件了


有下脚有图标出来,点机一看是D12,但是有惊叹号!!!

整个过程就是这样了,呵呵,帮我分析一下好吗?

metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-07 18:17
不清楚你说的什么意思,我的抽象思维能力比较差,呵呵.
如果说你发送设备描述符没问题的话,那我想你发送别的也应该没问
题(因为你都是调用一个发送程序),你跟了没有?在发送配置描述符集
合里设个断点,然后从头全速运行程序,看看进没进程序(就是运行没
运行到你设的断点那里),如果进了的话,再看看发送的数据对不对(单
步运行他,看看程序流对不对).
你说的怪现象不清楚,最好发个你用USB MONITER采集到的数据让我看
看,我好有个感性的认识,呵呵.
新手上路,请多关照.
游客

返回顶部