打印

USB控制传输流程??

[复制链接]
4286|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chunnynee|  楼主 | 2010-11-20 10:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chunnynee 于 2010-11-20 10:27 编辑

大家好,本人最近在玩USB 设备,
现在我能接收到HOST 发送的读取设备描述符的命令,但不知道如何回复,这个先不说。现在越看资料越觉得糊涂,我想描述下我对控制传输的过程,不知道是否正确,请指教:
USB HOST发送控制传输的流程如下:
SETUP  packet -> DATA1 packet xxxxxxxx ->ACK(device to host),其中,xxxx标识具体的传输数据,如读取设备描述符:80 06 00 01 00 00 40 00
设备在接收正确的情况下 会自动发送ACK
随后,host 利用IN packet 读取设备反馈的描述符。
IN packet ->DATA 0 packet xxxxxxxx ->ACK          其中,xxxx标识具体的传输数据,如设备描述符:12 01 00 02 00 00 00 08 CA 15 C3 00 12 05 00 02 00 01

请问:该流程正确吗??

搞了很长时间了,也看了usb spec2.0对control transfer 章节,是越看越糊涂,请有经验的兄弟们给点迷津,谢谢。

相关帖子

沙发
sz_kd| | 2010-11-20 11:21 | 只看该作者
是对的,主机要请求什么你就回复什么

使用特权

评论回复
板凳
chunnynee|  楼主 | 2010-11-20 13:50 | 只看该作者
那我现在既然收到HOST发来了 “读取设备描述符的命令”, 但随后没有收到HOST 发来的IN命令用来读取设备描述符。

使用特权

评论回复
地板
chunnynee|  楼主 | 2010-11-20 14:55 | 只看该作者
我是第一次使用PIC18F4550(以前弄过PIC16F887)。
我对SetUp的流程的理解如下:
Setup Token packet -> DATA1 packet ->XXXXXxX>ACK
XXXX代表“ 80 06 00 01 00 00 40 00”。
ACK是PIC18F4550接收到正确的消息后由SIE自动回复?
这个过程的理解对吗 ??

然后应该如何把"Device Descriptor"返回给 host呢 ??
我的做法是:
BDT[EP0_IN_EVEN].ADR = (U16)(&CtrlTrfInData[0]);
BDT[EP0_IN_EVEN].CNT = 0x40;
BDT[EP0_IN_EVEN].STAT.Val = 0x00;
BDT[EP0_IN_EVEN].STAT.Val |= _USIE;
其中,CtrlTrfInData是返回的Device Descriptor 的缓存。
不知道这样回复是否正常??
请大家给点思路,谢谢。

使用特权

评论回复
5
sz_kd| | 2010-11-21 00:48 | 只看该作者
把你设备描述符的值通过控制端点传给主机就好了,就是写进USB 的FIFO里发送给主机。

使用特权

评论回复
6
chunnynee|  楼主 | 2010-11-27 09:39 | 只看该作者
到现在枚举还没成功,请问谁用过PIC18F4550开发过USB 设备,能帮我分析下这个MCU是如何实现的?
我看了多遍的手册,但还没找到门路,郁闷的很。
nichunhua1981@sohu.com

使用特权

评论回复
7
chunnynee|  楼主 | 2010-11-27 14:59 | 只看该作者
但在USB 2.0 spec中,在Status stage中,主机需要用IN token来查询设备是否完成处理,设备需要返回长度为0的数据,才表示该次setup操作完成。
如果从这里看,好像ACK不应该由 SIE主动完成。

我现在越看越糊涂,都否定以前的对USB的认识了。
哪位朋友帮忙解释下呢??

使用特权

评论回复
8
elevent| | 2010-11-27 17:12 | 只看该作者
实际上Status Stage 的方向和Data Stage的传输反向总是相反的
SETUP 的令牌的同步标志 总是DATA0, 后面的数据阶段的同步标志总是从DATA1开始。状态阶段的同步标志总是DATA1

使用特权

评论回复
9
chunnynee|  楼主 | 2010-11-28 19:03 | 只看该作者
这个我理解,
我想问的是:最后status stage既然 是由host 用IN来查询设备是否完成操作,如果完成,设备就返回长度为0的数据。就说明此时不应该由设备的SIE自动回复ACK。
好像两者有冲突??
应该是我还没理解协议,但请大家给我明示下,谢谢啦

使用特权

评论回复
10
sz_kd| | 2010-11-29 12:11 | 只看该作者
应该这样吧,主机产生IN 中断来接受设备返回的数据,当数据无错误的发送完成后主机收到就以ACK应答设备。对于OUT 则刚好相反。

使用特权

评论回复
11
chunnynee|  楼主 | 2010-12-1 20:33 | 只看该作者
用分析仪捕捉了下,对照Spec看后明白了,呵呵
ACK在三个阶段中都会返回,host or device都能完成。
但一个transfer就需要按照上述三个阶段分别完成。
我现在的设备是全速的,但主机居然还需要提供 device_qualifier,80 06 00 06 00 00 0A 00,
按照协议应该返回rquest error即:STALL PID。
请问大家:你们做设备的时候接受到该请求吗??谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

1

粉丝