USB总线协议基础知识

发布者:innovator7最新更新时间:2015-08-21 来源: eefocus关键字:USB  总线协议  基础知识 手机看文章 扫描二维码
随时随地手机看文章

USB作为一种串行接口,应用日益广泛。如同每个工程设计人员必须掌握I2C,RS232这些接口一样,我们也必须掌握usb.

但是usb的接口协议实在有点费解,linux uhci驱动作者之一Alan Stern曾经就说过“The USB documentation 

is downright evil. Most    of it is just crap, written by a committee. You're better off ignoring

 most of it ”。

本文将从整体上介绍usb协议,包括usb host ,usb hub,usb function。希望能给读者一个总体上的了解。也

因此,文章将分成相应的三部分讲解。

一。usb function

1。初识usb.usb是一种串行接口协议,它靠d+,d-两条数据线构成的差分线来进行数据传输,这让我们非常感兴

趣它到底和我们通常熟悉两线rs232/485有何区别。了解这种区别有助于我们对usb作一个深入的了解。那么让

我们回想一下到底一个两线rs232的数据是如何传送的,如图一:

在这里我们的重点在于,我们发现要在串行口传送数据一个最体码的要求恐怕就是:要知道数据传输何时开始,

何时结束。即如何delimit.那么rs232怎么做的。显然,在idle(空闲)时,即无数据传送时,数据线处于高电

平,等到有数据开始传送,发送方首先拉低数据线(start),表示数据传输开始,接受端也因为这个“start”信号

开始准备接受即将到来的数据,类似一次握手,随后,在两者之间的数据传送开始,结束后主方再次拉高数据

线,表示结束传输,自此两者重新进入Idle状态。等待下一轮传送开始。

了解了rs232,那么我们自然想到usb如何做到这个呢,既然是串行位流传输,也理所当然的解决这个问题。没错,

Usb协议必然要解决这个问题,让我们作一个类似rs232的比较吧!类似于rs232,usb的传输桢如图二:

(这里我们暂时忽略这个传输所代表的意义)为了说明问题,我们对一些问题简化,我们定义这样几个状态:
假设D+,D-分别表示usb信号线的电平信号。那么对于usb full speed function(high speed ,low speed是不

同的),我们定义差分数据线上可能出现的四个状态:

Data J state:D+=1,D-=0;
Data K state:D+=0,D-=1;
SE0:D+=D-=0;
SE1:D+=D-=1;

那么上面的图中,相应的也可表示为图三:

这个对usb full speed function来说,idle状态将处于Data J state,se0表示一桢结束。看这个图是不是很像

我们熟悉的rs232。没错!!!他们确实很相似。在无数据传输时,它们都处于Idle状态,当要开始传输数据时,

先发一个sync(同步信号,rs232为start,usb为一sync字节,见协议说明)信号进行“握手”,而后开始传输,

当传输要结束时,发一stop信号(usb为一个se0状态表示要结束传输),最后又进入idle态等待新的传输。不过,

你可能更加注意到,他们还是不同的。不同在于usb是按packet进行传输的,就是说它传输的最小单位是packet,

而rs232是按字节传送的,也即它的最小传送单位是字节。既然是按pakcet传送,想想我们相较于rs232的按字节

单位传输,我们可以得到哪些“好处”。想想看,pakcet的好处不就在于我们可以灵活的定义数据的传送格式,

传送方式,从而可以适应各种各样的串行设备,这不就是所谓的“通用串行总线”吗?

简介:从本节开始,我们将介绍usb的传输机制。这节先介绍usb现有传输方式的背景知识,做为对下节将要展开

的四种传输类型,描述符,等相关知识的一个导引。

2。usb传输。
我们在上一节中了解到了usb的“packet”的感念,了解到了usb传送一个packet总是以sync开始,以eop结束,

这个称为delimiter,即标记packet的始末。有了packet,我们就可以在usb总线上传输数据了。但是这还不够,

比如数据传送方向,即传回usb主机还是传下usb从机,数据传送的地址,数据传送的类型(这些后面我们将会知

道)这些信息在传输之前是必须搞清楚的,那么这个信息如何得知呢,看来这就需要我们定一套基于packet的

“协议”了。主机与从机在传输中均遵循这套“协议”,那么这些问题就可以迎刃而解。事实上,usb的一次数

