打印

STM32 USB主机写CBW

[复制链接]
4474|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jleige|  楼主 | 2011-1-5 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在主机发送CBW之后,往u盘写入数据时,设备会返回一个nak。我现在的解决方案是在发送完CBW之后,延时100ms,这样u盘就可以正常接收数据。但是这样子是相当费时。所以现在改成重发,可是重发过程中设备一直会给我nak。请问重发的时候是只需要重发数据呢还是要重发CBW和数据。还有主机收到nak之后,是否要读取CSW。还有写数据时遇到nak要怎么处理?发觉这个跟接收nak的处理完全不一样
沙发
jleige|  楼主 | 2011-1-5 14:07 | 只看该作者
:Q再问下 现在在写大文件的情况下 遇到nak 重发依旧没用啊 大哥啊 这个写数据要怎么处理nak啊 哎 悲剧

使用特权

评论回复
板凳
simple_head| | 2011-1-5 21:11 | 只看该作者
虽然我还没有做写U盘程序,但是我觉得重发的应该是OUT+64 bytes (你被NAK的那1/8sector数据)。

还有,发送完CBW后,不要每次都等100ms,U盘的延迟是偶发性的。有时会延迟300ms。


“现在在写大文件的情况下 遇到nak 重发依旧没用啊”  --- 写U盘一个或者多个扇区,跟文件大不大无关。 NAK后的重发要**500~5000ms以上。虽然我还没有做写U盘,但枚举U盘时,有时候U盘会NAK接近1000ms。

使用特权

评论回复
地板
jleige|  楼主 | 2011-1-5 21:34 | 只看该作者
3# simple_head
对的 我发的就是被nak的那个64字节 呵呵 具体的情况我已经在另外的帖子回复你了 呵呵 现在只差接收不到CSW了。

使用特权

评论回复
5
simple_head| | 2011-1-5 21:47 | 只看该作者
“只差接收不到CSW”  --- 如果你要发送4K,那么应该一共有32个64字节的data packet。你是否确认你的确有32个out data packet被ack? 如果是,就不应该IN不回来CSW。

使用特权

评论回复
6
simple_head| | 2011-1-5 21:48 | 只看该作者
刚才有说错

“只差接收不到CSW”  --- 如果你要发送4K,那么应该一共有64个64字节的data packet。你是否确认你的确有64个out data packet被ack? 如果是,就不应该IN不回来CSW。

使用特权

评论回复
7
jleige|  楼主 | 2011-1-6 08:45 | 只看该作者
USB_OTG_HcHalt(&pdev , num);
//stsp.d32 = READ_REG32(&pdev.regs.common_regs->rx_stsp);//读取接收后的状态,则产生CHH中断。
while(OTG_FS_HCINT_Status(num , CHH) == CLEAR); //等待CHH中断置起

:D调出来了 果然是那个请求队列出的问题 哎 不过这个也奇怪 nak竟然可以不用读取请求队列就可以停止通道 哎 调的辛苦啊

使用特权

评论回复
8
simple_head| | 2011-1-6 13:43 | 只看该作者
拜托说明白点吧.

使用特权

评论回复
9
jleige|  楼主 | 2011-1-6 19:13 | 只看该作者
8# simple_head
呵呵 我这边停止通道有两种形式的:第一种是直接停止通道,就会出现CHH中断;第二种是停止通道后,还要再读取下请求队列才会出现CHH中断。再回到这里的问题是主机往设备写入数据,设备返回nak,这种情况是属于第一种情况。而我却采用第二种方式停止通道。因此会出现错误。这个错误就是由请求队列引起的,因为我在写数据阶段多了一次请求队列。所以导致在接受CSW时,会产生IN请求发送出去,设备却不给主机任何回应(就好像主机压根就没有发送IN请求一样)。你以前碰到的问题不就是请求队列的问题嘛,呵呵 不知道你有没做过这个实验。就是在枚举期间,如果你在某个阶段多读了一次请求队列,下个阶段就会出错。这时如果你清空发送和接收FIFO,则错误会消除。如果碰到这种情况那么可以肯定的是你的请求队列没有处理好。

使用特权

评论回复
10
simple_head| | 2011-1-7 09:15 | 只看该作者
"读取请求队列"  --- 这话我看不懂阿! 你说的"请求队列"是不是指RxFifo?

使用特权

评论回复
11
jleige|  楼主 | 2011-1-7 14:53 | 只看该作者
10# simple_head OTG_FS_GRXSTSP就是这个寄存器 呵呵 这里面装的有数据和请求的

使用特权

评论回复
12
myxiaonia| | 2013-8-26 10:41 | 只看该作者
simple_head 发表于 2011-1-5 21:48
刚才有说错

“只差接收不到CSW”  --- 如果你要发送4K,那么应该一共有64个64字节的data packet。你是否确 ...

兄弟  不是还要再加个0长度的空包呀  告诉设备传输已经结束

使用特权

评论回复
13
myxiaonia| | 2013-8-26 10:44 | 只看该作者
jleige 发表于 2011-1-6 08:45
USB_OTG_HcHalt(&pdev , num);
//stsp.d32 = READ_REG32(&pdev.regs.common_regs->rx_stsp);//读取接收后的 ...

兄弟  in通道chh后rxfifo会接收到一个chh状态,读取后chh中断才会发生
out通道确实是直接产生中断  手册上的编程指南有说

使用特权

评论回复
14
trumpxp| | 2013-8-26 19:23 | 只看该作者
好帖子   21ic论坛中    STM  感觉是最活跃的2   真的很不错   顶一个   有时间   这一块   需要好好学一学   很不错的资料哦

使用特权

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

本版积分规则

28

主题

69

帖子

1

粉丝