阅读:1155回复:8
to:metalwing 还有一点疑问,能否帮忙解答
谢谢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能够给我一些解答,十分感谢!!!! |
|
沙发#
发布于: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命令). |
|
|
板凳#
发布于:2004-09-07 10:12
正像你说的那样,我把这两次不同的要求分开了
但是我有两点疑问,如果我配置描述符声明的长度是0X2E 那么第一次我传输九个字节数据的时候,是不是只传九个 还有,我自己写了一个描述符集合,当长度大于9的时候, 我就发送这个描述符集合,结果不管怎么样就是只发送配置描述符 所以我就不知道怎么办好了 还有一个疑问就是如果不声明描述符集合,那么这几种描述符是怎么联系到一起的呢!! 我上面的声明是否有问题呢!!?? |
|
地板#
发布于:2004-09-07 11:29
你是用仿真器吗?是的话,我建议你跟一下.
看看是否进入了发送你所说的描述符集合的程序里.我判断可能没有 进,或你发送描述符集合的程序有问题.如果没有进,看看你的指令分 析程序,跟一下,看他在收到80 06 00 02 00 00 ff 00指令后干了什 么,最好跟到发送完描述符阶段,看是否正确. 实际上,不用声明描述符集合,因为你已经声明了配置(CONFIG),接口 (INTERFACE),端点(ENDPOINT)描述符,当你在收到80 06 00 02 00 00 ff 00后,先发送配置描述符,发完了后,再发送接口描述符,最后是 端点描述符,都发完了后,跳出程序. 你的声明没问题.如果可以的话,把你的指令分析程序和发送程序(配 置的)帖出来我看看. |
|
|
地下室#
发布于:2004-09-07 11:59
太感谢了!!!
呵呵,我下午准备检查一下 以前也检查过,但是还是找不出毛病 我怕单拿出部分程序有点乱,因为我用的是RABBIT的MCU 这个东西不支持头文件的形式 所以我把所有的都写进了一个程序里面 现在我把我现在的完整程序贴给你!!! 可以执行到我说的读取到配置描述符,识别出飞利浦芯片 但是却有问号,没有读取描述符集合 大体我是修改了周立功的程序,因为编译器不同所以有所改动 非常感谢你帮我看一下,看看能不能发现什么问题, 因为我找不到了 :( :( :( :( :(,再次感谢!!!!! |
|
|
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(); |
|
|
6楼#
发布于:2004-09-07 17:09
真得很感谢你对我的问题这么认真
下午我照你的方法做一下,方法我没有想到别的,还是声明了 一个配置、接口、和端点1、2,得描述符集合的结构体 然后将这个结构体用CODE_TRANSMIT(),函数来进行输入。 但是我发现为什么,总是读取完配置描述符之后就不再读取 其它的描述符了,甚至我怀疑想你说的那样,第二次读取描述符集合 的命令根本就没有执行!!! 那么如果这样应该怎么板呢?读取设备描述符都没有问题 为什么读取描述符集合就会出问题呢。是不是有什么时序 或者端点势能,或者缓冲区需要什么样的命令呢?? 真的不知道怎么解决了!!!呵呵!!!!! :( :( :( :( :( :( :( :( :( :( :( :( :( |
|
7楼#
发布于:2004-09-07 17:33
对了对了,还有一个奇怪的现象。。。。
我一直没说,就是每次虽然能够识别到设备了 但是并不是只是读两次配置描述符和集合 而是四次 也就是说,分配地址之后,先发送了一次配置描述符 再进入中断发送描述符集合 但是并没有结束,接下来又进两次中断分别来发送配置描述符 和描述符集合,这样连续两次发送,是不是说明没成功啊? 呵呵,这也是我疑惑的一点。在这之后就可以识别器件了 有下脚有图标出来,点机一看是D12,但是有惊叹号!!! 整个过程就是这样了,呵呵,帮我分析一下好吗? |
|
8楼#
发布于:2004-09-07 18:17
不清楚你说的什么意思,我的抽象思维能力比较差,呵呵.
如果说你发送设备描述符没问题的话,那我想你发送别的也应该没问 题(因为你都是调用一个发送程序),你跟了没有?在发送配置描述符集 合里设个断点,然后从头全速运行程序,看看进没进程序(就是运行没 运行到你设的断点那里),如果进了的话,再看看发送的数据对不对(单 步运行他,看看程序流对不对). 你说的怪现象不清楚,最好发个你用USB MONITER采集到的数据让我看 看,我好有个感性的认识,呵呵. |
|
|