打印

USB host 收到NAK后该怎么做?

[复制链接]
4937|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huhu2009|  楼主 | 2010-8-17 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用107的片子做USB HOST,对U盘write_sector()有时候会得到NAK,但不知道host收到NAK后是继续等——兴许device一会儿就回ACK、还是重新write_sector()?

目前对write_sector()是分三步走: 发SCSI写命令、块传输、test unit ready,应该没问题。
沙发
vigia| | 2010-8-17 09:50 | 只看该作者
没超时就继续发TOKEN,超时就退出重新发命令。

使用特权

评论回复
板凳
huhu2009|  楼主 | 2010-8-17 10:28 | 只看该作者
可是写一个扇区是先发SCSI写命令(token->OUT->status),告知U盘要写一个扇区。然后发512字节的数据,如果一个包max size是64字节,则要发8次包,每次也是token->OUT->status, 往往是发完第一个包收到NAK,vigia的意思是收到就重发token, 而不发OUT数据包?
假如超时设为5ms, 则超时后再从SCSI写命令开始重来一次?

使用特权

评论回复
地板
香水城| | 2010-8-17 10:36 | 只看该作者
什么叫收到就重发token,而不发OUT数据包?

不带数据的OUT Token在USB协议中是没有意义的!

使用特权

评论回复
5
huhu2009|  楼主 | 2010-8-17 11:41 | 只看该作者
刚试了一下,收到NAK后就重发token->OUT, 但重发后device什么也不回,既没有ACK,也没有NAK,好像把发来的token和OUT包忽略了一样,然后3秒超时就到期了

使用特权

评论回复
6
vigia| | 2010-8-17 11:55 | 只看该作者
不好意思,没讲清楚,我的意思是,发TOKEN,数据,收到NAK,就继续TOKEN,数据,直到超时。

超时以后想干什么你就自己定义吧,可以重发,也可以往上层报错。

使用特权

评论回复
7
huhu2009|  楼主 | 2010-8-17 16:52 | 只看该作者
若要写一个扇区,有没有办法知道device已经完成上一个操作、现在空闲
如2个连续的读/写扇区命令,在做第二个时,怎么确定device已经执行完前一个呢?
test unit ready?

使用特权

评论回复
8
jleige| | 2011-1-5 16:25 | 只看该作者
6# vigia

这么做的话 数据阶段是可以通过 但是CSW有时可以收到 有时又收不到 这个是怎么回事?

使用特权

评论回复
9
simple_head| | 2011-1-5 20:57 | 只看该作者
vigia:
“不好意思,没讲清楚,我的意思是,发TOKEN,数据,收到NAK,就继续TOKEN,数据,直到超时”

既然有收到NAK,就不存在超时 --- 超时是指device对于一个发给自己的packet不做任何回应。 你同意我的说法不?还是我的理解有错?

使用特权

评论回复
10
simple_head| | 2011-1-5 20:59 | 只看该作者
“若要写一个扇区,有没有办法知道device已经完成上一个操作、现在空闲
如2个连续的读/写扇区命令,在做第二个时,怎么确定device已经执行完前一个呢?
test unit ready?”

虽然我还没有做写U盘的程序,但是我想:
不需要test unit ready。 如果第一个写U盘的命令还没有执行玩,第2个写U盘的命令中的OUT packet会一直被U盘NAK的。

使用特权

评论回复
11
simple_head| | 2011-1-5 21:02 | 只看该作者
“刚试了一下,收到NAK后就重发token->OUT, 但重发后device什么也不回,既没有ACK,也没有NAK,好像把发来的token和OUT包忽略了一样,然后3秒超时就到期了”

--- 如果你重发,而得不到任何device的回应,那肯定是你重发的内容不对。 虽然我还没有做写U盘的程序,但是我觉得你对于device 的NAK,应该重发的是 : OUT + 64 byte (这64byte就是你被NAK的那1/8扇区)

使用特权

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

本版积分规则

22

主题

163

帖子

1

粉丝