微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > USB总线协议基础知识

USB总线协议基础知识

时间:12-15 来源:互联网 点击:

一个初始时未分配地址的usb function进行交互来分配地址呢。这里,是这样解决的:

usb协议保留了一个“通用地址”0,usb host 通过这个地址0来和初始未分配地址的usb function进行通讯,进行一

些初始的准备工作,诸如这里的为它非配一个特定地址。后面我们就会了解到,usb除了配置地址外,还有一些

其它参数需要事先主从双方达成共识。这些参数也都是通过控制式传输完成的。一个Usb 的控制式传输如图二:

一个Usb的控制式传输分为两个或三个阶段进行传输:setup stage,data stage(视情况而定),status stage。

  1. 首先是setup stage,联系上节所说的Usb传输模式,usb Host总是先发起第一个packet--这里它
    1. 首先发起setup,
    2. 之后发起以data0为起始的setup data,
    3. 最后usb function回应ack结束一次交互。
  2. 其次如果有data stage,类似的,还是按照上节说的usb传输模式,
      1. usb host总是先发起第一个Packet--Out(或in),
      2. 之后usb host(或usb function)发起以data1为起始的payload data,
      3. 最后Usb fuction(或usb host)回应ack结束一次交互。
    1. 如果数据未传完,继续data stage,同上继续。
  3. 最后是status stage,类似的,
    1. usb host首先发起第一个Packet--in(或out),
    2. 之后usb function(或usb host)发起以data1为起始的Null data(0长度),
    3. 最后Usb host(或usb function)回应ack结束一次交互。

如此,整个控制式传输结束。 你或许有疑问,data stage为什么进行了多次而非一次完成?实际上,usb总是将

一批大量的数据分成了许多小段来进行传输,称为一个pay load。这样传输的目的是容易对传输进行控制。既然

一次大量的数据总是被分成一段一段来分次传输,那么这里就出现了一个需要事先确定的参数(wMaxPacketSize):即每次即这个小段有多大。这个参数如地址指派一样,正式传输之前需要事先达成共识。通过控制式传输,现在我们

已经完成了usb function的地址指定等参数的设置工作,下一步可以进行正式的数据传输了。

块传输(bulk Transactions)

我们终于等到usb function 配置完成,现在我们的任务是要传送一批数据,这里可以使用批量数据传输(bulk Transactions)。 一个批量传输总是按照如图所示方式进行,

  1. 首先,usb host发起第一个Packet--in(或out),表示要开始数据传输了。
  2. 其次,usb function(或usb host)发起以data1(或data0)为起头的payload data,开始一次交互。
  3. 再其次,usb host(或Usb function)发起ack回应这次交互。 如果数据还为传完,继续上述过程,即:
    1. 首先,usb host再次发起一个Packet--in(或out),表示又要开始数据传输了。
    2. 其次,usb function(或usb host)发起以data0(或data1)为起头的payload data,开始又一次交互。
    3. 再次,usb host(或Usb function)发起ack回应这次交互。
    如此继续直至传输完成。

这里的疑问依然是为什么一次可能传完的数据为什么分成多次进行传输,原因在上次介绍控制式传输式已经说明。

后面我们就会明白,为什么这样可以方便控制传输过程。 仔细看看控制式的data stage采用的传输方式,是否

就是批量传输方式呢?!注意,每次payload data的“牵头人”(preamble)在轮番掉换,先是data1,接着data0,

再是data1,......如此接替,只要有一次交互出现问题,这个接替规则就会被打破进而被Usb host识别而发现

传输异常。所以这个交替的“牵头人”规则是可靠数据传输的所采取的措施之一。

同步传输(Isochronous Transactions)和中断式传输(Interrupt Transactions)

在批量数据传输中,触发一次批量数据传输总是“被动”的,就是说需要数据传输时Usb host并不会主动发起

传输,而是需要得到你的指令。当你告诉它:“一切ok,让我们开始吧!” 这时它才开始数据传输。这种方式

显然在某些情况下并不适合。比如音视频流,你无法要求它听从你的“指挥”,让它等你发指令给usb host,

然后开始一次传输。我们需要的是一种“及时”传输。一个好的方案就是设置一个timer,按照tick发起usb传输。

这个tick通常以1ms(usb full speed)为最小单位。这时,可以设置为每次1ms tick出现,usb host“自动”发起一

次数据传输。那么这种方案具体如何来实现呢?看来最基本的要素便是一个发出tick的timer,而这个“timer”

需要usb host和usb function(事实上还要包括usb hub)双方均能“看到”,从而协调工作,否则单方面的

timer又有何意义?这个"timer"(或tick)在usb中使用一个特殊的packet实现,即是SOF。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top