only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1378回复:19

使缓冲区有效后,数据马上发送么? 20分!

楼主#
更多 发布于:2003-11-05 15:13
还是等待下次IN的到来再发送?

最新喜欢:

zhaihuazhaihu...
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-05 15:30
用户被禁言,该主题自动屏蔽!
test2test
驱动牛犊
驱动牛犊
  • 注册日期2003-07-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-05 15:33
如楼上所说,等IN来了再发.
USB 的传输由PC发起. :D
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-05 15:39
谢谢。
就你的答复有三点疑问:
1)HOST发出IN后,是否设备自动发送已准备好的数据,而不需MCU干预?
2)设备是如何知道主机要IN数据的呢?也就是何时准备数据呢?
3)假如读中断寄存器,发现是端点0,IN中断,此时我的中断处理是准备数据呢,还是发送数据?

谢谢!
fengzhongzhige
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2008-04-15
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望10点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-05 15:50
我才疏学浅,
对你的问题有下面的以为,也不知道对不对:
1)HOST发出IN后,是否设备自动发送已准备好的数据,而不需MCU干预?
答:高速模式下,不需要mcu干预。全速模式下,不知道。
2)设备是如何知道主机要IN数据的呢?也就是何时准备数据呢?
答:设备随时准备好数据,随时准备好主机来取。
3)假如读中断寄存器,发现是端点0,IN中断,此时我的中断处理是准备数据呢,还是发送数据?
答:发送数据。


PCI卡 http://blog.21ic.com/blog.asp?name=zhangdage
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-05 15:57
用户被禁言,该主题自动屏蔽!
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-05 16:15
先谢两位!看来20分是不够了,我会另开贴给分的。

3、当IN中断到来后,CPU应该是往缓冲区写数据,以准备好数据,IN中断到来是表明上次IN传输成功

疑问:是否我理解错了?“IN中断到来是表明上次IN传输成功,CPU应该是往缓冲区写数据,以准备好数据“,好像还是IN来了才准备数据的么?

实际上我还是不明白:“3)假如读中断寄存器,发现是端点0,IN中断,此时我的中断处理是准备数据呢,还是发送数据?“
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-05 16:19
用户被禁言,该主题自动屏蔽!
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-11-05 16:40
你这样说,我明白了点,但是是什么引起IN端点中断的呢?
应该是HOST发出的IN吧,是否先发送已经准备好的数据,同时准备下次的数据?
问题是设备也不知道,下次主机要什么数据啊?所以IN中断前,应该是先有命令告知设备吧.

但是在批量传输中,是如何告知设备准备数据的呢,还是事先约定准备什么样的数据,等到IN即发送。

在请问,判断是何种标准设备请求命令及响应请求,是否在端点0,OUT中断子程序中判断执行?
资料中说,收到建立包后,要设置建立包标志,请问这是干什么用的?

再次感谢!!
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-11-05 17:09
用户被禁言,该主题自动屏蔽!
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-11-05 17:32
-----但是是什么引起IN端点中断的呢?
答:设备收到主机的ACK后。

这就是我的问题所在!!我一直以为是收到IN才产生中断的呢?
可能还有似懂非懂的地方,因为你的热情(有点像到了21IC,那种久违了的活跃的讨论气氛),我要先开个帖给点分,表示感激!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
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传输,原理同前!

明白了吗?
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-11-05 17:56
原先搜索关于USB的帖子时,就对jinghuiren的热情有体会。
你回答了我想问的问题:就是关于握手信号的!

1) 设备正确收到8字节的setup包后就会给主机ack应答
应该是通过应答SETUP包吧,那么其他传输又是通过什么方式发送ACK的呢?
2)不知道PIDUSBD12是否支持NAK中断?好像中断寄存器没他的标志。
3)STALL应该是通过禁止端点告知HOST的吧?
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-11-06 08:46
给分了,对fengzhongzhige鼓励分。敢于发表自己的看法,不论对错,都可能会给别人启发的。
jinghuiren,给你的分还不够,我会另开帖的(不过要等到我的可给分数高一点时,不想因为我的太多给分帖把别人的问题帖淹没)我把你的话记牢了,开窍不少。
pengenwen兄,谢谢了,我还有问题的,继续帮忙啊:)

only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-11-06 09:17
这是PDIUSBD12中控制输出的流程图。
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-11-06 09:19
各位,怎么图片怎么都打不开阿?是不是需要先上传阿?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-11-06 12:42
原先搜索关于USB的帖子时,就对jinghuiren的热情有体会。
你回答了我想问的问题:就是关于握手信号的!

1) 设备正确收到8字节的setup包后就会给主机ack应答
应该是通过应答SETUP包吧,那么其他传输又是通过什么方式发送ACK的呢?
2)不知道PIDUSBD12是否支持NAK中断?好像中断寄存器没他的标志。
3)STALL应该是通过禁止端点告知HOST的吧?
 


我说的情况时2.0的,1.1的也许没有那些机制,可是必然有相应的机制来实现这些功能。
1,是应答收到了setup包,其他传输一般是通过数据来进行的,也就是说某一方收到了对方的数据就会给对方发送ack信号,此时会产生中断,另外握手中一般是通过发送空的数据包的方法实现的。
2,我不大清楚,你需要再仔细看看datasheet.
3,如果一个端点被Stall掉了,当你再次使用它的时候设备就会发送stall给主机,此时你需要重新reset这个端点(一般通过clear featrue命令)然后才能使用。
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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),那么设备该怎样处理呢?

谢谢!

 
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
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的数据返回给应用程序。
only8008
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2004-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-11-18 08:40
前段时间没来,谢谢jinghuiren!
开个新帖,表示感谢!
游客

返回顶部