精华内容
下载资源
问答
  • 一个基于ucosiii的usb协议栈例程,可以在ucos操作系统上移植usb协议栈进行测试,usb协议栈源码在Micrium官方下载的,例程也是找的网上的,是STM32F4x的,希望给各位做个参考
  • USB协议官方文档

    2017-11-01 23:26:05
    主要配合小编关于USB协议方面博文的一些官方资料,包含usb2.0,3.0的协议,usb存储介质方面用到的scsi,spc4协议,以及uvc协议文档等
  • 该文章主要是讲解了USB协议的基础知识,包括域、包、事务、传输。USB HOST MSC类的通信过程,以及FAT32的基本知识。
  • vc++平台的usb数据的读取和打印,本人测试已经过,可以使用。用的vc6.0编译,使用语言是C ++,库文件都在里面,代码用vc6.0可以打开,也可以打开debug下的exe文件。希望下载的人给个好评,写个代码不容易
  • USB协议规范1.1/2.0/3.0 英文高清完整PDF版

    千次下载 热门讨论 2014-10-04 19:12:53
    USB协议规范1.1--支持USB低速和全速规范(12Mbps) USB协议规范2.0--支持USB高速协议规范(480Mbps) USB协议规范3.0--支持USB超高速协议规范(5Gbps) 本资源包括USB 1.1、2.0以及3.0的协议规范文档。随着USB设备的...
  • 第一章至第四章为读者提供了一个纲要,第五章至第十章则提供了USB的所有的具体技术细节。外设厂家应着眼于第四章至第十章。USB的主机控制器应用主要参考第四章至第七章和第九、十章。USB设备驱动厂家主要参考第四、...
  • USB协议规范中文

    2018-04-11 19:06:14
    USB2.0协议规范,中文文档,解压后DOC格式,适合驱动工程师
  • 深度剖析USB协议

    2018-10-30 21:39:42
    深度剖析USB协议层,需要的可以下载看看,希望对大家有用
  • USB使用讲解培训文档协议,第一部分篇,USB功能的详细讲解
  • 用于Windows触摸和基于笔的计算机的数字转换器驱动说明,触摸屏、多点触摸的USB协议,设备描述符,HID报文说明
  • USB协议简介

    万次阅读 多人点赞 2019-03-04 21:41:19
    1.USB协议简介 https://blog.csdn.net/songze_lee/article/details/77658094 2017年08月28日 23:20:16songze_lee阅读数:22978 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

    1.USB协议简介

    https://blog.csdn.net/songze_lee/article/details/77658094

    2017年08月28日 23:20:16 songze_lee 阅读数:22978

     版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/songze_lee/article/details/77658094

             最近学习usb相关的知识,一直感觉入不了门,看《linux那些事儿之我是usb》,对usb协议也不是很熟悉,没能坚持看下去,直到看了《圈圈教你玩usb》一书,把自己的兴趣立马提了起来,大牛圈圈用51单片机实现了usb鼠标键盘等设备,让人非常佩服,51单片机自己还是很熟悉,大学玩了四年单片机,单片机来实现立马感觉亲切了许多,决定先从单片机入手学,后面再看linux那些事儿之我是usb,深入学习linux内核下usb,以下先介绍usb协议,内容整理来自usb spec、网络和圈圈书中,文中也大量引用STM32官方的USB2.0协议文档,欢迎批评指正。另外学习《圈圈教你玩usb》动手调试实现了单片机usb鼠标功能,源码在https://github.com/lisongze2016/mcu_project/tree/master/USB,源码中结合使用了linux kernel ch9.h中对描述符的结构体定义,对usb协议有了深入的理解。
            USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔。USB协议版本有USB1.0、USB1.1、USB2.0、USB3.1等,USB2.0目前比较常用,以下以2.0为主介绍。由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB OTG,全拼 ON The Go。USB OTG 同一个设备,在不同的场合下可行在主机和从机之间切换。

    1.1 USB特点:

    USB1.0和USB1.1支持1.5Mb/s的低速模式和12Mb/bs的全速模式。在USB2.0以上支持480Mb/s的高速模式。应用如下:

    1.2 USB设备供电方式:
    USB设备有两种供电方式 
    自供电设备:设备从外部电源获取工作电压 
    总线供电设备:设备从VBUS(5v) 取电 
      对总线供电设备,区分低功耗和高功耗USB设备 
    低功耗总线供电设备:最大功耗不超过100mA 
    高功耗总线供电设备: 枚举时最大功耗不超过100mA,枚举完成配置结束后功耗不超过500mA 
    设备在枚举过程中,通过设备的配置描述符向主机报告它的供电配置(自供电/总线供电)以及它的功耗要求
    如下 USB 配置描述符(以Joystick为例),后面具体介绍:

    1.3 USB总线信号:
    USB使用的是差分传输模式,两个数据线D+和D- 
            差分信号1:D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V) 
            差分信号0:D- > VOH and D+ < VOL

    J状态(高电平):D+ 高,D- 低
    K状态(低电平):D+低,D- 高
    SEO状态:D+ 低,D- 高
    Reset信号:D+ and D- < VOL for >= 10ms 
    主机在要和设备通信之前会发送Reset信号来把设备设置到默认的未配置状态。即主机拉低两根信号线(SE0状态)
    并保持10ms 
    Idle状态:J状态数据发、送前后总线的状态 
    Suspend状态:3ms以上的J状态 
    SYNC: 3个KJ状态切换,后跟随2位时间的K状态(看到的波形变化是总线上发送0000 0001经过NRZI编码后的波形)

    Resume信号:20ms的K状态+低速EOP 
    主机在挂起设备后可通过翻转数据线上的极性并保持20ms来唤醒设备,并以低速EOP信号结尾 
    带远程唤醒功能的设备还可自己发起该唤醒信号;前提是设备已进入idle状态至少5ms,然后发出唤醒K信号,维持1ms到15ms并由主机在1ms内接管来继续驱动唤醒信号 
    SOP:从IDLE状态切换到K状态 
    EOP:持续2位时间的SE0信号,后跟随1位时间的J状态 
    Keep alive即低速EOP信号

    1.4 USB插入检测和速度检测:

    主机通过设备在D+或D-上的1.5K上拉来检测设备的连接和断开事件,并由此判别设备的速度 
    主机先把高速设备检测为全速设备,然后再通过“Chirp序列”的总线握手机制来识别高速和全速设备
    USB连接和断开连接:
    设备连上主机时(连接)
    当主机检测到某一个数据线电平拉高并保持了一段时间,就认为有设备连上来了
    主机必需在驱动SE0状态以复位设备之前,立刻采样总线状态来判断设备的速度 

    没有设备连上主机时(断开)
    D+和D-数据线上的下拉电阻起作用,使得二者都在低电平;主机端看来就是个SE0状态;同样地,当数据线上的SE0状态持续一段时间了,就被主机认为是断开状态

    1.5 数据编解码和位填充 
    USB采用NRZI(非归零编码)对发送的数据包进行编码 
    输入数据0, 编码成“电平翻转” 
    输入数据1, 编码成“电平不变” 
    编码出来的序列,高电平:J状态;低电平:K状态 

    位填充是为了保证发送的数据序列中有足够多的电平变化 
    填充的对象是(输入数据),即先填充再编码 
    数据流中每6个连续的“1”,就要插入1个“0”,从而保证编码
    数据出现电平变化 
    接收方赋值解码NRZI码流,然后识别出填充位,并丢弃它们

    2. USB传输
    一个传输有多个事务组成,一个事务由2/3个包组成。
    传输又分为四种类型:批量传输、等时(同步)传输、中断传输、控制传输。
    注意:USB传输数据先发数据低位再发高位数据

    2.1 包
    包的组成:

    包的内容:

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

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

    PID:

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

    地址:

    帧号:

    数据:

    CRC:

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

    例子:

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

    例子:

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

    例子:

    四种Packet类型之Handshake Packet 

    例子:

    2.2 事务
    Transaction可以分成三类 
    Setup transaction:主机用来向设备发送控制命令 
    Data IN transaction:主机用来从设备读取数据 
    Data OUT transaction:主机用来向设备发送数据 
    Transaction的packet组成 
    Token packet:总是由主机发出 
    Data packet:包含此次transaction的数据负载 
    可选的Handshake packet 
    例子:

    2.3 传输
    USB协议定义了四种传输类型: 
    批量(大容量数据)传输(Bulk Transfers): 非周期性,突发  
    大容量数据的通信,数据可以占用任意带宽,并容忍延迟 。如USB打印机、扫描仪、大容量储存设备等 
    中断传输(Interrupt Transfers): 周期性,低频率
    允许有限延迟的通信 如人机接口设备(HID)中的鼠标、键盘、轨迹球等
    等时(同步)传输(Isochronous Transfers): 周期性 
    持续性的传输,用于传输与时效相关的信息,并且在数据中保存时间戳的信息 ,如音频视频设备
    控制传输(Control Transfers): 非周期性,突发
    用于命令和状态的传输
    2.3.1 批量传输
    批量输出事务,(1)主机先发出一个OUT令牌包(包含设备地址,端点号),(2)然后再发送一个DATA包,这时地址和端点匹配的设备就会收下这个数据包,主机切换到接收模式,等待设备返回握手包,(3)设备解码令牌包,数据包都准确无误,并且有足够的缓冲区来保存数据后就会使用ACK/NYET握手包来应答主机(只有高速模式才有NYET握手包,他表示本次数据成功接收,但是没有能力接收下一次传输),如果没有足够的缓冲区来保存数据,就返回NAC,告诉主机目前没有缓冲区可用,主机会在稍后时间重新该批量传输事务。如果设备检查到数据正确,但端点处于挂起状态,返回STALL。如果检测到有错误(如校验错误,位填充错误),则不做任何响应,让主机等待超时。
    批量输入事务,(1)主机首先发送一个IN令牌包(包含设备地址,端点号),(2)主机切换到接收数据状态等待设备返回数据。如果设备检测到错误,不做任何响应,主机等待超时。如果此时有地址和端点匹配的设备,并且没有检测到错误,则该设备作出反应:设备有数据需要返回,就将一个数据包放在总线上;如果没有数据需要返回,设备返回NAK响应主机;如果该端点处于挂起状态,设备返回STALL。如果主机收到设备发送的数据包并解码正确后,使用ACK握手包应答设备。如果主机检测到错误,则不做任何响应,设备会检测到超时。注意:USB协议规定,不允许主机使用NAK来拒绝接收数据包。主机收到NAK,知道设备暂时没有数据返回,主机会在稍后时间重新该批量输入事务。

    PING令牌包,它不发送数据,直到等待设备的握手包。

    2.3.2 中断传输
    中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于
    这个时间间隔的范围内安排一次传输。

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

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

    数据的拆分和数据传输完毕的判定 
    以高速设备的最大数据包长度64字节为例 
    要传输250字节,拆分成4个packet 

    要传输正好256字节,通过最后一个0字节包告诉设备传输完成

    各种传输特性比较

    3. USB标准请求
    3.1 USB标准请求的数据结构

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

     

     
    1. include/uapi/linux/usb/ch9.h

    2. /* USB_DT_DEVICE: Device descriptor */

    3. struct usb_device_descriptor {

    4. __u8 bLength;

    5. __u8 bDescriptorType;

    6.  
    7. __le16 bcdUSB;

    8. __u8 bDeviceClass;

    9. __u8 bDeviceSubClass;

    10. __u8 bDeviceProtocol;

    11. __u8 bMaxPacketSize0;

    12. __le16 idVendor;

    13. __le16 idProduct;

    14. __le16 bcdDevice;

    15. __u8 iManufacturer;

    16. __u8 iProduct;

    17. __u8 iSerialNumber;

    18. __u8 bNumConfigurations;

    19. } __attribute__ ((packed));

    20.  
    21. #define USB_DT_DEVICE_SIZE 18

     

     

     

     

     
    1. struct usb_config_descriptor {

    2. __u8 bLength;

    3. __u8 bDescriptorType;

    4.  
    5. __le16 wTotalLength;

    6. __u8 bNumInterfaces;

    7. __u8 bConfigurationValue;

    8. __u8 iConfiguration;

    9. __u8 bmAttributes;

    10. __u8 bMaxPower;

    11. } __attribute__ ((packed));

    12.  
    13. #define USB_DT_CONFIG_SIZE 9

     

     

     

     

     
    1. /* USB_DT_INTERFACE: Interface descriptor */

    2. struct usb_interface_descriptor {

    3. __u8 bLength;

    4. __u8 bDescriptorType;

    5.  
    6. __u8 bInterfaceNumber;

    7. __u8 bAlternateSetting;

    8. __u8 bNumEndpoints;

    9. __u8 bInterfaceClass;

    10. __u8 bInterfaceSubClass;

    11. __u8 bInterfaceProtocol;

    12. __u8 iInterface;

    13. } __attribute__ ((packed));

    14.  
    15. #define USB_DT_INTERFACE_SIZE 9


     

     

     

     

     
    1. /* USB_DT_ENDPOINT: Endpoint descriptor */

    2. struct usb_endpoint_descriptor {

    3. __u8 bLength;

    4. __u8 bDescriptorType;

    5.  
    6. __u8 bEndpointAddress;

    7. __u8 bmAttributes;

    8. __le16 wMaxPacketSize;

    9. __u8 bInterval;

    10.  
    11. /* NOTE: these two are _only_ in audio endpoints. */

    12. /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */

    13. __u8 bRefresh;

    14. __u8 bSynchAddress;

    15. } __attribute__ ((packed));

    16.  
    17. #define USB_DT_ENDPOINT_SIZE 7

    18. #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */

     

     

     
    1. /* USB_DT_STRING: String descriptor */

    2. struct usb_string_descriptor {

    3. __u8 bLength;

    4. __u8 bDescriptorType;

    5.  
    6. __le16 wData[1]; /* UTF-16LE encoded */

    7. } __attribute__ ((packed));

    8.  
    9. /* note that "string" zero is special, it holds language codes that

    10. * the device supports, not Unicode characters.

    11. */

     

     

     

    展开全文
  • USB协议分析软件及抓取的数据,先用7z解压,然后安装软件后即可直接打开USB抓包数据,对比USB2.0协议理解学习。
  • USB协议基础篇

    千次阅读 2020-12-29 08:39:18
    1.2 USB协议版本 1.3 USB接口分类 1.4 PIPE 1.5 endpoint 1.6 管道通信方式 1.7 传输方式 1.7 逻辑设备 1.8 interface 1.9 class协议 1.10 host/device 二,USB框架/拓扑结构

    初次接触USB的同学,可能会被里面各种名词给搞晕,下面就来梳理一下这些知识,希望能帮助大家理解USB。

    目录

    一,从最常见的名词说起

    1.1 什么是USB

    1.2 USB协议版本

    1.3 USB接口分类

    1.4 PIPE

    1.5 endpoint

    1.6 管道通信方式

    1.7 传输方式

    1.7 逻辑设备

    1.8 interface

    1.9 class协议

    1.10 host/device

    二,USB框架/拓扑结构

    三. 重要概念

    3.1 描述符(description)

    3.2 class

    四,USB数据传输过程

    4.1 基本概念

    4.2 枚举

    4.3 数据传输


    一,从最常见的名词说起

    1.1 什么是USB

    这个我就不多解释了,直译就是通用串行总线。再不明白的就百度。

    1.2 USB协议版本

    • USB 1.0/1.1(low/full speed),传输速率最大为12Mbps
    • USB 2.0(high speed),传输速率最大480Mbps
    • USB 3.0(super speed),传输速率最大5Gbps

    协议版本向下兼容

    1.3 USB接口分类

    • Type A,即使我们电脑上的那种接口。
    • Type B,不太常见,比较方正的T型接口,有的嵌入式开发板会用。
    • Type C,现在开始流行起来了,最大的好处就是可以盲插,而不用区分正反。
    • Micro/mini,手机上比较常见。

    不管哪种接口,用的线都是4根,只是形状不同而已。

    1.4 PIPE

    usb通信的最基本形式是通过USB设备里的endpoint,而主机和endpoit之间的数据传输就是通过pipe

    1.5 endpoint

    端点是有方向的,主机到从机成为out端点,从机到主机成为in端点。从这个说明看出端点是单方向的。(除了0端点)

    1.6 管道通信方式

    pipe中的数据通信方式有两种,一种是stream一种是messagemessage要求进出进出方向必须要求同一个管道,默认就使用ep0作为message管道

    1.7 传输方式

    USB endpiont有四种类型,分别对应了不同的数据传输方式,分别为control transfers控制传输interrupt transfers中断传输Bluk Data transfers批量传输Isochronous Data Tranfers等时传输
    控制传输通常用于配置设备,获取设备信息,发送命令到设备

    1.7 逻辑设备

    逻辑设备就是一系列端点的组合,逻辑设备与主机之间的通信发生在一个主机的缓冲区和设备的一个端点之间。

    1.8 interface

    一个逻辑设备可能包含若干个接口,每个接口包含1个或多个端点。每个接口表示一种功能。一个接口对应一个驱动程序。例如usb扬声器就包含一个键盘接口和一个音频流接口

    1.9 class协议

    USB协议中除了定义一些通用软硬件电气特性,还包含各种各样的class协议,用来为不同的功能定义各自的标准接口和具体总线上的数据交互内容和格式。例如u盘的Mass storage class、通用数据交换CDC class

    1.10 host/device

    二,USB框架/拓扑结构

    USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。

    三. 重要概念

    3.1 描述符(description)

    谈到USB描述符,不得不说USB最强悍的地方就在这里。一个口可以插很多的设备,可以插U盘、上网卡、音频设备、还有的是复合设备,一个设备插上后可以虚拟出多个设备出来
    主设备之所以能区分不同的从设备,靠的就是描述符。 于是USB协议里就规定了各种不同的USB描述符。让我们先看一下USB协议里四大描述符之间的关系

    +------设备描述符
            +----------配置描述符1
                +----------接口描述符1
                    +----------端点描述符1
                    +----------端点描述符2
                    +....
                +----------接口描述符2
                    +----------端点描述符1
                    +....
                +....
            +----------配置描述符2
                +----------接口描述符1
                    +----------端点描述符1
                    +----------端点描述符2
                    +....
                +....
            +....
    

    3.1.1 设备描述(device description)

    故名思意用来描述USB设备的,一个设备只有一个设备描述符,包含了设备类型、设备遵循的协议、厂商ID、产品id、序列号等,一个完整的设备描述符如下:

    DEVICE DESCRIPTOR
        bLength: 18
        bDescriptorType: 0x01 (DEVICE)
        bcdUSB: 0x0200
        bDeviceClass: Vendor Specific (0xff)
        bDeviceSubClass: 255
        bDeviceProtocol: 255
        bMaxPacketSize0: 64
        idVendor: Marvell Semiconductor, Inc. (0x1286)
        idProduct: Unknown (0x812a)
        bcdDevice: 0x0000
        iManufacturer: 3
        iProduct: 2
        iSerialNumber: 0
        bNumConfigurations: 1
    

    3.1.2 配置描述符(configrue description)

    配置描述就是用来配置设备的,没错,就是这么简单。但是要记住一点:一个设备同一时刻只能有一种配置生效,而且要区分配置和设置的区别。还是来看一下配置描述符的内容

    CONFIGURATION DESCRIPTOR
        bLength: 9
        bDescriptorType: 0x02 (CONFIGURATION)
        wTotalLength: 121
        bNumInterfaces: 4
        bConfigurationValue: 1
        iConfiguration: 0
        Configuration bmAttributes: 0xc0  SELF-POWERED  NO REMOTE-WAKEUP
            1... .... = Must be 1: Must be 1 for USB 1.1 and higher
            .1.. .... = Self-Powered: This device is SELF-POWERED
            ..0. .... = Remote Wakeup: This device does NOT support remote wakeup
        bMaxPower: 250  (500mA)
    
    

    设置是什么,暂时不多解释,后面再谈。

    3.1.3 接口描述符(interface description)

    一个interface就代表一个设备。USB interface用来处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口。也就是复合设备,例如一个 USB 扬声器可能有 2 个接口: 一个 USB 键盘给按钮和一个 USB 音频流。

    INTERFACE DESCRIPTOR (2.0): class Vendor Specific
        bLength: 9
        bDescriptorType: 0x04 (INTERFACE)
        bInterfaceNumber: 2
        bAlternateSetting: 0
        bNumEndpoints: 2
        bInterfaceClass: Vendor Specific (0xff)
        bInterfaceSubClass: 0x00
        bInterfaceProtocol: 0x00
        iInterface: 8
    
    

    一个interface包含多个endpoint

    3.1.4 端点描述符(endpoint description)

    USB通信的基本物理单位,一个endpiont只能承载一个方向的数据。endpiont分为如下几种:

    • CONTROL

    控制端点被用来允许对 USB 设备的不同部分存取. 通常用作配置设备, 获取关于设备的信息, 发送命令到设备, 或者获取关于设备的状态报告. 这些端点在尺寸上常常较小. 每个 USB 设备有一个控制端点称为"端点 0", 被 USB CORE用来在插入时配置设备. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

    • INTERRUPT

    中断端点传送小量的数据, 以固定的速率在每次 USB 主请求设备数据时. 这些端点对 USB 键盘和鼠标来说是主要的传送方法. 它们还用来传送数据到 USB 设备来控制设备, 但通常不用来传送大量数据. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

    • BULK

    块端点传送大量的数据. 这些端点常常比中断端点大(它们一次可持有更多的字符). 它们是普遍的, 对于需要传送不能有任何数据丢失的数据. 这些传送不被 USB 协议保证来一直使它在特定时间范围内完成. 如果总线上没有足够的空间来发送整个 BULK 报文, 它被分为多次传送到或者从设备. 这些端点普遍在打印机, 存储器, 和网络设备上.

    • ISOCHRONOUS

    同步端点也传送大量数据, 但是这个数据常常不被保证它完成. 这些端点用在可以处理数据丢失的设备中, 并且更多依赖于保持持续的数据流. 实时数据收集, 例如音频和视频设备, 一直都使用这些端点.

    BULK端点描述符数据内容如下:

    ENDPOINT DESCRIPTOR
        bLength: 7
        bDescriptorType: 0x05 (ENDPOINT)
        bEndpointAddress: 0x86  IN  Endpoint:6
            1... .... = Direction: IN Endpoint
            .... 0110 = Endpoint Number: 0x6
        bmAttributes: 0x02
            .... ..10 = Transfertype: Bulk-Transfer (0x2)
        wMaxPacketSize: 512
            .... ..10 0000 0000 = Maximum Packet Size: 512
        bInterval: 0
    
    
    

    3.2 class

    class用来描述设备属于哪种设备,例如音频、键盘、U盘等。设备通过class来确认和加载相应的驱动。class分为device class 和interface class。具体的class值以及含义,参考define class

    https://www.usb.org/defined-class-codes

    class 包含

    1. class
    2. subclass
    3. protocol

    组合在一起,用来指出设备具体功能。

    device class举例

    DEVICE DESCRIPTOR
        bLength: 18
        bDescriptorType: 0x01 (DEVICE)
        bcdUSB: 0x0200
        bDeviceClass: Miscellaneous (0xef)
        bDeviceSubClass: 2
        bDeviceProtocol: 1 (Interface Association Descriptor)
        bMaxPacketSize0: 64
        idVendor: Marvell Semiconductor, Inc. (0x1286)
        idProduct: Unknown (0x4e31)
        bcdDevice: 0x0100
        iManufacturer: 1
        iProduct: 2
        iSerialNumber: 3
        bNumConfigurations: 1
    

    interface class举例

    INTERFACE DESCRIPTOR (1.0): class CDC-Data
        bLength: 9
        bDescriptorType: 0x04 (INTERFACE)
        bInterfaceNumber: 1
        bAlternateSetting: 0
        bNumEndpoints: 2
        bInterfaceClass: CDC-Data (0x0a)
        bInterfaceSubClass: 0x00
        bInterfaceProtocol: No class specific protocol required (0x00)
        iInterface: 5
    
    

    class值如图下所示:

    四,USB数据传输过程

    4.1 基本概念

    • 一个【传输(Transfer)】(控制、批量、中断、等时):由多个【事务(Transaction)】组成
    • 一个【事务(Transaction)】(IN、OUT、SETUP):由一多个【Packet】组成。

    USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。

    4.2 枚举

    • 上电状态(usb device插入host)
      插入host后,host的每个hub对应端口上都有供电,连接着的设备就进入供电状态

    • host检测到device插入

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

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

    • Host了解连接的设备
      hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型

    • host复位设备(不是正的复位设备,是复位USB通信)
      hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms

    • 主机发送Get_Descriptor请求获取默认管道的最大包长度
      默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,设备描述符的第8字节代表设备端点0的最大包大小

    • 设置地址
      主机给设备分配一个地址,在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。

    • 获取设备配置
      主机获取设备的信息

    枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。

    一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。然后主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。所有的USB设备必须支持标准请求(StandardRequests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。

    在讲解枚举之前,先大概说说USB的一种传输模式——控制传输。这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。控制传输分为三个阶段:①建立阶段。②数据阶段。③确认阶段。 建立(setup)阶段:都是由USB主机发起,它是一个setup数据包,里面包含一些数据请求的命令以及一些数据。如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。如果在数据阶段,即便不需要传送数据,也要发一个0长度的数据包。数据阶段过后就是确认阶段。确认阶段刚好跟数据阶段相反,如果是输入请求,则它是一个输出数据包;如果是输出请求,则它是一个输入数据包。确认阶段用来确认数据的正确传输。

    4.3 数据传输

    usb host与usbfunction之间采用的是一种“非对称”的传输,也就是说,无论usb接受数据还是发送数据,都是由usb host首先发起。
    首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。
    其次,主机发第2个至第n个packet载有实际数据
    最后,从机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样主机
    就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

    控制传输
    一个Usb的控制式传输分为两个或三个阶段进行传输:setup stage,data stage(视情况而定),status stage。 首先发起setup,之后发起以data0为起始的setup data,最后usb function回应ack结束一次交互。

    数据传输
    USB除了EP0外,其它的EP都是有方向的,如果从机有数据要上发,先放到对应的EP的buf中,最迟等一个frame就会被host主动读走。


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

     

    展开全文
  • USB协议入门

    千次阅读 2020-06-15 15:27:46
    文章目录USB是什么USB解决什么问题USB-OTGUSB的特点USB的拓扑结构USB的电气特性USB的插入检测机制USB描述符USB设备的枚举过程USB包结构和传输过程包的结构包的分类令牌包数据包握手包特殊包USB的四种传输类型USB事务...

    USB是什么

    • 说法一:you sb,你是沙雕
    • 说法二:美国USA的弟弟USB
    • 说法三:通用串行总线(universal serial bus)

    USB解决什么问题

    简化PC与外围设备的连接,增加易用性

    因为外围设备是各种各样的,所以的PC有很多种接口,比如早期键盘鼠标的PS/2,9针串口,23针并口,DVI,VGA,RJ45,RJ11,HDMI,SATA,PCIE等等,很多接口还是不支持热拔插的

    在比较老的PC中,连接外围设备时,要断电,甚至要打开机箱,而且因为接口的不同,想要支持这些外围设备,主板就得做各种接口出来,非常的麻烦

    如果能够实现一种统一的接口,主板上不需要做N种接口就能接入任何外围设备,而且支持热拔插,传输速度也很快,那无疑是帮大忙了

    USB是基于此而实现,支持即插即用(plug and play),并且支持热拔插(hot plug)

    USB-OTG

    由于USB是主从模式,只能由主机发起通信,从机响应,因而两个主机或者两个从机是无法通信的,因此提出了OTG(on to go),同一个设备,在不同场合下,可以在主从之间切换

    USB的特点

    • USB1.0和USB1.1版本中,支持低速(1.5Mbps)和全速(12Mbps)
    • USB2.0加入高速模式(480Mbps),高速模式是可选的,不一定所有USB芯片都支持
    • USB3.0(5.0Gbps)

    注:bps是每秒多少位

    USB的拓扑结构

    USB是主从机构,主机叫host,从机叫device
    一个主机具有一个或者多个USB主控制器(host controller)和根集线器(root hub)
    主控制器负责数据处理,根集线器提供一个连接主控制器与设备的接口和通路
    USB集线器(usb hub)对原有的USB口在数量上扩展,但是并不增加带宽,每一个usb集线器下,又可以接入新的USB集线器,因此可以层层拓展,但是总数是有限制的

    通常情况下,一个PC具有多个主控制器,每个主控制器下面有一个根集线器,根集线器下通常具有1-N个USB口,如果希望插入的几个USB设备具有较大的传输速度,可以考虑连接到不同的USB主控上

    USB的电气特性

    标准USB是四线:5V电源VCC,地GND,差分数据线正D+,差分数据线D-
    OTG中多一根线(ID),用于身份识别,判断是主还是从

    USB2.0的三种传输速度:低速(1.5Mpbs)、全速(12Mpbs)、高速(480Mpbs)

    USB数据的编码:NRZI,数据为0时,电平翻转;数据为1时,电平不翻转

    位填充:根据上述,可能存在长时间电平不变化的情况,因此数据出现连续6个1时,强制插入一个0后编码发送,在接收端,需要检测并去掉这个0,才能恢复数据

    USB的插入检测机制

    主机端:D+和D-分别接15K电阻下地,当悬空时保持为低电平
    从机端:D+或D-接1.5K电阻上拉,具体接到D+还是D-,由速度决定

    全速&高速:D+
    低速:D-

    因此从机接入到主机后,主机端的集线器能检测到D+或D-的电平出现变化,随后报告给USB主控制器

    USB描述符

    USB主机如何知道一个设备的功能、行为呢,需要通过描述符实现,描述符中记录了设备的类型、厂商ID、产品ID、端点情况、版本号等众多信息

    qualifier descriptor 和 other speed configuration descriptor 以及一些特殊的描述符不做介绍

    如果有特殊描述符,它跟在相应接口描述符之后

    • 设备描述符:Device descriptor
      一个USB设备只有一个设备描述符,设备描述符里决定了该设备有多少在种配置,每种配置都对应一个配置描述符
      设备描述符主要记录信息:USB协议版本号、设备类型、端点0的最大包大小、厂商ID、产品ID、设备版本号、厂商字符串、产品字符串、设备序列号、可能的配置数等

    • 配置描述符:configuration descriptor
      每个配置描述符中,定义了该配置里有多少个接口,每个接口对应一个接口描述符
      配置描述符主要记录的信息:配置所含接口数,配置的编号、供电方式、是否支持远程唤醒、电流需求等

    • 接口描述符:interface descriptor
      接口描述符里定义了该接口有多少个端点,每个端点对应一个端点描述符
      接口描述符主要记录的信息:接口的编号、接口的端点数、接口所使用的类、子类、协议

    • 端点描述符:endpoint descriptor
      端点描述符定义了端点的大小、类型等
      端点描述符主要记录的信息:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等

    • 字符串描述符:string descriptor
      提供一些方便人们阅读的信息,它不是必须的

    在主机获取描述符时,首先获取设备描述符,接着获取配置描述符,然后根据配置描述符中的配置集合的总长度,一次将配置描述符、接口描述符、类特殊描述符、端点描述符一次读回,对于字符串描述符则是单独获取的

    USB设备的枚举过程

    枚举:从设备读取各种描述符信息

    USB主机检测到USB设备插入后,进行枚举,根据获取的信息,加载合适的驱动程序

    在设备的枚举过程中,使用控制传输,控制传输分为三个过程:建立过程、可选的数据过程、状态过程

    • 建立过程:它开始于一个setup令牌包,后面紧跟一个data0数据包,后面就是数据过程
    • 数据过程:输入数据或者输出数据,数据过程后是状态过程
    • 状态过程:与数据过程相反,是输出数据或者输入数据,用来确认所有的数据是否都已经正确传输完成

    枚举的详细过程:

    • 主机检测到设备插入,对设备复位
      设备复位后地址为0,主机通过0地址和刚插入的设备通信,主机往0地址的设备的端点0发送获取设备描述符的标准请求(这是一个标准传输的建立过程),设备收到请求后,返回设备描述符给主机(8字节),主机收到设备描述符确认无误后,返回一个0长度的确认数据包给设备,进入设置地址阶段

    • 主机再次对设备复位,设置地址
      再一次复位后,进入设置地址阶段,USB主机往0地址的设备端点0发出一个设置地址的请求(控制传输的建立过程),新的设备地址在建立过程的数据包中,因此没有数据过程,具体的地址由USB主机管理,分配一个唯一的地址给刚接入的设备。USB设备在接收到请求后,就进入状态过程,主机会再次发送一个请求状态返回,这时USB设备返回0长度的状态数据包,主机收到后,经过确认,发送应答包ACK给USB设备,设备收到ACK后,启用新的设备地址

    • 主机再次获得设备描述符
      主机使用新设置的地址访问USB设备,这次获取全部的18字节的设备描述符

    • 主机获取配置描述符
      配置描述符共9个字节,主机获取到配置描述符后,根据配置描述符中所描述的配置集合总长度,获取配置集合。
      配置集合包括配置描述符、接口描述符、类特殊描述符、端点描述符等

    • 获取字符串描述符
      如果有字符串描述符的话,可以获取这个

    USB包结构和传输过程

    包的结构

    USB总线上传输数据是以包为基本单位,一个包被分为不同的域,包的类型不同,包含的域也不同
    包有个共同特点,那就是以同步域开始,紧跟一个包标识符,最终以包结束符来收尾

    • 同步域:用于告诉USB的串行接口引擎数据就要开始传输了,请做好准备,除此之外,同步域还可以用来同步主机端和设备端的数据时钟
    • 包结束符:对于高速设备,用故意的填充错误来表示,此时CRC校验仍然可以通过,因此可以判断是故意的错误填充,而不是数据传输错了;对于全速和低速设备,将D+和D-都保持低电平,时间为2个数据位宽度
    • 包标识符:用来表示一个包的类型,共有8位,只前4位是有效数据,后4位是前4位的取反,用于校验

    包的分类

    包的类型:令牌包(token packet)、数据包(data packet)、握手包(handshake packet)、特殊包(special packet)

    PID类型PID名PID[3:0]说明
    令牌类OUT0001通知设备将要输出数据
    令牌类IN1001通知设备将要输入数据
    令牌类SOF0101通知设备这是一个帧起始包
    令牌类SETUP1101通知设备将要开始一个控制传输
    数据类DATA00011数据包
    数据类DATA11011数据包
    数据类DATA20111数据包
    数据类MDATA1111数据包
    握手类ACK0010确认
    握手类NAK1010不确认
    握手类STALL1110挂起
    握手类NYET0110未准备好
    特殊类PRE1100前导(这是一个令牌包)
    特殊类ERR1100错误(这是一个握手包)
    特殊类SPLIT1000分裂事务(这是一个令牌包)
    特殊类PING0100PING测试(这是一个令牌包)
    特殊类-0000保留

    令牌包

    令牌包用来启动一次USB传输,USB是主从结构,数据传输由主机发起,主机发送一个令牌包,通知哪个设备进行响应,如何响应
    令牌包分四种:输出、输入、建立、帧起始

    • 输出:通知设备将要输出一个数据包
    • 输入:通知设备返回一个数据包
    • 建立:只用在控制传输中,通知设备将要输出一个数据包,但是只是用DATA0数据包,且只能发送到设备的控制端点,设备必须接收
    • 帧起始:在每帧开始时发送,以广播的形式发送,所有USB设备均可接收到

    令牌包结构:

    • OUT、IN、SETUP
      | 同步域 | 8位包标识符PID | 7位地址 | 4位端点号 | 5位CRC校验 | EOP |

    • SOF
      | 同步域 | 8位包标识符PID | 11位帧号 | 5位CRC校验 | EOP |

    数据包

    用来传输数据,数据包都具有同样的结构
    | 同步域 | 8位包标识符PID | 字节0 | 字节1 | … | 字节N | 16位CRC校验 | EOP |

    为什么同样用于传输数据,会有不同类型的数据包,是因为传输错误时需要纠错
    例如:主机向设备发送了一个包,设备接收到并返回确认信号ACK,但是这个ACK在传输过程中受到干扰而损坏,主机无法正确获取ACK,就没办法判断是否传输成功
    解决办法:主机和设备都维护自己的一个数据包类型切换机制,发送或接收成功时切换数据包类型,正常情况下,主机和设备的数据包类型保持一致,如果检测到包的类型不一致,则认为发生了错误,例如当发生上述情况时,主机无法获取ACK导致主机的数据包切换少了一次,下一次获取设备发送的包时,就会检测到包的类型不一致

    握手包

    握手包用来表示一个传输是否被对方确认,握手包只有同步域、PID、EOP,是最简单的一种数据包
    握手包的类型:

    • ACK:正确接收数据,并且有足够的空间来容纳数据,主机和设备都可以用ACK来确认,其它3种只能用于设备返回
    • NAK:没有数据需要返回,或者数据正确但是没有足够的空间容纳,主机接到NAK时,会尝试重传,NAK并不代表数据出错,如果是数据出错,则什么都不会返回,等待方会因获取不到返回而等待超时
    • STALL:设备无法执行这个请求,或端点已被挂起,表示一种错误的状态,需要主机进行干预才能解除
    • NYET:设备本次数据接收成功,但是没有足够的空间容纳下一次数据,主机下一次输出时,应先使用ping试探设备是否有足够空间

    特殊包

    特殊包是一些在特殊场合使用的包,总共4种:PRE、ERR、SPLIT、PING,其中ERR是握手包,其余是令牌包
    特殊包的类型:

    • PRE:通知集线器打开其低速端口的一种前导包,只用于全速模式中,一般情况下,为了防止全速信号使低速设备误动作,集线器不会将全速信号送给低速设备,当收到PRE令牌包时,才会打开低速端口,接着以低速模式给低速设备发送其它包
    • ERR:在分裂事务中表示错误
    • SPLIT:高速事务分裂令牌包,通知集线器将高速数据包转化为全速或低速数据包发送给下面的端口
    • PING:该令牌包不发送数据,而是等待设备返回ACK或NAK,用于判断是否能传输数据,它只用于批量传输和控制传输的输出事务中

    USB的四种传输类型

    虽然已经定义了基本传输单位为包,但是还需要按照一定的关系将不同的包组织成事务才能传输数据

    USB事务

    事务通常由两个或三个包组成:令牌包、数据包、握手包

    • 令牌包:由主机发送,用于启动一个事务
    • 数据包:存放数据,可以由主到从,也可以由从到主,方向由令牌包决定
    • 握手包:由数据接收者发送,将数据接收状态反馈给发送方

    USB协议规定了4中传输类型:批量传输、同步传输、中断传输、控制传输
    其中批量、同步、中断每次传输都是一个事务,而控制包括三个过程,建立和状态过程分别是一个事务,数据过程可能包含多个事务

    批量传输

    批量传输通常用于数据量大、对数据的实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等
    批量传输使用批量事务传输数据,一次批量事务有三个阶段:令牌包阶段、数据包阶段、握手包阶段

    批量输出事务:

    • 主机发送一个OUT令牌包,这个令牌包包含了设备地址、端点号
    • 主机发送一个DATA包,这时指定的设备接收DATA包
    • 主机切换到接收模式,等到设备返回握手包
    • 设备的返回情况
      1. 设备正确接收数据,返回ACK或NYET
      2. 设备没有足够的空间接收,返回NAK
      3. 设备的端点处于挂起状态,返回SALLL
      4. 设备检测到有错误,不返回,让主机等待超时

    批量输入事务:

    • 主机发送一个IN令牌包,这个令牌包包含了设备地址、端点号
    • 主机切换到接收模式,等到设备返回数据包
    • 设备返回的情况
      1. 设备未检测到错误,将数据包放到总线上
      2. 设备没有数据需要返回,则使用NAK握手包响应主机
      3. 设备的端点处于挂起状态,返回SALLL握手包
      4. 设备检测到有错误,不返回,让主机等待超时
    • 主机返回的情况
      1. 主机未检测到错误,使用ACK握手包应答
      2. 主机检测到错误,不做任何响应,让设备检测超时

    PING事务:

    • 主机发出PING令牌包
    • 设备根据情况返回ACK、NAK、STALL握手包

    中断传输

    • 中断传输通常用在数据量不大,但是对时间要求严格的设备中,例如鼠标、键盘等,中断传输也可以用于检测某个标志位,当条件满足时进行批量传输
    • 这里的中断,并不是硬件意义上的中断,而是指由主机按照一定的频率去发出中断传输请求
    • 设备的端点描述符将会报告它的查询间隔,主机会保证在小于这个时间间隔内安排一次中断传输事务
    • 中断传输和批量传输结构上基本一样,只是中断传输没有PING和NYET两种包

    同步传输

    用于数据量大、对实时性要求高的场合,例如音视频设备,但是同步传输不保证数据100%正确,因为它没有应答包

    控制传输

    控制传输分为三个过程:建立过程、可选的数据过程、状态过程

    • 建立过程:建立事务是一个输出数据的过程,令牌包是SETUP,数据包只能是DATA0,握手包为ACK或者不应答
    • 数据过程:数据过程是可选的,也可以没有,如果有的话,可以包含多个方向相同的数据事务,数据过程的第一个包必须是DATA1,正确传输一个包后,进行包类型切换
    • 状态过程:状态过程只使用DATA1包

    端点类型与传输类型的关系

    一个具体的端点,只能工作在一种传输模式下,例如:控制端点、批量端点、中断端点
    端点0是每个USB设备都必须具备的默认控制端点,非0端点要设置后才能使用

    展开全文
  • JLink USB协议参考手册

    2014-08-26 09:27:23
    JLink USB协议参考手册 This manual describes the J-Link USB Protocol used in J-Link products and how it is used. In the course of this document the J-Link ARM is refered to as emulator.
  • USB协议请求命令

    2012-12-01 13:14:19
    USB协议请求命令,分为五个段,每段的意义。请求类型,请求值,索引,长度、
  • USB协议及分析仪的使用 介绍USB 协议 以及包的分析
  • USB协议分析软件

    2017-08-07 11:43:41
    两个工具分别是:USBlyzer,Bus Hound 6.
  • 两个常用的USB协议分析软件工具

    热门讨论 2013-09-15 22:00:35
    两个经常用于USB通信分析的上位机软件,BusHound和USBlyzer,可以对与PC机通信的任何USB设备的通信过程进行捕获,便于开发人员了解USB设备的运行情况。
  • 简单说说USB协议(一)

    千次阅读 2019-07-31 22:09:08
    USB,通用串行总线,是一种计算机与外围设备进行数据交互的通信协议。 任何东西的出现都是有理可循的,在以前计算机刚兴起的时候,要连接一个新的设备,需要断电关闭计算机,连接好...USB协议采用主从工作模式,...

    目录

    USB是什么

    USB协议的传输结构

    USB的电气特性

    拓扑结构

    编码方式

    描述符


    USB是什么

            USB,通用串行总线,是一种计算机与外围设备进行数据交互的通信协议。

            任何东西的出现都是有理可循的,在以前计算机刚兴起的时候,要连接一个新的设备,需要断电关闭计算机,连接好设备,配置好硬件,再上电运行,这个过程相当费时费力,为了能拥有随意接入设备这种热拔插特性,USB总线协议应运而生。

            USB总线如今已经有USB1.0、USB1.1、USB2.0、USB3.0

            USB协议采用主从工作模式,即只有主机与从机之间才能进行数据通信,也正是这样引发一个缺陷,就是主机与主机、从机与从机之间不能通信。

            后来,USB OTG的出现弥补了这一缺陷,USB OTG的特性,就是能将一个设备,在不同的场合进行主机或从机的身份切换,如何做到这一点的,就是USB OTG中增加了一种MINI USB接头,是五线制,跟四线制一样,多出来的一条是ID线,用来标识一个设备是主机还是从机。

            尽管如此,还是避免不了USB主从的工作模式,数据永远在主机和从机之间进行,永远是主机发起主动权,从机只是被动的读写。

            USB传输如今已经是一种普遍的手段,在USB1.0和USB1.1中,传输速度上有1.5Mb/s的低速模式和12Mb/s的全速模式,之后出了USB2.0,传输速度上就有了480Mb/s的高速模式、在USB3.0上,速度就更快了。

            这些低速、全速、高速指的是数据在每秒传输的位数,实际速率要低一点,因为还有同步域、令牌包、CRC校验、位填充、包间隙这些协议开销。

            而在传输距离上,建议低速不超过三米,全速不超过5米。

            需要走出的一个误区就是:并不是设备拥有越高版本的协议,速度就一定快;就比如说PSIUSBD12这款USB芯片,虽然手册上写了符合USB2.0协议,实际上并没有高速模式,只有12Mb/s的全速模式。

    USB协议的传输结构

            以下是USB协议的LOGO:

            标准的USB协议传输结构是这样子的(设备端):

            USB协议采用的是差分传输模式,因而有两条数据线D+和D-,在低速和全速模式下,采用电压传输模式,在高速下,采用电流传输模式。

            传输结构之所以采用两长两短的方式,是为了支持热拔插;

            当USB设备接入主机时,VCC和GND优先被接通;拔掉设备时,D-和D+数据线优先断电。

            原因很简单,如果D-和D+先于电源线被接通,那么此时电源为0,USB芯片的IO口引脚电压很有可能大于电源电压,很容易导致芯片闩锁,轻则无法工作,重则损坏芯片,这时候需要断电重新上电。

            在还没有进行配置前,数据线最大电流为100mA,配置后,数据线最大电流为500mA,数据的传输为小端序方式,在国际标准上,甚至对USB协议的四线做了颜色标注,VCC为红色,GND为黑色,D-为白色,D+为绿色

    USB的电气特性

            在电气结构上,USB设备与主机的连接也很有讲究:

            主机端的D-和D+数据线各自被串联15KR电阻下拉到地,当没有USB设备插入的时候,这两条数据线就一直呈现低电平状态。

            设备端的D-或者D+数据线,串联一个1.5KR的电阻上拉到3.3V,一旦设备插入主机,那么当主机捕捉到自身的D-或者D+被拉到高电平时,就知道有USB设备连接进来了,这样就检测到有外来USB设备接入了。

            对于从机设备中到底是D-还是D+串联1.5KR电阻,这个就要有传输协议的模式来决定了,当配置成全速或高速时,就由D+串联电阻;当配置成低速时,就是D-串联电阻了。

            简单来说就是快的就连D+,慢的就连D-。

    拓扑结构

            刚才说了,USB是一种主从工作模式,大多数时候主机被叫“Host”,从机被叫“Device”;

            主机端具有一个或者多个USB主控制器,每个USB主控制器下带有一条或者多条根集线器,主控制器负责数据处理,根集线器负责提供一条主控制器与设备连通的接口;

            当然有这么一种情况,当设备越来越多,接口不够用的时候,就需要一个特殊的USB设备登场了,那就是USB集线器,他可以在原有的USB接口上扩展出更多的接口,当然了,扩展得再多,说白了也是共享一个主控制器,因此带宽是不会变多的

            在PC端的设备管理器中就可以看到主机的USB主控制器和根集线器:

            虽然说一个USB主控制器可以连接多个设备,这种连接并不是串联,也不是并联,而是通过集线器来实现的。

            如图,主控制器和根集线器后有集线器,集线器将一个或者多个USB接口扩展成更多接口,将更多接口拓展成再多,但是这种拓展并不是无休止进行下去的,USB1.1最多扩展4层,USB2.0最多扩展6层

            因此大概的传输过程是这样的:

            首先由主控制器发出数据,通过各层的集线器传送到相对应的某一层的接口给USB设备,设备接收到数据后进行分析处理,然后发送回一组数据或应答,它最先被送至本层的集线器,然后被送到上一层集线器,一直到主控制器为止,最终,主控制器将数据或者应答交给计算机进行处理。

    编码方式

            无论USB协议再怎么高深,发送端实际上数据传输的本质就是0和1。

            USB采用的是NRZI编码方式,数据为0的时候电平翻转,数据为1的时候电平不反转

            当出现连续6位为1的时候,自动填充进一个0,这样做的目的是防止长时间的电平不变化,不利于时钟的提取。而在接收端则完全相反,自动去掉填充的0,还原出原本的数据。

            这就是位填充处理了。

            当然,这种编码的处理过程,USB芯片都已经自动处理好了,我们只要知道有这些细节便可。

    描述符

            USB协议只是一条总线,提供了一条通路而已,那么传了那么多0和1的数据,到底传输的是什么数据呢,原来是要告诉主机,这个设备的具体功能、会有什么行为,该设备的出厂商,设备ID号,厂商ID号,版本号,端点情况等等信息。

            这些信息,都是由主机从设备那里获取的描述符得知的,因此,USB总线上传输的0和1数据,实际上就组成了描述符数据,发送给了主机。

            描述符种类多样:设备描述符、配置描述符、接口描述符、端点描述符、类特殊描述符、字符串描述符·····

            一个设备只有一个设备描述符,该设备描述符定义了多种配置;

            每一种配置对应一个配置描述符,该配置描述符定义了多种接口;

            每一个接口对应一个接口描述符,该接口描述符定义了多个端口;

            每个端点对应一个端点描述符,端点描述符定义了该端点的大小、类型等等。

            因此可看出来,在主机获取描述符的过程是有顺序的,从设备描述符,到配置描述符,再到接口描述符,最后到端点描述符,如果由类特殊描述符,那就跟在端点描述符之后。

            可见,描述符的获取是一层一层来的,不过在获取配置描述符的时候,可以根据配置描述符得到配置集合的总长度,从该集合我们一口气得到配置描述符、接口描述符、端点描述符和类特殊描述符。

            这样也就引发了一个疑问,既然可以一口气从配置集合中获取到端点描述符了,那我为什么还要去费劲获取配置描述符和接口描述符呢,理论上讲是可以的。

            我们来捋一下各种描述符之间的关系,假如有一个U盘(U盘当然是用USB通信协议啦),它有一个设备描述符,因此也有一个设备地址(USB设备采用7位来表示地址,即0~127,其中0号地址是保留给未初始化的设备用的,因此理论上可以连接127个设备,但实际上并不会接那么多),主机是通过该设备地址找到U盘并与它通信的,但是仅仅只有设备地址是不够的,还要知道主机与U盘中哪一个端点进行通信,因此还需要有一个端点地址,只有知道了设备地址和端点地址,才能实现对设备点对点发送和接收数据。

            因此按道理来说,只要知道设备描述符和端点描述符就够了,就好比你要去XX学校找XX人一样,花点时间总会找得到行得通的。

            而配置描述符和接口描述符的出现,只是为了能更好的管理端点而抽象出来的概念罢了,就好比指定了XX栋xx室一样,想象一下,你得到了这么一条信息,去深圳大学3栋305室找某某某,这是不是就比单纯告诉你去深圳大学找某某某要效率高很多了?

            有这么三条需要注意的点:

    1、一个设备可以有多种配置,但同一时刻只能有一种配置模式;

    2、同一个端点不能出现在同一个配置下的一个或几个接口中;

    3、同一个端点可以出现在不同配置下的一个或几个接口中;

            好了说了这么多,到现在只知道有这么几种描述符,通过设备描述符可以知道配置描述符,通过配置描述符可以知道接口描述符,通过接口描述符可以知道端点描述符;从微观上来推理数据传输的过程就很简单了:

            设备端USB协议产生0和1数据,在端点出构成一个接口,由接口又构成一种配置,由配置又构成一个设备,最后把这设备的信息交给主机进行数据处理,大概过程就是这样。

            当然了,设备描述符中的数据不止有配置描述符,配置描述符中的数据不止有接口描述符,接口描述符中的数据不止有端点描述符,具体有以下的数据:

            设备描述符:设备使用的USB协议版本、设备类型,设备版本号,端点0的最大包大小,厂商ID,产品ID,厂商字符串索引,产品字符串索引,设备序列号索引、包含的配置数······

            配置描述符:包含的接口熟,配置编号,供电方式,是否支持远程呼唤,电流需求大小·····

            接口描述符:接口编号,接口端点数,接口所使用的类、子类、协议······

            端点描述符:端点号、方向,端点传输类型,最大包大小,查询时间间隔·······

    展开全文
  • USB协议详解

    万次阅读 多人点赞 2019-03-13 14:58:11
    本博客整理自网络,仅供学习参考,如有侵权,联系删除。... 一个transfer(传输)由一个或多个transaction(事务)构成,一个transaction...USB的数据通讯首先是基于传输(transfer)的,传输的类型有:中断传输、批量传输...
  • 详细讲解了USB2.0协议架构及Linux Kernel USB驱动框架与实现,该文档是Linux USB学习者不可多得的一手资料。
  • USB协议 USB协议 USB协议 USB协议 USB协议 USB协议
  • 从实用的角度出发,对USB协议进行了简单的解释,并对实际设计USB设备时必须考虑的一些关键问题作了比较全面的讨论。
  • USB协议中英文版.rar

    2020-03-29 09:04:19
    USB协议 usb2.0和usb3.0,压缩包中包括英文版的usb2.0协议,英文版的usb3.0协议和中文版的 usb2.0协议。适合于想深入了解usb的同学,欢迎下载学习。
  • 通俗易懂的USB协议详解(转)

    千次阅读 2020-12-22 07:41:41
    ... USB作为一种串行接口,应用日益广泛。如同每个工程设计人员必须掌握I2C,RS232这些接口一样,我们也必须掌握usb. ...但是usb的接口协议实在有点费解,linux uhci驱动作者之一Alan Stern曾经就说过“The USB doc
  • USB协议 - UVC标准协议规范(二)

    千次阅读 2021-09-07 17:28:46
    USB协议-UVC标准协议规范(二)1.概述2.UVC功能特征2.1 Video Interface Class2.2 Video Interface subclass and Protocol2.3 UVC功能拓扑2.3.1 Unit单元2.3.1.1 SU(选择器单元)2.3.1.2 PU(处理单元)2.3.1.3 EU...
  • USB 协议分析(含基本协议USB 请求和设备枚举)

    万次阅读 多人点赞 2018-08-30 00:49:29
    目录 1. 物理特性 1.1 引脚 1.2 USB 信号(差分信号) ...2. 通信协议 2.1 包组成(Packets Content) 2.1.1 PID 域 2.1.2 Address 地址域 2.1.3 Frame Number 帧号域 2.1.4 Data 数据域 2.1.5 C...
  • STM32的USB协议完美版

    2012-08-27 22:16:33
    包含有STM32的USB实例和USB2.0的通信协议,具体的使用解释都很详细,稍加改造就可以进行大量移植。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,413
精华内容 28,565
关键字:

usb协议