精华内容
下载资源
问答
  • usb协议详解

    2012-12-09 18:47:17
    usb协议详解
  • USB协议详解

    2020-11-21 16:21:35
    USB协议详解 浩克博士2019-03-13 14:58:114628已收藏37 文章标签:USB协议 版权 本博客整理自网络,仅供学习参考,如有侵权,联系删除。邮箱:rom100@163.com 一个transfer(传输)由一个或多个transaction...

    USB协议详解

    浩克博士 2019-03-13 14:58:11  4628  已收藏 37

    文章标签: USB协议

    版权

    本博客整理自网络,仅供学习参考,如有侵权,联系删除。邮箱:rom100@163.com

    一个transfer(传输)由一个或多个transaction(事务)构成,一个transaction(事务)由一个或多个packet(包)构成,一个packet(包)由一个或多个sync(域)构成。

    1.传输数据通信

    USB的数据通讯首先是基于传输(transfer)的,传输的类型有:中断传输、批量传输、同步传输、控制传输。

    2.事务数据通讯

    一次传输由一个或多个事务(transaction)构成,事务可以分为:in事务、out事务、setup事务。

    3.包数据通讯

    一个事务由一个或多个包(packet)构成,包可分为:令牌包(setup)、数据包(data)、握手包(ack)、特殊包。

    4.域数据通讯

    一个包由多个域构成,域可分为:同步域(sync)、标识域(pid)、地址域(addr)、端点域(endp)、帧号域(fram)、数据域(data)、校验域(crc)。

    USB传输

    传输分为四种类型:批量传输、等时(同步)传输、中断传输、控制传输。

    1、批量(大容量数据)传输(Bulk Transfers): 非周期性,突发 
    大容量数据的通信,数据可以占用任意带宽,并容忍延迟 。如USB打印机、扫描仪、大容量储存设备等。

    批量输出事务:
    (1)主机先发出一个OUT令牌包(包含设备地址,端点号)。
    (2)然后再发送一个DATA包,这时地址和端点匹配的设备就会收下这个数据包,主机切换到接收模式,等待设备返回握手包。
    (3)设备解码令牌包,数据包都准确无误,并且有足够的缓冲区来保存数据后就会使用ACK/NYET握手包来应答主机(只有高速模式才有NYET握手包,他表示本次数据成功接收,但是没有能力接收下一次传输),如果没有足够的缓冲区来保存数据,就返回NAC,告诉主机目前没有缓冲区可用,主机会在稍后时间重新该批量传输事务。如果设备检查到数据正确,但端点处于挂起状态,返回STALL。如果检测到有错误(如校验错误,位填充错误),则不做任何响应,让主机等待超时。
    批量输入事务:
    (1)主机首先发送一个IN令牌包(包含设备地址,端点号)。
    (2)主机切换到接收数据状态等待设备返回数据。如果设备检测到错误,不做任何响应,主机等待超时。如果此时有地址和端点匹配的设备,并且没有检测到错误,则该设备作出反应:设备有数据需要返回,就将一个数据包放在总线上;如果没有数据需要返回,设备返回NAK响应主机;如果该端点处于挂起状态,设备返回STALL。如果主机收到设备发送的数据包并解码正确后,使用ACK握手包应答设备。如果主机检测到错误,则不做任何响应,设备会检测到超时。注意:USB协议规定,不允许主机使用NAK来拒绝接收数据包。主机收到NAK,知道设备暂时没有数据返回,主机会在稍后时间重新该批量输入事务。

    2、中断传输(Interrupt Transfers): 周期性,低频率。
    允许有限延迟的通信 如人机接口设备(HID)中的鼠标、键盘、轨迹球等。
    中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。

    3、等时(同步)传输(Isochronous Transfers): 周期性 。
    持续性的传输,用于传输与时效相关的信息,并且在数据中保存时间戳的信息 ,如音频视频设备。


    等时(同步)传输用在数据量大、对实时性要求高的场合,如音频设备,视频设备等,这些设备对数据的延迟很敏感。对于音频或视频设备数据的100%正确性要求不高,少量的数据错误是可以容忍的,主要是保证数据不能停顿,所以等时传输是不保证数据100%正确的。当数据错误时,不再重传操作。因此等时传输没有应答包,数据是否正确,由数据的CRC校验来确认。
     

    4、控制传输(Control Transfers): 非周期性,突发。
    用于命令和状态的传输

    控制传输可分为三个过程:(1)建立过程 (2)数据过程(可选) (3)状态过程
    特性:  
    每个USB设备都必须有控制端点,支持控制传输来进行命令和状态的传输。USB主机驱动将通过控制传输与USB设备的控制端点通信,完成USB设备的枚举和配置 。
    方向:  
    控制传输是双向的传输,必须有IN和OUT两个方向上的特定端点号的控制端点来完成两个方向上的控制传输 。

    USB事物


     

    USB包

    包的组成:

    包的内容:

    1、PID:

    这里只用(PID0~4),PID4~7是PID0~4的取反,用来校验PID
    PID1~0:01 令牌包、11 数据包、10 握手包、00 特殊包

    2、地址:

    3、帧号:

    4、数据:

    5、CRC:

    Packet分四大类: 命令 (Token) 、Packet 帧首 (Start of Frame) 、Packet 数据 (Data) 、Packet 握手 (Handshake) Packet

    不同类型包,以上的组成部件有所不同

    1、四种Packet类型之令牌包(Token Packet):
    令牌包用来启动一次USB传输。
    输出(OUT)令牌包:用来通知设备将要输出一个数据包
    输入(IN)令牌包:用来通知设备返回一个数据包
    建立(SETUP)令牌包:只用在控制传输中,和输出令牌包作用一样,也是通知设备将要输出一个数据包,两者区别在于:
    SETUP令牌包后只使用DATA0数据包,且只能发送到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制

    例子:

    2、四种Packet类型之SOF Packet
    帧起始包:在每帧(或微帧)开始时发送,以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。

     

    例子:

    0xA5:1010 0101:对应上面PID表可知是帧起始包
    3、四种Packet类型之Data Packet

    例子:

    4、四种Packet类型之Handshake Packet 

    例子:

    USB 设备枚举及描述符介绍 
    当一个USB设备插入主机后,会有以下活动: 

     在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点。  

     

     

    例程分析

    我们插上鼠标后后出现如下的信息,我们先来分析第一个传输:

    我们看到第一个是控制传输,它包含了4个事物,分别是:1个setup事务,3个in事务,1个out事务,我们先打开setup事务:

     

    我们看到这个事务里包含了3个包

    第一个包是令牌包,它由主控制器发送给目标设备的0号端口,用于设置目标设备的地址和端口号,我们看到后面两个包都缺省了地址与端口号。在usb系统中,所有的通信都是由主机发出相应的令牌所引起的。

    第二个是数据包,由主控器发送给目标设备,其中数据的内容表示:

    80:表示要求设备向主机发送信息

    06:表示GET_DESCRIPTOR,即设备向主机发送设备描述符

    00与01:Word-sized field that varies according to request

    00与40:Word-sized field that varies according to request; typically used to pass an index or offset

    00:Number of bytes to transfer if there is a:Data stage

    总结一下第二个包就是向默认地址0 发送GET_DESCRIPTOR 指令包,请求设备发送设备描述符

    第三个是应答包:设备接收到主机发送的数据后会给出应答

    接着我们看第一个in事务

     

    我们看到这个事务里也有三个包

    第一个是in包:由主机发送给设备,表示要设备向主机发送上面请求的设备描述符

    第二个是数据包:由设备发送给主机,当然是发送设备描述符,我们来分析一下:

    12:表示接下来要求主机向设备发送信息

    01:CLEAR_FEATURE、

    第三个是应答包,由主机发送给设备

    接着我们来看第二个in事务

     

    这个事务里依旧是3个包

    第一个是in包:由主机发送给设备,表示需要输入

    第二个是数据包:由设备发送给主机,我们来解析一下:

    6D:表示要求主机发给设备数据

    04:Reserved for future use

    第三个是主机给设备的应答包

    最后来看out事务

    第一个是out包:由主机发给设备

    第二个是数据包:由主机发给设备,无数据

    第三个包是设备给主机的应答包

    展开全文
  • USB协议详解第0讲(系列博文介绍)

    千次阅读 2021-01-02 22:22:08
    USB协议详解旨在为大家通俗理解USB通讯协议,我会带着大家一步一步理解USB通讯中的各种概念及通讯方式,并且会借助于LeCroy USB Advisor Bus And Protocol Analysis软件一步一步对USB的协议进行分析。软件界面如下,...

    目录

    1.课程目标

    2.简单介绍

    3.课程大纲


    1.课程目标

    USB协议详解旨在为大家通俗理解USB通讯协议,我会带着大家一步一步理解USB通讯中的各种概念及通讯方式,并且会借助于USB Protocol Analysis软件一步一步对USB的协议进行抓包分析。软件界面如下,后期会带着大家分析每一个传输事务位及波形。

    2.简单介绍

    USB作为通用串行总线,可以看到这种总线具备通用性。它是以主机为主,设备为从的主从通讯模式,就像1个领导带着127个小弟一样,其实USB系统架构中就是一个USB主机控制127的从设备(设备一般小于127)。后期我会以领导和小弟的交流方式通俗详解USB的通讯架构、USB各种概念、详细的通讯协议(详细到每一个字节的每一个bit),让大家在学习USB协议中不那么枯燥。

    课程主要包括核心概念及核心学习要点USB系列描述符USB四种传输USB事务USB包USB枚举6个大部分,大纲如下。

    3.课程大纲

    USB协议详解第1 讲(核心概念通俗理解)
    USB协议详解第2 讲(协议核心学习要点)
    USB协议详解第3 讲(USB描述符-设备描述符)
    USB协议详解第4 讲(USB描述符-标准配置描述符)
    USB协议详解第5 讲(USB描述符-接口描述符)
    USB协议详解第6 讲(USB描述符-端点描述符)
    USB协议详解第7 讲(USB帧和微帧剖析)
    USB协议详解第8 讲(USB描述符-字符串和语言ID描述符)
    USB协议详解第9 讲(USB描述符-HID描述符)
    USB协议详解第10讲(USB描述符-报告描述符)
    USB协议详解第11讲(USB描述符-总结)
    USB协议详解第12讲(USB传输-初探)
    USB协议详解第13讲(USB传输-控制传输及事务组成)
    USB协议详解第14讲(USB传输-同步传输及事务组成)
    USB协议详解第15讲(USB传输-批量传输及事务组成)
    USB协议详解第16讲(USB传输-中断传输及事务组成)
    USB协议详解第17讲(USB事务-总结)
    USB协议详解第18讲(USB包-初探)
    USB协议详解第19讲(USB包-包的组成及分类)
    USB协议详解第20讲(USB包-帧首类包SOF)
    USB协议详解第21讲(USB包-命令类包Token)
    USB协议详解第22讲(USB包-数据类包DATA)
    USB协议详解第23讲(USB包-握手类包Handshake)
    USB协议详解第24讲(USB包-控制传输包结构)
    USB协议详解第25讲(USB包-同步传输包结构)
    USB协议详解第26讲(USB包-批量传输包结构)
    USB协议详解第27讲(USB包-中断传输包结构)
    USB协议详解第28讲(USB硬件原理图)
    USB协议详解第29讲(USB设备状态)
    USB协议详解第30讲(USB枚举)


    1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除;

    2.未经原作者允许不得转载本文内容,否则将视为侵权;

    3.转载或者引用本文内容请注明来源及原作者;

    4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

    下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

    展开全文
  • 通俗易懂的USB协议详解(转…

    万次阅读 多人点赞 2017-05-22 19:03:09
    原文地址:通俗易懂的USB协议详解(转载)作者: Branchesss 转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086253155137/ USB作为一种串行接口,应用日益广泛。如同每个工程设计人员...

    转自东海的博客http://6xudonghai.blog.163.com/blog/static/3364062920086253155137/

    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的数据是如何传送的,如图一:

    USB详解(转) - 东海 - 东海的博客

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

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

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

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

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

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

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

    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详解(转) - 东海 - 东海的博客

    这个对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将声

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

     

    控制传输(Control Transfers)

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

    USB详解(转) - 东海 - 东海的博客

    通过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详解(转) - 东海 - 东海的博客

    一个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)。 一个批量传输总是按照如图所示方式进行,

    USB详解(转) - 东海 - 东海的博客

    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 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备...

    目录

    1.设备上电

    2.Hub检测电压变化,报告主机

    3.主机了解连接设备

    4.主机检测所插入的设备是全速还是低速

    5.主机通过hub复位设备

    6. 主机进一步检测全速设备是否是支持高速模式

    7.通过Hub建立主机和设备之间的信息通道

    8.主机获取默认控制管道的最大数据包长度

    9.主机请求hub再次复位设备

    10.主机给设备分配一个新地址

    11.主机获取并解析设备描述符信息

    12.主机获取字符串描述符

    13.主机获取标准配置描述符

    14.主机获取配置描述符集合

    15.主机为设备挂载驱动并选择一个配置

    16.USB枚举抓包图


    当USB设备连接到或从USB中移除时,主机使用总线枚举过程来识别和管理接入的设备。当USB设备连接到一个已经被上电的端口,采取以下顺序行动:

    1.设备上电

    用户把USB设备插入USB端口(主机下的根hub或主机下行端口上的hub端口)或系统启动时设备上电。此时,USB设备处于加电状态,它所连接的端口是无效的。

    2.Hub检测电压变化,报告主机

    hub会实时监测端口的电平变化,一旦HUB检测到端口有电压变化,hub将利用自己的中断端点将信息反馈给主控制器,告诉主机有设备连接。

    3.主机了解连接设备

    如果有连接/断开事件发生,那么主机会发送一个 Get_Port_Status请求给hub以了解此次状态改变的确切含义。Get_Port_Status等请求属于所有hub都要求支持的hub类标准请求,hub相关的标准我们暂时不研究,大家知道这一点就好。

    4.主机检测所插入的设备是全速还是低速

     hub通过检测USB总线空闲时的差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

    根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。如下图。

    5.主机通过hub复位设备

    主机一旦得知新设备已连上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。然后主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位刚才设备插上的端口。hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不会受影响。hub集线器具体电路实现原理大家可以进行搜索查看。

    6. 主机进一步检测全速设备是否是支持高速模式

     因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。同样的,从设备的角度来看,如果是一个高速设备,在刚连接到hub时或上电只能用全速模式运行。随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。

    7.通过Hub建立主机和设备之间的信息通道

    主机不停地向hub发送Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。当hub撤销了复位信号,设备就处于默认/空闲状态(Default state),准备接收主机发来的请求。设备和主机之间的通信通过控制传输管道,默认管道为地址0、端点0。此时,设备能从总线上得到的最大电流是100mA。此后主机就可以通过默认控制管道和设备进行控制传输。


    8.主机获取默认控制管道的最大数据包长度

    默认管道其实连接到设备一端其实就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有未分配地址的设备都是通过地址0来获取主机发来的请求,但由于枚举过程不是多个设备并行处理,而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。

    主机会发送Get_Descriptor获取设备描述符,设备描述符的第8字节代表设备端点0的最大包大小,只有知道端点0 的最大包长度,才知道一次控制传输要从设备请求多少字节数据。

    9.主机请求hub再次复位设备

    Get_Descriptor获取设备描述符请求成功,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求),再次复位的目的是使设备进入一个确定的状态。

    10.主机给设备分配一个新地址

    主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态,之后就启用新地址与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

    11.主机获取并解析设备描述符信息

    主机发送Get_Descriptor请求读取设备描述符,这次主机发送Get_Descriptor请求使用新地址,它会解析设备描述符的每一项内容。设备描述符内信息包括端点0的最大包长度、设备所支持的配置个数、设备类型、VID、 PID、字符串索引等信息。如下图所示。

    12.主机获取字符串描述符

    根据如果有字符串描述符,主机会获取语言ID描述符和字符串描述符。

    13.主机获取标准配置描述符

    主机发送Get_Descriptor_Configuration请求并解析标准配置描述符,标准配置描述符内信息包括配置描述符集合长度、接口数、设备属性、设备所需电流。如下图所示。

    14.主机获取配置描述符集合

    配置描述符集合包括标准配置描述符、接口描述符、端点描述符,如果是HID设备还会包括HID描述符,主机会根据上面得到的标准配置描述符的wTotalLength,发送了一个Get_Descriptor_Configuration请求获取到配置描述集合并解析所有描述符,从而知道设备到底是什么样的设备。

    15.主机为设备挂载驱动并选择一个配置

    主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备,现在就将控制权交到设备驱动了。对于复合设备,通常应该是不同的接口配置给不同的驱动。

    主机发送Set_Configuration请求来正式确定选择设备的哪个配置作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured)。

    16.USB枚举抓包图


    1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除;

    2.未经原作者允许不得转载本文内容,否则将视为侵权;

    3.转载或者引用本文内容请注明来源及原作者;

    4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

    下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

    展开全文
  • 目录 1.HID设备概述 2.HID描述符组成 3.STM32配置描述符集合代码(必须按顺序) 4.HID描述符组成详解 1.HID设备概述 ...USB设备中有一大类就是...在USB协议中,HID设备的类型定义放置在接口描述符中,USB的设备描述符
  • 1.USB传输、事务、包的关系 2.USB传输类型 2.1控制传输 2.2同步传输 2.3批量传输 2.4中断传输 3.传输总结及后期内容 1.USB传输、事务、包的关系 USB传输、事务、包是从不同层次上去说明一次数据交互的三个...
  • 上一篇文章讲解了十大概念,如下: 1.USB传输(Transfer) 2.事务(Transaction) 3.包(Pack)的概念 4.USB 主机(Host) 5.设备(Device) ...”,这一篇我们将会讲解在学习USB协议中务必要掌握
  • 前面讲了四种传输的类型,包括控制传输,同步传输,批量传输,中断传输,我们在USB设备开发中,会实现所用到的每一个端点的端点描述符,每个端点描述符必须要指定传输类型,每个端点和USB主机进行数据交换只支持一种...
  • 2.设置阶段包详解 2.1 SETUP令牌包 2.2 DATA0 数据包 2.2.1bmRequestType(向谁请求) 2.2.2bmRequest(什么请求) 2.2.4wIndex 2.2.5wLength域 2.3ACK数据包 3.可选的数据阶段包详解 3.1 如果第一阶段指定数据...
  • 3.中断传输包详解 3.1中断读传输抓包 3.2中断写传输抓包 4.中断传输小知识 1.中断传输包结构 中断传输和批量传输类似,中断只由一个中断事务组成,中断事务包含令牌包、数据包、握手包,如图下所示。中断事务...
  • 3.同步传输包详解 3.1同步读包结构 3.1.1全速设备传输小于等于1023字节包结构 3.1.2全速设备传输大于1023字节包结构 3.1.3 IN令牌包波形 3.1.4 数据包波形 3.2同步写包结构 1.同步传输包结构 同步传输由一个...
  • 3.SOF包发送时间及USB总线包结构 1.SOF包的发送时间 2.USB总线包组成 4.SOF包其它核心概念 5.STM32 SOF包处理机制 1.包的四种类型 根据包的组成把包分为四种类型,分别是、帧首包SOF(Start of Frame)、命令...
  • ... USB作为一种串行接口,应用日益广泛。如同每个工程设计人员必须掌握I2C,RS232这些接口一样,我们也必须掌握usb. ...但是usb的接口协议实在有点费解,linux uhci驱动作者之一Alan Stern曾经就说过“The USB doc
  • 批量传输包详解 3.1批量读 3.1.1批量读抓包图 3.1.2批量读包结构实例 3.1批量写 3.1.1批量写抓包图 3.1.2批量写包结构实例 1.批量传输包结构 批量传输由一个或多个批量事务组成,每一个批量事务具有令牌包、数据包、...
  • 2.全速USB传输(帧) 3.高速USB传输(微帧) 上一篇讲解端点描述符的时候提到了帧和微帧的概念,可能很多人会晕,这节课先做下补充,避免大家放弃学习。 1.概念 (1)USB2.0帧和微帧属于物理层时间基准的概念,...
  • 本节我们开始对USB包进行深入讲解,USB所有的传输都会被分成包进行传输,不同的包里面包含不同的多个数据域(后面一一学习),框图如下。 包的种类及说明 由域构成的包有四种类型,分别是令牌包、数据包、握...
  • 8.USB设备状态详解及数据交互条件 1.连接状态(Attached) USB设备可以从USB总线上连接或断开。当USB设备与USB总线断开时,它的状态USB规范没有定义,我们可以这么想,设备都拔了就断电了,也就不存在什么样的状态了...
  • 目录 0.概括 1.USB传输(Transfer) 2.事务(Transaction) ...USB协议学习中最重要几个概念如下,没有提及的就是对USB协议学习中不重要的或者编程不需要用到的。大家也不用着急,概念必须要学会,否则都不知道下
  • 3.接口描述符组成详解 1.USB描述符 USB描述符有设备描述符、标准配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。今天主要是学习USB接口描述符的组成。 2.接口...
  • 1.其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备、设备需要的总线资源、和设备的通讯...
  • 4.接口描述符组成详解 1.USB描述符 USB描述符有设备描述符、标准配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。今天主要是学习USB端点描述符的组成。 2.端点...
  • 则会给主机发送ACK握手包,在高速USB设备传输事务中,如果设备没有准备好,则会给主机发送NYET握手包,如果设备出错,则会给主机发送ERR握手包。 3.PING事务(只在高速传输中有) (1)主机发送PING令牌包给设备功能...
  • 3.标准配置描述符组成详解 1.USB描述符 USB描述符有设备描述符、标准配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。今天主要是学习USB标准配置描述符的组成。 ...
  • 我们第一个学习要点就是USB描述符,所谓描述符其实就是C语言里面的结构体或者数组,数组包含的信息说明当前的设备具有哪些特征。USB描述符有设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,HID设备...
  • 我们今天看令牌类包的详细结构,令牌包的内容由PID域+地址域+5bit CRC域,下图为令牌类包包各个域和抓包协议的对应图。 2.SETUP令牌包 只用在控制传输中,通知设备将要输出一个数据包(只是一个通知作用),也...
  • 2.语言ID描述符组成、详解、代码 (1)语言ID描述符组成 (2)语言ID描述符详解 (3)语言ID描述符STM32代码 3.字符串描述符索引 4.字符串描述符组成、详解、代码 (1)字符串描述符组成 (2)字符串描述符...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 284
精华内容 113
关键字:

usb协议详解