打印

USB控制读操作,为什么是设备决定数据传输正确与否?

[复制链接]
2210|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DeanSinaean|  楼主 | 2011-3-19 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,请教大家一些问题:
状态阶段讲究更多一些,因为这一阶段要返回数据传输成功与否。具体如下:
1. 读数据成功 主机发送OUT令牌包(PING令牌包,高速情况下),主机发送0长度数据包,设备ACK.
2. 数据传送出错 主机发送OUT令牌包(PING令牌包,高速情况下),主机发送0长度数据包,设备STALL.
3. 设备忙(比如正在写数据) 主机OUT或(PING令牌包,高速情况),主机发送0长度数据包,设备NAK. 这时主机应该继续发送IN令牌包,持续状态阶段。

这让我很困惑,把我的疑问列出来,知道的一定要帮忙解释一下,不确定的,也欢迎加入讨论,谢谢~
1.为什么由设备决定传输成功与否?
2.什么情况下,会让设备认为传输出错,并进入引用部分的第二条,即在握手时返回STALL?
3.什么情况下,设备会忙,并握手返回NAK?这不是设备把数据传给主机的吗?进入到状态阶段,数据应该是传完了啊。

上面三个问题,谢谢大家了。

相关帖子

沙发
dqyubsh| | 2011-3-19 18:44 | 只看该作者
说下我的理解,讨论一下吧。

先说3,USB设备是一个移动硬盘。主机发一个命令,比如格式化硬盘,设备会进入格式化过程。格式化大概需要2-5分钟,此时,主机问设备状态,设备应答忙,NAK,主机会一直问设备的状态,设备一直回答忙。直到格式化结束,回答一个ACK。一个命令过程执行完毕。

再说2,主机发送一个读取数据的命令,设备在准备数据的时候出错了(磁头坏了,哈哈),设备就会发送STALL,通知主机停止该命令的执行。

再说1,主机发送一个命令,读硬盘的序列号,很快读回来了,就是ACK。

主机会给设备发送一系列命令,随时了解设备的状态,决定下一步如何工作,难道不这样做还有别的办法吗?

我觉得这里边有个问题恐怕混淆了,主机发的命令都是应用层的命令,比如格式化,拷贝文件等等,而你上述文字要阐述的是USB底层的协议,实际上,USB总线上一直有TOKEN在跑,主机发送给设备的,nS级发送一次,TOKEN的末尾包含着设备的应答ACK/NAK/STALL。这些应答在设备端是可以由固件修改的。

回头说3,如果设备一直NAK,那么主机应用就不知道设备格式化的进程,界面会死掉,甚至USB会枪毙掉这个过程(超时处理吧,不确定),这是不允许的。那么,通常的作法就是,化整为零,首先了解整个磁盘多少扇区,然后知道当前格式化到多少个扇区,算出百分比,显示在界面上,并允许用户CANCEL。底层就是这样:不会一直NAK,而是每格式化1024个扇区回答一个ACK,主机收到之后显示一个进度。直至完成。

使用特权

评论回复
板凳
钻研的鱼| | 2011-3-21 22:05 | 只看该作者
对于第一个问题:主机不会返回NAK这种应答,也不会stall。主机要么不返回应答信号,要么是ACK
对于第二个问题:设备认为传输错,并进入stall,我不知道。我猜测stall是由于设备本身出错,而不是传输过程中出错。
对于第三个问题:设备没有准备好数据,会返回nak,准备好之后,会ack
我理解比较浅,抛砖引玉吧

使用特权

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

本版积分规则

个人签名:欢迎光临讨论:http://www.usr.cc

0

主题

20

帖子

1

粉丝