据传输总是遵循这样的“协议”的:

首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。

其次,主机发第2个至第n个packet载有实际数据
最后,从机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样主机

就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

这里我们考虑的是主机发数据给从机的情况,那么从机发数据给主机时,是不是也可以这样呢?当然可以,比如

从机要发数据给主机时,也可以采取同主机类似的方式:

首先,从机发第1个packet给主机,声明数据传送方向,数据传输地址,数据传输类型。
其次,从机发第2个至第n个packet载有实际数据
最后,主机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样从机就可以

借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

基本上可以归结为一个“三段式”传输

这里有人可能注意到了,对这样一个传输机制,从机和主机的功能将是一样的,因为这样的实现机制,从机

可能在某一时刻是主机,某一时刻又可能是从机,因为他们要实现同样的功能。这样实现起来的复杂性也将是

一样的。

注:这里概念或许容易混淆,其实,我们这里的主机(master)和从机(slaver)是一个transceiver,即可收可发。

相应的,在某一时刻,master在发数据,我们称其为transmitter,在接受时我们称为receiver.对slaver同样。

我们可能还注意到了,usb这种按pakcet传输的方式在实现时已经很复杂了(至少比rs232要复杂多吧),至少我

们目前看来主从机功能一样这样的实现方式似乎还是可行,但是后面我们谈到usb host时将会了解到host的功

能是如何的复杂,以至于让一个usb function 也带上如此的功能成本和实现复杂性将陡然上升。作为面向广范

应用的usb,这是我们不允许的。我们期望的是一个使用usb 的udisk,使用usb的光驱,使用usb的耳麦等等这些

东西不要因为usb而变得昂贵,复杂。

正是因为这个原因,usb从机的传输发式便由上面的方式改成了下面的方式进行:

首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。
其次,从机收到主机送来的第一个packet后,再发第2个至第n个packet载有实际数据
最后,主机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样从机

就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

而对于usb 主机传输方式保持不变。


对于这样的改变,我们马上就有疑问了:这个改变的传输方式是和未改变之前的等价吗。当然,不全等价。问题

在哪里?仔细观察一下便知,两者区别在于第一个packet是由谁发起的。未改变之前,第一个packet总是由要传

送数据的一方发起,而改变之后的第一个Packet总是由主机发起。这样,就变成如果从机要发送数据给主机时,

总是由主机发起(第一个packet),然后从机开始传送。
可能初次接触我们会感觉怪怪的,怎么从机要给主机发送数据前反而要主机先发packet给从机。  这样行吗?

我们要说这样是可以的,因为通常一次传输交互的产生,并非无来由的产生,这些都是由程序员控制的,控制usb

何时收,何时发,及发给谁!!!

这里我们就注意到了,usb function(总是作为从机)的功能一下从原来与主机具有相同功能的tranceiver变成

了现在仅具发送(或接收)功能的transmitter(或Receiver)实现的复杂性及成本可想而知也就相应得减小了。

简介:本节介绍usb full speed function的四种传输类型。

上节中我们了解到了usb host 与usb function 之间采用的是一种“非对称”的传输,也就是说,无论usb接受

数据还是发送数据,都是由usb host首先发起。即传输的第一个packet总是由usb host发出的。这个packet将声

明本次即将进行的数据传输方向,数据传输地址和数据传输类型。

 [page]

控制传输(Control Transfers)

: 或许你已经注意到了,一个usb host端口并不是仅仅支持一个Usb function.如图1,

通过usb hub,一个usb host端口可以连接usb鼠标,usb键盘,Usb写字板......。要连接这么多东西在同一个

usb host上,我们通常会有一个基本问题,即usb host如何识别这些被连接在它的端口上的设备呢。正如通常的

主从式通讯系统一样,如rs485多机通讯,我们通常是用一个特定的地址标志每一个从设备。对这里的usb,我们

采用同样的方法,将为每个挂接在该usb host上的usb function指定一个特定地址,通过这个特定地址来识别

每个usb function.看来这将是一个usb function在数据传输之前必须解决的问题--得到它的地址分配。

这个“地址指定”的过程需要usb host通知usb function才能完成,这个交互过程就是一个控制式传输。通过

这个“控制式传输”,usb host将指定地址给usb function ,以为即将进行的正式通讯做好准备工作。这里细心

