babyblue
驱动中牛
驱动中牛
  • 注册日期2003-05-06
  • 最后登录2005-12-21
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2384回复:6

请问:如何知道一个微帧中传送多少个packets?

楼主#
更多 发布于:2003-11-03 08:41
USB2.0中规定一个微帧(125us)可以传多个数据包,假如现在连续往FIFO(自动传输模式)中写两个1K的数据包,那么这两个数据包是在同一个微帧中完成传输吗?
主机的读命令,slave FIFO以及微帧之间的时序到底是怎么配合的?



[编辑 -  11/3/03 by  babyblue]

最新喜欢:

lmhhlmhhlmhhlm...
babyblue
驱动中牛
驱动中牛
  • 注册日期2003-05-06
  • 最后登录2005-12-21
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-03 10:39
 :( :(
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-03 14:29
乖,别生气,偶来回答你的问题 :D

根据协议规定,每个微帧最多可以传输13个512字节的高速数据包(具体内容参考usb2.0协议第54和55两页,尤其是54页最上面那几行)。

你举的例子其实是4个512的数据包(如果你的最大包大小设的是512的话),他们有可能不是在同一个微帧中传给主机的,因为usb传输是按时间来分配的,假设说你的数据在第一个125us的最后一个可容纳512字节的时间内准备好了,那么第一个512字节会在这个微帧传给主机,而剩余的数据会在下一个微帧传给主机。

再如果你填充端点的速度比较慢,那么这4个512字节的数据包很可能实在4个不同的微帧中传给主机的!

为了说得更明白一点,我从主机到设备再给你详细解释一下(个人见解,仅供参考):

1,应用程序启动传输,比如按你的例子,要求从设备读取2k字节的数据。应用程序通过deviceiocontrol()或者readfile()把请求发给设备驱动。
2,设备驱动根据这个请求建立一个irp,然后把这个irp传给低层驱动,usbd,hcd等
3,底层驱动处理这个irp。通常一个irp里会有很多个Transaction(事务),但是我们的数据比较少,因此一般情况下在一个事务里就可以完成传输。但是这一个事务里可能会包含很多个帧(Frame),而一个帧里面又有8个微帧。

再开始传输前你要先建立一个概念,其实不管是帧还是微帧,它都表示的是一段时间!
4,现在我们开始传输!首先,主机要发送in令牌来监测端点里是否有数据,注意,这时候第一帧的第一个微帧的时间(125us)已经开始了,如果你的数据已经准备好了,那么第一个512会传到主机,接着后三个也会在这个微帧中传给主机,这样是最简单的情况。

我们假设此时你的设备端数据没有准备好!那么在使用bulk传输时,主机在第一个in令牌收到nak后,会接着发送下一个in令牌,这样一直发下去,直到第一个微帧时间要耗尽的时候(我们假设在剩余的时间里刚好可以传输一个512的数据包),设备端端点里的数据准备好了,那么在接着的一个in令牌后面,一个512字节的数据包会被主机获得,可是此时第一个微帧已经结束了!那么剩余的数据会在后面的微帧中接着重复前面的操作!当这4个512字节数据包主机都得到后,我们的那个Transaction就结束了,然后那个irp会被完成,并把数据返回给应用程序。

我说的比较罗嗦,不知道能不能让你明白,有错漏之处请不吝赐教!
具体内容参考协议第5章第11节以及第8章“协议层”的内容。
还有参考图示:Figure 5-13. USB Information Conversion From Client Software to Bus
Figure 5-14. Transfers for Communication Flows
Figure 5-15. Arrangement of IRPs to Transactions/(Micro)frames
Figure 8-30. Bulk Transaction Format

注:上面所说的“设备端点里的数据准备好”指的就是你的slave fifo的外设把端点写满了!


[编辑 -  11/3/03 by  jinghuiren]
babyblue
驱动中牛
驱动中牛
  • 注册日期2003-05-06
  • 最后登录2005-12-21
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-03 15:06
谢谢! :)
我还有一点不懂,我的数据是每125us 1280个字节,就是2packets还多256个,那这256字节是与下一微帧中的前256个字节合成一包再传输吗?
fifo和微帧把握弄晕了。
ice_fire333
驱动老牛
驱动老牛
  • 注册日期2002-10-08
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-03 17:10
babyblue,你是开发硬件的吗,需要搞这么深呀
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。   十步杀一人,千里不留行。事了拂衣去,深藏身与名。   闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。   三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。   救赵挥金槌,邯郸先震惊。千秋二壮士,煊赫大梁城。   纵死侠骨香,不惭世上英。谁能书阁下。白首太玄经。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-03 20:08
谢谢! :)
我还有一点不懂,我的数据是每125us 1280个字节,就是2packets还多256个,那这256字节是与下一微帧中的前256个字节合成一包再传输吗?
fifo和微帧把握弄晕了。


如果你写完最后的256个字节数据并且没有给处PKTEND信号,那么这256会和下256一起组成一个包发给主机,否则会被认为是一个不满包而发给主机的

注意,这256可能和下256在同一个微帧中!并不一定是在不同的微帧中的,所以我你不需要对这里了解的非常细致,你只需要知道在固件里不断地往端点里填充数据就行了

说实话,有些东西你真的不需要弄的非常明白的,不过明白了也不是什么坏事,呵呵。 :)
babyblue
驱动中牛
驱动中牛
  • 注册日期2003-05-06
  • 最后登录2005-12-21
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-04 08:32
babyblue,你是开发硬件的吗,需要搞这么深呀


硬件也要写程序呀 :)
游客

返回顶部