普通的消费者使用USB设备的时候是不需要了解USB本身到底是怎么回事的,实际上,这样的人对USB到底是怎么回事都是处于无知的状态。无知,同时又享受着USB带来的便利,这种无知其实是很幸福的。
对于工程师来说,无知就常常意味着无能。你没有办法在无知的情况下进行思考,自然也没有办法开展相关的工作,要想把它变成安生立命的基础,或是仅仅满足求知的欲望,那就唯有从了解开始学习,使自己成为有知的状态,然后在遇到问题的时候就有了很好的思考基础,从而能够展开思考并且确定自己应该采取的行动,这样才有可能从中获得正面的结果。
USB的规范既要满足已有应用的需求,又要满足不断增加的带宽要求,就从1.0版本发展到了3.0版本(双向5Gbps),又在2013年进入了3.1时代,最终把它的速度提升到了双向10Gbps的水平。
双向同时进行的通讯是无法和USB 2.0以前的单一总线双向轮流进行的通讯方法兼容的,所以,USB 3.0以后的最大的变化并不是速度提高了,而是变成了双总线的结构:
为了持续兼容于过去的标准,很显然,USB 2.0的总线将持续存在下去,我想这种状况将持续到低速设备消亡以后才会发生改变。所以,首先认识USB 2.0的做法将具有比较长久的价值。我们今天关注的重点是USB 2.0以前版本的数据传输方法。
实际有效的数据传输大多是通过二进制的数据表达方式来进行的,由于二进制数据的每个位只有两个状态,其实现方法相对比较简单。对于低速的数据传输来说,用高低不同的电压信号就可以表达一个数据位的两种状态,其驱动电路和接收电路都非常简单。但是,USB是用于不同设备之间的远距离传输的,在这种情况下,用电压传递信号变得很不可靠,所以,它采用了电流传递信号的方法。下图是USB 2.0规范中提供的收发器接口电路示意图:
一个典型的USB 2.0收发器就是由这样的接口加上数据串并行转换器、数据时钟恢复电路以及一个ULPI(UTMI+ Low Pin Interface)接口和其它一些辅助电路构成的。
为了在USB总线上传递信息,驱动器的内部会有一个电流源(标称值为17.78mA),它被一个高速开关轮流切换引导至D+或D-。当电流被引导至D+时,它就对外表达了一个信号状态J;如果电流被引导至D-,它对外表达的信号状态是K。由J和K组成的信号序列来源于原始数据,它们之间是通过不归零反向编码的方法来进行转换的:
如上图所示,以0和1组成的二进制串行数据经过NRZI编码后形成的J/K序列送入前面图中的LS/FS Driver或High Speed Current Driver,其输出就呈现为总线上的连续不断的数据流了。
如果要将电压信号在传输线上进行传输,由于传输线是有阻抗的,其信号幅度会随着线路的延长而衰减,到了接收端,很可能信号幅度已经变得不足以被检出正确的数据了,而电流信号则不会有这个问题。当然了,电流信号的传输也会受到线路阻抗的影响,其脉冲形状也会发生变化,但相对来说就要更好些。
以我的直觉来看,除了传输的可靠性外,采用电流信号传输数据对于及时发现外设的接入和拔出非常有好处。由于发送器的输出是电流源,当没有负载的时候,有电流输出的端子就总是会处于高压状态,而当负载接入的时候,其电压马上就降低了,这是非常方便检测电路的设计的。
要进行通讯,收发两端的同步是非常重要的。同步分为两种,一种是数据位的同步,一种是数据包的同步。
位同步要求收发两侧要有同步运作的时钟,这个时钟的信息是包含在NRZI编码之中的。在数据与NRZI编码的转换过程中,一个为0的数据位将造成NRZI编码的状态发生变化,为1的数据位则不会。编码发生变化的信息是很重要的,它正好对应着信号发生变化的地方,接收端的数据时钟恢复电路利用此信息将与发端同步的时钟恢复出来,然后再延迟一点时间后读入状态信息,就可以得到与发端相同的J/K数据流,再经过反向的NRZI编码,原始数据就可以被恢复出来了。
由于NRZI编码仅在数据为0的时候发生变化,如果长时间出现连续的1就会造成NRZI编码持续处于一种状态,其中便没有了时钟信息,数据时钟恢复电路的时钟输出就可能失去与发端的同步。为了避免这个问题的发生,USB规范规定:如果数据串中连续出现了6个1,其后就要插入一个为0的数据位。这样就可使接收器在7个数据位的传输时间内至少会看到一次编码信号的状态转换,从而保证其时钟恢复电路不至于丢掉同步状态。当然了,这些插入的数据需要在接收端再把它们消除掉以恢复原始数据。
一个含有多个连续1的原始数据包被插入0后再进行编码的过程如下图所示,其中的Stuffed Bit箭头所指的地方就是新插入的为0的数据位。
上图中标识为Sync Pattern的信息被称为同步模板,它们的作用是告诉收方后面的信息就是我要发送的数据包了,所以它们所起的作用就是数据包的同步。如果没有包同步,收方就不会知道信息是从何时开始的,因而不能正确地理解收到的信息。
LS/FS通讯的数据包同步信号是由3个KJ序列紧接2个K状态构成的,如下图所示:
高速通讯的同步头要长许多,它包含了15个KJ序列和紧接着的2个K状态,总共有32个信号周期。考虑到高速通讯的速度提高了几十倍,32个信号周期其实并不算太长。
USB总线上需要传递的数据可以分为4种类型:用于控制的数据,设备和主机之间的连接过程就需要传输这种数据(地址、端口编号等);批量数据,主机与打印机、扫描仪之类的外设间的通讯以这类数据为主;中断信息,这种信息的出现时间是不确定的,但又需要系统做出及时的响应,这与MCU应用中的中断信号很类似;同步数据,它们在时序上有严格的要求,而且需要按照一定的节奏进行,一旦不同步,接收方的感觉就会很差,所以在传输时需要安排出足够的带宽与其配合,摄像头、话筒等外设所拾取的信息用这种方式进行传输就比较好。
USB属于轮询总线,所有的通讯都是在主机的控制下进行的,外设只有在收到主机的询问数据包时才可以进行响应,告诉主机自己没有数据或是把它要发送的数据打包发给主机,主机在收到以后要进行回应,至少它得说明收到的信息是否正确吧,所以一次正常的通讯至少会有三个数据包需要传输。
USB规范把一个主机应用和一个设备之间的传输通道称为管道,这种管道并不真实存在,属于一种逻辑实体。由于应用众多,外设也很多,所以可以有很多管道同时存在,这有点像现实中的物流系统的样子。当我向京东下了一个订单的时候,我和京东之间就建立起了一个管道,京东将通过此管道把货物送到我指定的地方,这个管道直到我收到货物、京东也收到确认信息以后才会消失。当我需要京东的后续服务如退货、返修之类的需求时,一条新的管道又会建立起来。而在我做这些事情的时候,也有其他人在和京东之间做着同样的事情。这个物流系统与USB不一样的地方是它不是轮询式的,因为京东不会主动来询问我要不要什么东西。但是,京东为了做成更多的业务,它会想办法吸引我多去它那里选择商品,这又属于广告性质了,这有点像USB主机在总线上发布广播信息:“我要关机了,你们大家配合一下。”至于外设会不会配合,那是另外一回事了。
-
驱动器
+关注
关注
52文章
8173浏览量
146067 -
数据传输
+关注
关注
9文章
1856浏览量
64499
发布评论请先 登录
相关推荐
评论