的读者可能已经注意到了,既然usb host总要分配地址给usb function才能进行正式的数据传输工作,那么

usb host将如何与一个初始时未分配地址的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结束一次交互。


    4. 如果数据未传完,继续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。这个SOF由USB HOST 

相当精确的以每1.00 ms ±0.0005 ms的时间周期发送给usb device,来在二者之间定时。从而usb function能

够“及时”的了解到“现在时刻”。 现在我们在usb host和usb function之间建立起了“对时”机制。那么接下

来看看刚才设想的“自动”传输如何实现。事实上,一旦usb host及usb function双方建立了一种时间机制,那

么这种“自动”传输是很容易实现的。usb 实现同步式传输或中断式传输总是以一种类似于批量数据传输的方式

进行的,唯一不同的是传输的触发不再是“被动”的,而是由SOF所建立的tick触发。

  1. 首先,时间到达,usb host发起第一个Packet--in(或out),表示要开始数据传输了。

  2. 其次,usb function(或usb host)发起以data1(或data0)为起头的payload data,开始一次交互。

  3. 再其次,如果是中断式传输,usb host(或Usb function)发起ack回应这次交互,如果是同步式传输,

  4. 该步跳过。

如此重复上述步骤,即usb host等待下一个tick到达,并开始新一轮的交互。

这里我们注意到了,同步式传输和中断式传输二者虽然都是时间触发,但是中断式传输需要ack应答,而相反,

同步式传输不需要。这个最大的区别决定了同步式传输是一种非可靠传输,但是因此换来了更多的usb传输时间。

也因此,同步式传输的 payload data(对应wMaxPacketSize )通常相较于其他传输方式比较大,因为它消掉了

ack所占有数据传输时间。这里还有一个地方值得注意的是tick的设定,这个tick也是需要事先usb host 和

usb function达成共识的参数之一。


关键字:USB  总线协议  基础知识 引用地址:USB总线协议基础知识

上一篇:PCI、AGP、PCI-E 总线带宽的计算方法
下一篇:USB协议架构及驱动架构

推荐阅读最新更新时间:2024-05-02 23:54

利用简单电路解决带电插拔过程的USB电流过冲问题
    将一个简单的录音笔或其它外设插入USB端口时,可能导致不希望发生的系统复位。此时需要在端口前端提供一个限流器,在插拔端口时提供短路和过载保护。这种接口的一个特征是需要给各种需要连接的外设供电,例如:录音笔、小型硬盘、调制解调器、MP3、存储器卡等。服务器板提供12V主电源供电,有些应用中包含一个降压转换器,将该电压降至3.3V,用于逻辑电路供电。此外还需要一个升压电路,把3.3V电压提升到标准的USB端口电压(5V,可提供500mA电流)。     带电插入外设时可能引发一些问题:瞬间在端口的5V引脚插入一个不是纯电阻的负载,由于存在容性元件,会产生快速、大幅升高的电流,使得USB端口的电流远远超出500mA。当然,把一个大
