阅读:2140回复:17
usb设备为什么没有接收主机分配的地址?
PID:SETUP ADDR:00 ENDP:00 CRC5:02 idle:3
PID:DATA0 data:00 05 02 00 00 00 00 00 CRC16:16eb idle:7 PID:ACK idle:2e0c PID:IN ADDR:00 ENDP:00 CRC5:02 idle:7 PID:DATA1 data:CRC16:0000 idle:6 PID:ACK idle:2e48 上面是一个完整的包,显示设备已经接收的了主机分配的地址,在这个设备上可以读出所有的数据 PID:SETUP ADDR:00 ENDP:00 CRC5:02 idle:3 PID:DATA0 data:00 05 02 00 00 00 00 00 CRC16:16eb idle:6 PID:ACK idle:2e0c PID:SETUP ADDR:02 ENDP:00 CRC5:15 idle:3 PID:DATA0 data:80 06 00 01 00 00 12 00 CRC16:f4e0 idle:2e24 这个是我的设备上抓的包,中间少了下面这部分 PID:IN ADDR:00 ENDP:00 CRC5:02 idle:7 PID:DATA1 data:CRC16:0000 idle:6 PID:ACK idle:2e48 有高手说是设备没有接收地址 PID:SETUP ADDR:02 ENDP:00 CRC5:15 idle:3这里地址已经分配好了,为什么又回这样? 是设备出问题,还是程序有问题的,怎么改才可以呢? |
|
最新喜欢:![]() |
沙发#
发布于:2004-12-23 11:26
如果你确定设备没有问题,那就是你后面的数据包地址设置的不对。
如果你确定主机没问题,那就是你设备收到了数据包,但却没有正确配置自己的地址 |
|
板凳#
发布于:2004-12-27 09:59
应该是设备问题吧
可是程序不是我写的,真是麻烦 还是谢谢大佬 |
|
地板#
发布于:2004-12-27 13:31
应该是设备(固件)的问题.
从上面的情况看,HOST已经给你的设备发送了SET ADDRESS命令,那就 是说: 1.你的设备的通信是好的,不然在GET DEVICE_DESCRIPTOR就进行不下 去. 2.那么同样你也应该收到了SET ADDRESS命令. 可能你的设备没有响应该命令,即没有将这个地址写入你的设备. |
|
|
地下室#
发布于:2004-12-28 11:10
也不知道对不对,我在程序中用了一个空字符串,这样就可以输出一个空数据包给主机,做为对地址分配得响应。
U8 c[]={""}; 最后包已经多了一部分 PID:SETUP ADDR:00 ENDP:00 CRC5:02 idle:3 PID:DATA0 data:00 05 02 00 00 00 00 00 CRC16:16eb idle:6 PID:ACK idle:2e0d 主机分配地址 PID:IN ADDR:00 ENDP:00 CRC5:02 idle:5 PID:DATA1 data:CRC16:0000 idle:6 这里发送一个空包给主机(比以前多的,和书上得相同了) PID:ACK idle:2e49 有应答 PID:SETUP ADDR:02 ENDP:00 CRC5:15 idle:3 PID:DATA0 data:80 06 00 01 00 00 12 00 CRC16:f4e0 idle:2e23 PID:IN ADDR:02 ENDP:00 CRC5:15 idle:2e88PID:OUT ADDR:02 ENDP:00 CRC5:15 idle:3 但是分配地址之后,那些包还是同以前一样,都少了主机或设备得应答ack,这个是怎么回事呢,如何解决? 还是地址没有接收?,我把地址寄存器得值打印出来,显示已经修改了地址得, 是还有什么地方设置有问题呢? 请高手指教! |
|
5楼#
发布于:2004-12-28 12:03
PID:SETUP ADDR:02 ENDP:00 CRC5:15 idle:3 PIDATA0 data:80 06 00 01 00 00 12 00 CRC16:f4e0 idle:2e23
这是向你要描述符. PID:IN ADDR:02 ENDP:00 CRC5:15 idle:2e88PID:OUT ADDR:02 ENDP:00 CRC5:15 idle:3 没见你应答. |
|
|
6楼#
发布于:2004-12-28 14:32
:(
你看你的设备在设置地址以后能接收到什么数据?还是任何数据都接收不到。 [编辑 - 12/28/04 by wdy9927] |
|
7楼#
发布于:2004-12-28 15:38
to metalwing
就是这个问题得,在分配地址之后设备已经没有响应了,不知道怎么回事得, to wdy9927 虽然每次都有中断, 在地址分配之后,好像连数据也接收不了了,因为把寄存器得值打印出来发现,都是零得 板子不是我做的,程序也不是我写的,现在是我在调而已。 不知道什么原因,前几天还可以在程序里面加入一些打印调试信息,都没问题得。 Uart_Printf("EP0_INT\n");像这种得, 现在只要加入一条,就有问题了,在一开始主机分配地址之前可以读到设备描述符就会读不到了 |
|
8楼#
发布于:2004-12-28 15:40
我现在只能用邪门来解释 :)
|
|
9楼#
发布于:2004-12-28 19:24
唉,我现在也是同样的问题呀。楼主解决了告诉一声哦
|
|
10楼#
发布于:2004-12-29 07:55
如果一个数据都收不到,那就是你的地址没设置对。
仔细看一下,设置地址的那个函数。 |
|
11楼#
发布于:2004-12-29 10:43
我还是把设置地址的那部发贴出来吧
程序不是我写的,牛人写的,但是这里已经被我修改了 U8 c[]={""};这里是为了给主机发送空包作为对地址分配的响应,我加的 case SET_ADDRESS: CLR_EP0_OUT_PKT_RDY(); //清ep0状态寄存器 rFUNC_ADDR_REG=descSetup.bValueL | 0x80;//地址放在wValue字段的低字节,更新ADDR_UPDATA Uart_Printf("\n%xADDR\n",rFUNC_ADDR_REG);//输出地址值,输出为82 WrPktEp0(c,1); //发送空数据包给主机做为响应 SET_EP0_IN_PKT_RDY(); //ep0 fifo有数据,准备发送 ep0State=EP0_STATE_INIT; break; 然后EP0_STATE_INIT处理过程下面的, case EP0_STATE_INIT: break; 下面是高手以前的程序, case SET_ADDRESS: rFUNC_ADDR_REG=descSetup.bValueL | 0x80 CLR_EP0_OUTPKTRDY_DATAEND(); //没有数据传输控制,DATA_END位置1,数据传输结束 ep0State=EP0_STATE_INIT; break; case EP0_STATE_INIT: break; 大家帮我看看吧,真的搞不清楚是怎么回事,它的协议里也没有详细的说明 |
|
12楼#
发布于:2004-12-29 10:49
说明一下,
void WrPktEp0(U8 *buf,int num) //写EP0数据包 { int i; for(i=0;i<num;i++) { rEP0_FIFO=buf; } } Uart_Printf 是串口输出函数,可以在 AccessPort.exe上看到输出的 应该暂时就这么点吧,如果还有再补充了 |
|
13楼#
发布于:2004-12-30 18:37
用仿真器跟踪一下,看看是否更新了设备地址.
|
|
|
14楼#
发布于:2005-01-06 10:00
主机给从机发送了设置地址命令之后,从机接收到命令,
从机要先给主机发送一个零长度的数据包作为回应,仍然发送到默认地址,然后设备才执行设置地址的命令, 我这样理解对吗? 零长度的数据包可以这样表示吗,unsigned char c[]={""};双引号之间没有空格,就是两个连续的双引号,可以这样吗? case SET_ADDRESS: WrPktEp0((U8*)c,0);//零长度的数据包送入fifo SET_EP0_IN_PKT_RDY();//通知主机设备有数据发送 rFUNC_ADDR_REG=descSetup.bValueL | 0x80;//更新地址 Uart_Printf("%xaddr\n",rFUNC_ADDR_REG); ep0State=EP0_STATE_INIT; //地址设置完毕,跳出 break; 我这样写程序有问题没有的, 在仿真器上可以看到地址背设置了,寄存器的值已经变成想要的了 这个问题已经困扰我两个星期了, PID:SETUP ADDR:00 ENDP:00 CRC5:02 idle:3 PID:DATA0 data:00 05 02 00 00 00 00 00 CRC16:16eb idle:7 PID:ACK idle:2e0b PID:IN ADDR:00 ENDP:00 CRC5:02 idle:5 PID:NAK idle:1a PID:IN ADDR:00 ENDP:00 CRC5:02 idle:6 PID:NAK idle:1a 在主机发送设置地址命令之后,从机的状态一直是NAK,NAK 表示功能部件没有传输数据到主机(对于输入传输)。 NAK 仅由功能部件在输入传输的数据阶段返回,或在输出传 输的握手阶段返回。出于流控制的目的,NAK 用于表示功能部件暂 时不能传输,或者接收数据,但是最终还是能够在不需主机干涉的情况下而传输或接收数据。 NAK 表明USB 设备芯片与主控芯片之间的数据传输是正常的,只不过设备现在无法处理所传输的数据。此时主机应该重试,直到设备发出ACK 为至,重试的次数越多 上面这段是我从书上找来的, 在地址分配之后,一直出现NAK状态,就是上面那种的一直延续很多个,但是都没有接收到数据, 等到下面的命令也是一样的,主机发出命令,从机已经连命令都收不到了,没有了ACK握手包。 PID:IN ADDR:00 ENDP:00 CRC5:02 idle:6 PID:NAK idle:1a PID:IN ADDR:00 ENDP:00 CRC5:02 idle:5 PID:NAK idle:f6 PID:SETUP ADDR:02 ENDP:00 CRC5:15 idle:3 PID:DATA0 data:80 06 00 01 00 00 12 00 CRC16:f4e0 idle:2e23 PID:IN ADDR:02 ENDP:00 CRC5:15 idle:2e88 PID:OUT ADDR:02 ENDP:00 CRC5:15 idle:3 PID:DATA1 data:CRC16:0000 idle:2e62 PID:SETUP ADDR:02 ENDP:00 CRC5:15 idle:3 PID:DATA0 data:80 06 00 02 00 00 2e 00 CRC16:f4b5 idle:2e24 这里问题在圣诞的时候就已经困扰我了,一点进展都没有的 好痛苦的 |
|
15楼#
发布于:2005-01-17 23:26
楼主用什么工具抓的数据阿,很全的样子。讲讲
|
|
16楼#
发布于:2005-01-18 08:59
楼主用什么工具抓的数据阿,很全的样子。讲讲 是啊。我也想问问呢。 |
|
|
17楼#
发布于:2005-01-18 21:56
周立功网站上得那个工具
是和它得那个usb分析仪配套使用得 现在usb已经搞定了 但是网络驱动这里调得头都大了,还好有源码可以看 |
|