saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2141回复:17

usb设备为什么没有接收主机分配的地址?

楼主#
更多 发布于:2004-12-23 10:08
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这里地址已经分配好了,为什么又回这样?
是设备出问题,还是程序有问题的,怎么改才可以呢?

最新喜欢:

wolfaspwolfas...
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-18 21:56
周立功网站上得那个工具
是和它得那个usb分析仪配套使用得
现在usb已经搞定了
但是网络驱动这里调得头都大了,还好有源码可以看
tsingkong
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2013-11-25
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-18 08:59
楼主用什么工具抓的数据阿,很全的样子。讲讲

是啊。我也想问问呢。
mailto:tsingkong@163.com
XiaoNanFeng
驱动牛犊
驱动牛犊
  • 注册日期2004-11-30
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-17 23:26
楼主用什么工具抓的数据阿,很全的样子。讲讲
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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

这里问题在圣诞的时候就已经困扰我了,一点进展都没有的
好痛苦的
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-30 18:37
用仿真器跟踪一下,看看是否更新了设备地址.
新手上路,请多关照.
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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上看到输出的
应该暂时就这么点吧,如果还有再补充了
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于: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;

大家帮我看看吧,真的搞不清楚是怎么回事,它的协议里也没有详细的说明
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-12-29 07:55
如果一个数据都收不到,那就是你的地址没设置对。

仔细看一下,设置地址的那个函数。
chenlingyan
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2005-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-28 19:24
唉,我现在也是同样的问题呀。楼主解决了告诉一声哦
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-28 15:40
我现在只能用邪门来解释  :)
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-28 15:38
to  metalwing
就是这个问题得,在分配地址之后设备已经没有响应了,不知道怎么回事得,
 to wdy9927
虽然每次都有中断,
在地址分配之后,好像连数据也接收不了了,因为把寄存器得值打印出来发现,都是零得

板子不是我做的,程序也不是我写的,现在是我在调而已。
不知道什么原因,前几天还可以在程序里面加入一些打印调试信息,都没问题得。
Uart_Printf("EP0_INT\n");像这种得,
现在只要加入一条,就有问题了,在一开始主机分配地址之前可以读到设备描述符就会读不到了
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2004-12-28 14:32
 :(

你看你的设备在设置地址以后能接收到什么数据?还是任何数据都接收不到。



[编辑 -  12/28/04 by  wdy9927]
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
13楼#
发布于: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
没见你应答.
新手上路,请多关照.
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于: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,这个是怎么回事呢,如何解决?
还是地址没有接收?,我把地址寄存器得值打印出来,显示已经修改了地址得,
是还有什么地方设置有问题呢?
请高手指教!

metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-27 13:31
应该是设备(固件)的问题.
从上面的情况看,HOST已经给你的设备发送了SET ADDRESS命令,那就
是说:
1.你的设备的通信是好的,不然在GET DEVICE_DESCRIPTOR就进行不下
去.
2.那么同样你也应该收到了SET ADDRESS命令.
可能你的设备没有响应该命令,即没有将这个地址写入你的设备.
新手上路,请多关照.
saite136
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-27 09:59
应该是设备问题吧
可是程序不是我写的,真是麻烦
还是谢谢大佬
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2004-12-23 11:26
如果你确定设备没有问题,那就是你后面的数据包地址设置的不对。


如果你确定主机没问题,那就是你设备收到了数据包,但却没有正确配置自己的地址


 
 
游客

返回顶部