[嵌入式]
USB2.0接口和DSP构成的高速数据采集系统
随着USB2.0/DSP数字信号处理理论和计算机的不断发展,现代工业生产和科学技术研究都需要借助于数字处理方法。进行数字处理的先决条件是将所研究的对象进行数字化,因此数据采集与处理技术日益得到USB2.0/DSP重视。 在图像USB2.0/DSP处理、瞬态信号检测、软件无线电等一些领域,更是要求高速度、高精度、高实时性的数据采集与处理技术。现在的高速数据采集处理卡一般采用高性能数字信号处理器(DSP)和高速总线技术的框架结构。DSP用于完成计算量巨大的实时处理算法,高速总线技术则完成处理结果或者采样数据的快速传输。DSP主要采用TI或者ADI公司的产品,高速总线可以采用ISA、PCI、USB等总线技术。 目前,使用USB2.
[嵌入式]
AT89S52单片机并行端口模拟I2C总线协议读写AT24C04的设计
I2C总线是2条线总线。数据线SDA,时钟线SCL.结构简单。 AT24C04是具有I2C总线接口的EEPROM.大小为512*8bit.单片机AT89S52本身不具有I2C总线结口,所以可编写程序用并行端口模拟I2C总线协议读写AT24C04. 多个设备通信的重点(1.电平的区别,如串口通信中PC与单片机通信,PC机串口电平值为+12V~-12V,单片机为TTL电平0V~+5V.,所以要用电平转换芯片转电平.2,通信协议。(串口通信协议))具体的协议内容与数据格式可查资料。 代码如下: #include #define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0
[单片机]
Silicon Labs推出USB转SPI桥接芯片
进一步丰富智能接口产品组合-单芯片CP2130桥接控制器为USB连接应用减少成本、复杂度和开发时间- 中国,北京 - 2013年12月11日 - 高性能模拟与混合信号IC领导厂商Silicon Labs(芯科实验室有限公司, NASDAQ: SLAB)今日宣布推出高性能USB转SPI桥接控制器产品,它为桥接通用串行总线(USB)主机和串行外设接口(SPI)总线提供了完整的交钥匙解决方案,并且驱动程序支持Windows®、Mac OS X和Linux操作系统。Silicon Labs的新型CP2130 USB转SPI桥接控制器在紧凑的4mm x 4mm封装中提供业界领先的数据吞吐量、灵活的配置和高级混合信号集成。CP2130桥接控
[嵌入式]
沁恒股份8位USB设备单片机: CH552概述
概 述 CH552芯片是一款兼容MCS51 指令集的增强型E8051内核单片机,其79%的指令是单字节单周期指令,平均指令速度比标准MCS51快8~15 倍。 CH552 支持最高24MHz 系统主频,内置16K 程序存储器ROM 和256 字节内部iRAM 以及1K 字节片内xRAM,xRAM 支持DMA直接内存存取。 CH552内置了ADC 模数转换、触摸按键电容检测、3 组定时器和信号捕捉及PWM、双异步串口、SPI、USB设备控制器和全速收发器、USB type-C等功能模块。 系统框图 特 点 》 增强型E8051内核CPU,速度比标准MCS51快8-15倍,特有XRAM数据快速复制指令; 》 内置16KB
[单片机]
沁恒股份8位<font color='red'>USB</font>设备单片机: CH552概述
最便宜USB延长线自己制作的做法(图解)
IY乐趣多多,所以我一直很喜欢自己制作一些电脑玩意,现在计算机外部设备也是日益增多,键盘、鼠标、调制解调器、打印机、扫描仪,到现在的数码相机、MP3随身听,如果只使用原来的串口或是并口的话,是远不能满足需要的,因此在一些较先进的主板上都提供了USB接口。很多设备都用到USB 了,我的USB设备也是一大堆,但一些主板上集成的USB接口却只有两个,如果采用USB接口的外部设备过多的话,这些设备肯定是无法同时工作的,只好轮流%26ldquo;上岗%26rdquo;了,因此在使用过程中需要经常热插拔这些设备。而且主板上集成的USB接口都在机箱的后部,一些老式机箱又不具有前置的USB接口,况且即使有,机箱也放在桌子底下,在使用中只好经常低头弯
[嵌入式]
聊聊 Intel USB 3.1接口
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。自1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出以来,到如今已有21年的历史。在PC接口技术发展的长河中,USB无疑是最经久不衰的接口之一!   与USB 2.0的不解之缘   说到USB接口,笔者印象最深应当是USB 2.0,彼时是2005年,笔者还在上初二,好死赖活把平日里为数不多的生活费攒下来,买了人生中第一个MP4,没错儿!就是还要对视频进行转码才能播放的那种。 各式各样
[嵌入式]
USB Type-C PD CC逻辑芯片中的角色定义
USB Type-C凭借其自身强大的功能,在Apple, Intel, Google等厂商的强势推动下,必将迅速引发一场USB接口的革命,并将积极影响我们日常生活的方方面面。本文讨论一个重要的专业问题:USB Type-C设备到底是否需要CC逻辑检测与控制芯片? 要回答这个问题,我们得先从基本概念谈起。 DFP(Downstream Facing Port): 下行端口,可以理解为Host,DFP提供VBUS,也可以提供数据。典型的DFP设备是电源适配器,因为它永远都只是提供电源。 UFP(Upstream Facing Port): 上行端口,可以理解为Device,UFP从VBUS中取电,并可提供数据。典型设备是U盘,
[嵌入式]
<font color='red'>USB</font> Type-C PD CC逻辑芯片中的角色定义
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved