阅读:1377回复:19
使缓冲区有效后,数据马上发送么? 20分!
还是等待下次IN的到来再发送?
|
|
最新喜欢:![]() |
沙发#
发布于:2003-11-05 15:30
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2003-11-05 15:33
如楼上所说,等IN来了再发.
USB 的传输由PC发起. :D |
|
地板#
发布于:2003-11-05 15:39
谢谢。
就你的答复有三点疑问: 1)HOST发出IN后,是否设备自动发送已准备好的数据,而不需MCU干预? 2)设备是如何知道主机要IN数据的呢?也就是何时准备数据呢? 3)假如读中断寄存器,发现是端点0,IN中断,此时我的中断处理是准备数据呢,还是发送数据? 谢谢! |
|
地下室#
发布于:2003-11-05 15:50
我才疏学浅,
对你的问题有下面的以为,也不知道对不对: 1)HOST发出IN后,是否设备自动发送已准备好的数据,而不需MCU干预? 答:高速模式下,不需要mcu干预。全速模式下,不知道。 2)设备是如何知道主机要IN数据的呢?也就是何时准备数据呢? 答:设备随时准备好数据,随时准备好主机来取。 3)假如读中断寄存器,发现是端点0,IN中断,此时我的中断处理是准备数据呢,还是发送数据? 答:发送数据。 |
|
|
5楼#
发布于:2003-11-05 15:57
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2003-11-05 16:15
先谢两位!看来20分是不够了,我会另开贴给分的。
3、当IN中断到来后,CPU应该是往缓冲区写数据,以准备好数据,IN中断到来是表明上次IN传输成功 疑问:是否我理解错了?“IN中断到来是表明上次IN传输成功,CPU应该是往缓冲区写数据,以准备好数据“,好像还是IN来了才准备数据的么? 实际上我还是不明白:“3)假如读中断寄存器,发现是端点0,IN中断,此时我的中断处理是准备数据呢,还是发送数据?“ |
|
7楼#
发布于:2003-11-05 16:19
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2003-11-05 16:40
你这样说,我明白了点,但是是什么引起IN端点中断的呢?
应该是HOST发出的IN吧,是否先发送已经准备好的数据,同时准备下次的数据? 问题是设备也不知道,下次主机要什么数据啊?所以IN中断前,应该是先有命令告知设备吧. 但是在批量传输中,是如何告知设备准备数据的呢,还是事先约定准备什么样的数据,等到IN即发送。 在请问,判断是何种标准设备请求命令及响应请求,是否在端点0,OUT中断子程序中判断执行? 资料中说,收到建立包后,要设置建立包标志,请问这是干什么用的? 再次感谢!! |
|
9楼#
发布于:2003-11-05 17:09
用户被禁言,该主题自动屏蔽! |
|
10楼#
发布于:2003-11-05 17:32
-----但是是什么引起IN端点中断的呢?
答:设备收到主机的ACK后。 这就是我的问题所在!!我一直以为是收到IN才产生中断的呢? 可能还有似懂非懂的地方,因为你的热情(有点像到了21IC,那种久违了的活跃的讨论气氛),我要先开个帖给点分,表示感激! |
|
11楼#
发布于:2003-11-05 17:34
我来说几句 :D
对于你的疑惑有几种情况: 1,对于控制传输: 每次传输的第一个阶段都是setup阶段,在setup包中,如果需要有第二个阶段数据阶段的话,你在收到setup包之后就要把第一组数据写到ep0in端点中,因为当主机收到setup请求的ack应答后就会发送ep0的in令牌到设备(设备正确收到8字节的setup包后就会给主机ack应答),之后的操作就和pengenwen兄说的一样了,当主机正确收到一个数据包之后会发送ack给设备而产生ep0in中断,在这个中断里你继续往端点里写没有写完的数据。 2,对于bulk或者int传输: 有几种方法可以实现: 1)大部分的设备芯片支持对nak产生中断,如果主机需要读取数据,会发送in令牌给设备,设备没准备好数据的话就发送nak给主机,这是就会产生中断,你可以在此是把数据写到端点里,之后的中断方式就如pengenwen说的一样了是ack中断 2)有的设备芯片支持对第一个nak和所有的ack产生中断,你可以在第一个nak中断里把第一个数据包写到端点里,那么此后的中断就都是ack中断了。 3)如果有的芯片不支持对nak产生中断(一般不会的)你就必须想办法通知设备主机需要传输数据。你可以先发送一个out数据包给设备,然后启动in传输,设备在收到这个out包后把数据写到in端点里,也可以先启动一个控制传输,然后再启动in传输,原理同前! 明白了吗? |
|
12楼#
发布于:2003-11-05 17:56
原先搜索关于USB的帖子时,就对jinghuiren的热情有体会。
你回答了我想问的问题:就是关于握手信号的! 1) 设备正确收到8字节的setup包后就会给主机ack应答 应该是通过应答SETUP包吧,那么其他传输又是通过什么方式发送ACK的呢? 2)不知道PIDUSBD12是否支持NAK中断?好像中断寄存器没他的标志。 3)STALL应该是通过禁止端点告知HOST的吧? |
|
13楼#
发布于:2003-11-06 08:46
给分了,对fengzhongzhige鼓励分。敢于发表自己的看法,不论对错,都可能会给别人启发的。
jinghuiren,给你的分还不够,我会另开帖的(不过要等到我的可给分数高一点时,不想因为我的太多给分帖把别人的问题帖淹没)我把你的话记牢了,开窍不少。 pengenwen兄,谢谢了,我还有问题的,继续帮忙啊:) |
|
14楼#
发布于:2003-11-06 09:17
这是PDIUSBD12中控制输出的流程图。
|
|
15楼#
发布于:2003-11-06 09:19
各位,怎么图片怎么都打不开阿?是不是需要先上传阿?
|
|
16楼#
发布于:2003-11-06 12:42
原先搜索关于USB的帖子时,就对jinghuiren的热情有体会。 我说的情况时2.0的,1.1的也许没有那些机制,可是必然有相应的机制来实现这些功能。 1,是应答收到了setup包,其他传输一般是通过数据来进行的,也就是说某一方收到了对方的数据就会给对方发送ack信号,此时会产生中断,另外握手中一般是通过发送空的数据包的方法实现的。 2,我不大清楚,你需要再仔细看看datasheet. 3,如果一个端点被Stall掉了,当你再次使用它的时候设备就会发送stall给主机,此时你需要重新reset这个端点(一般通过clear featrue命令)然后才能使用。 |
|
17楼#
发布于:2003-11-06 15:38
1。 握手中一般是通过发送空的数据包的方法实现的谢谢提醒!
2。DATASHEET好麻烦,但是可以设置一个标志位,由主程序判断。 3。我的理解:STALL端点后,可RESET或接到SETUP包后恢复(后者应用较多,是在收到错误设备请求时,防止设备误收数据) 我现在有个很大的疑惑:关于端点2的批量传输的。 1。BULK传输是怎样开始的?肯定是HOST先发命令,他发的第一个命令就是IN么?(这么说端点2的缓冲区应该是先写入数据([U]在主程序中[/U]),等到IN后即发送,HOST收到后发ACK,设备产生IN中断,MCU响应中断,并写入数据([U]是在中断服务里写入第二次数据[/U]),等待下次IN,周而复始...... 2。对全速传输,最大字节数可设为64B. 这个64B是指什么呢?应该是在端点描述符中设定的吧! 是否指IN到来时,可以一次发送64B? 但是这些数据是存在哪里的呢?如D12的FIFO只有16字节,而此时HOST要读64B(最大信息包也设为64B),那么设备该怎样处理呢? 谢谢! |
|
18楼#
发布于:2003-11-06 20:38
1,这个问题我前面已经回答你了,可能是你没注意吧。
所有的传输都是主机启动的(这一点要牢记),在bulk in时,主机先发送in令牌到设备,如果设备没有准备好数据会给主机nak,主机会不断的查询。 对于设备方有两种可能。如果你的设备不能检测到nak,那么如果不是实时的数据的话你可以先写1个包到端点里,主机收完数据后会有ack中断。如果你不希望先往端点里写数据,那就让主机等待,什么时候有数据了就写到端点里,之后的情况入前。 2,全速设备bulk最大包大小是64,她实在描述符中确定的。他表示端点缓冲区最大只能是64个字节,如果你的数据比较多,那么只能分成多次传输。 你最后一种假设是这样完成的,应用程序要64字节数据,但是端点最大是16,那么底层驱动会把这64分成4个16向设备索取,设备每次传输16,传输4次完成,然后驱动把这64的数据返回给应用程序。 |
|
19楼#
发布于:2003-11-18 08:40
前段时间没来,谢谢jinghuiren!
开个新帖,表示感谢! |
|