还没了解USB的基本概念?或许你可以看看这个

一、USB概述

USB(Universal Serial Bus):通用串行总线,是一项为了简化个人计算机与外围设备的连接而诞生的技术,有着即插即用(PnP:Plug and Play) 的特性,同时也具备方便携带、传输速度快、可拓展性强等优点。

根据传输速度(总线上每秒传输的位数),USB可分为低速(1.5Mbit/s)、全速(12Mbit/s)、高速(480Mbit/s) 三种模式。

在拓扑结构上,USB系统遵循 “主从结构”,即通讯双方由主机(Host)从机(Device) 构成,通讯只能由主机发起,且主机与主机、从机与从机不能互联:

  1. 主机通常由一个或多个USB主控制器(host controller)和根集线器(root hub)构成。其中,主控制器主要负责数据处理,而根集线器则提供一个连接主控制器和从机之间的接口和通路;
  2. 从机设备负责响应主机的各类请求
  3. 值得一提的是,有一类特殊的USB设备——USB集线器(USB hub),它可以对原有的USB口在数量上进行拓展,获得更多的USB口 (只改变数量,但改变后的总带宽不变,总带宽由主控制器决定)。

传统的USB,设备的身份只能固定是主机或从机。USB OTG(On The Go),一种特殊的USB从机设备,可以在主机、从机之间,实现身份切换。

二、USB的硬件特性

2.1. USB线缆构成

标准的USB连接线,为四芯电缆(VCC、D+、D-、GND)。

USB OTG的连接线,则会再增加了一条身份识别(ID)线,用来表明自己的通讯身份。主机、从机的切换,就是通过更改该线的状态来实现的。

而所有USB连接线的插头中,VCC、GND的触点都会比其它线芯的触点稍长。这是专门为了支持热插拔而设计的硬件结构 —— 当USB插入时,先接通VCC和GND;USB拔出时,最后断开VCC和GND。该结构保证了插拔过程中,不会出现 “数据线早于电源线接通” 的情况,从而避免芯片闩锁现象。

线缆构成信息如下表:

电缆线芯用途备注
VCC5V电源线USB电缆必备,一般为红色
D+USB差分传输,通讯数据线之一USB电缆必备,一般为绿色
D-USB差分传输,通讯数据线之一USB电缆必备,一般为白色
GNDUSB电缆必备,一般为黑色
IDOTG设备是"主机"还是"从机"的识别标准USB OTG电缆特有

注意:备注中,各线芯对应的颜色记录,源于USB协议,但实际厂商不一定完全遵循标准设计,请以万用表实测为准。

2.2.USB插入检测

USB主机检测是否有从机设备插入,依靠的是D+、D-线芯的电平变化

  • USB集线器每个下游端口的D+、D-上,都分别接了一个15KΩ的下拉电阻到地。当集线器端口悬空(没有设备插入)时,D+、D-将会是低电平的状态;
  • USB从机设备的D+或D-上,接了一个1.5KΩ的上拉电阻到3.3V电源(全速、高速设备,上拉电阻接到D+上;低速设备,电阻接到D-上)(速度快的接正,慢的接负),最终使该引脚呈现高电平状态;
  • 当设备插入到集线器时,由于15KΩ下拉电阻、1.5KΩ上拉电阻的分压,主机的D+或D-会被拉高。集线器检测到该状态后,就会报告给USB主控制器(或它的上一层集线器),从而完成设备插入的检测;
  • USB高速设备先是被识别为全速设备,然后通过集线器和设备两者的确认,再切换到高速模式下。

2.3. USB电气特性

在通讯时,USB信号使用的是NRZI编码格式(当数据为0时,电平翻转;数据为1时,电平不翻转)。

发送数据时,为了防止出现"电平信号长时间不变化"的情况(不利于时钟信号的提取),会先对数据进行位填充(bit stuffing) 处理(当遇到连续6个数据1时,强制插入一个数据0),然后由串行接口引擎(SIE)将数据串行化NRZI编码后,再发送到差分数据线上。

接收数据时,则执行与发送相反的操作:接收端先从数据线采样并解码,再由串行接口引擎(SIE)将数据并行化(反串行化),然后去除位填充(反位填充),从而恢复出原来的数据。

实际上,上述位填充、串行化、NRZI编码、采样等操作,由现成的USB芯片内部硬件实现,软件开发工程师只需要了解过程即可。

三、USB的软件描述

USB作为一个总线,仅负责提供通讯的渠道。而设备希望实现什么功能、需要主机提供哪种配合,这都依靠描述符来实现。描述符中记录了设备的类型、厂商ID、产品ID(加载驱动程序的依据)、端点情况、版本号等信息。

USB1.1协议定义的标准描述符有:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)及字符串描述符(String Descriptor)。

3.1 设备描述符

一个USB设备只能有一个设备描述符

设备描述符主要记录的信息有:设备的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)、产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。

3.2 配置描述符

配置描述符描述设备在不同场合下的不同形态。一个设备可以有多种配置,但某一时刻,只能有一个配置生效。

配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。

3.3 端点描述符

端点是USB设备控制的最小单位,而端点描述符负责描述的则是端点的相关信息。

端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。

3.4 接口描述符

在设备的某一配置下,会按功能将设备的端点分成一类或几类,这些类,就是接口接口描述符负责描述接口的相关信息

对于同一端点,在一个配置下,只能属于一个接口,但在不同配置下,可以属于不同接口。(类比于:人在特定的场合下,只有一种特定的身份。但换了一个场合,身份也可能会跟着改变)

接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。

3.5 字符串描述符

字符串描述符不是必须的。它主要提供一些方便人们阅读的信息。

四、USB的通讯传输

4.1 USB传输数据包

4.1.1 USB传输数据包概述

USB总线上,传输数据是以为基本单位的。数据包有很多种类型,实际通讯时,收发双方会根据当前传输的用途、阶段,选用合适的数据包。

USB传输数据包为分成几个不同的,不同类型的包,域的构成也不一样。

在所有类型的USB数据包中,存在一些共同的特点:都以同步域开始,而后紧跟着一个包标识符PID(Packet Identifier),最终以包结束符EOP(End Of Packet) 来结束:

名称作用数据形式备注
同步域① 通知串行接口引擎(SIE),数据即将开始传输;
② 同步主机、从机的数据时钟。
起始于一串数据0,在NRZI编码下,表现为一连串的电平变化。
包标识符标识数据包的类型。共有8位:前4位为有效数据位;后四位为前4位的取反,用于校验。① 令牌包;
② 数据包;
③ 握手包;
④ 特殊包
包结束符表示数据包结束的标志。由一定数据宽度的单端信号0(SE0:D+、D-同时为低电平)表示
4.1.2 令牌类数据包

令牌类数据包用来启动一次USB传输。

因为USB是主从结构的拓扑结构(所有数据传输都是由主机发起的,设备只能被动地接听数据),所以需要主机使用令牌包,来通知哪个设备进行响应、如何响应。

令牌类数据包有以下四种:

名称作用备注
输出(OUT)通知设备,将要输出一个数据包
输入(IN)通知设备,返回一个数据包
建立(SETUP)通知设备,将要输出一个数据包① 只用于控制传输;
② SETUP包后,只发送DATA0数据包,且只能发到设备的控制端点,设备必须接收
帧起始(SOF Start Of Frame)每帧(或微帧)开始时,以广播形式发送,所有全速、高速设备都可以接收到

令牌类数据包的构成如下:

  1. 输出(OUT)、输入(IN)、建立(SETUP)令牌包结构:

    名称同步域包标识符地址端点号CRC5校验EOP
    位数\8745\

    注意:CRC校验只校验包标识符(PID)之后的地址域和端点域,不包括包标识符(PID)。

  2. 帧起始(SOF)令牌包结构:

    名称同步域包标识符帧号CRC5校验EOP
    位数\8115\

    注意:CRC校验只校验包标识符(PID)之后的地址域和端点域,不包括包标识符(PID)。

4.1.3 数据类数据包

数据类数据包是用来传输数据的。

数据类数据包结构:

名称同步域包标识符字节0字节1……字节NCRC16校验EOP
位数\888……816\
4.1.4 握手类数据包

握手类数据包是用来表示一个传输是否被对方确认。

握手类数据包有以下四种:

名称意义备注
ACK正确接收数据,并且有足够的空间来容纳数据正常状态
NAK没有数据需要返回,或正确接收数据,但没有足够空间来容纳正常状态
STALL设备无法执行请求,或端点已经被挂起错误状态
NYET正确接收数据,但没有能力接收下一次传输正常状态,只在USB2.0的高速设备中使用

握手类数据包结构:

名称同步域包标识符EOP
位数\8\
4.1.5 特殊类数据包

特殊包是一些在特殊场合使用的包。

特殊包有以下四种:

名称意义备注
PRE令牌包,是通知集线器打开其低速端口的一种前导包只用于全速模式中
ERR握手包,在高速分裂事务中表示错误使用USB2.0协议新增
PING令牌包,结构与OUT令牌包一致,但后面并不跟随发送数据,用于试探设备是否有空间接收数据USB2.0协议新增,只用于高速环境的批量传输和控制传输的输出事务中
SPLIT令牌包,用于高速分裂事务中,通知集线器将高速数据包转化为全速或者低速数据包,发送给其下面的端口USB2.0协议新增

4.2 USB传输类型

4.2.1 USB事务

虽然USB定义了数据在总线上传输的基本单位是包,但不能随意地使用包来传输数据,必须按照一定的关系,把这些把不同的包组织成事务,才能进行传输。

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

  1. 令牌包用来启动一个事务,总是由主机发送;
  2. 数据包传送数据,可以从主机到设备,也可以从设备到主机,方向由令牌包来指定;
  3. 握手包的发送者通常为数据接收者,当数据接收正确后,发送握手包,设备也可以使用NAK握手包来表示数据还未准备好。

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

4.2.2 批量传输

批量传输通常用于数据量大、对数据的实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等。批量传输没有规定数据包中数据的意义和结构,具体的数据结构要由设备自己定义。

批量传输使用批量事务(bulk transaction)传输数据。一次批量事务有三个阶段:令牌包阶段、数据包阶段和握手包阶段,每个阶段都是一个独立的数据包。批量传输分为批量读批量写,批量读使用批量输入事务,批量写使用批量输出事务(读\输入、写\输出是以主机为参考的)

主机 设备 OUT令牌包(包含设备地址、端点号等信息) DATA包 切换至接收模式, 等待设备返回握手包 若令牌、数据包无误, 且有足够保存数据的缓冲区 ACK握手包或NYET握手包 若令牌、数据包无误, 但没有足够保存数据的缓冲区 NAK握手包 若令牌、数据包无误, 但端点处于挂起状态 STALL握手包 若令牌、数据包错误 (不做任何响应,让主机等待超时) 主机 设备 批量输出事务
主机 设备 IN令牌包(包含设备地址、端点号等信息) 切换至接收模式, 等待设备返回数据 若令牌包无误, 且确实有数据返回 DATA包 若令牌包无误, 但没有数据返回 NAK握手包 若令牌包无误, 但端点处于挂起状态 STALL握手包 若令牌包错误 (不做任何响应,让主机等待超时) 若数据包无误 ACK握手包 若数据错误 (不做任何响应,让设备等待超时) 主机 设备 批量输入事务
4.2.3 中断传输

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

中断传输通常用于数据量不大,但对时间要求较严格的设备中,例如人机接口设备(HID)中的鼠标、键盘、轨迹球等。中断传输也可以用来不断地检测某个状态,但条件满足后,再使用批量传输来传送大量的数据

除了对端点的查询策略不一样以外,在传输结构上,中断传输和批量传输基本是一样的,但中断传输没有PING和NYET两种包,且中断传输使用的是中断事务(interrupt transaction)

4.2.4 等时传输(同步传输)

等时传输的侧重点在于实时性,而不需保证数据的100%正确,当数据错误时,不进行重传操作。因此等时传输没有应答包。数据是否正确,可以由数据包的CRC校验来确定。出错后的数据如何处理,则由主机或设备的应用软件来决定。

等时传输用在数据量大、对实时性要求高的场合,例如音频设备、视频设备等。

等时传输使用等时事务(isochronous transaction) 来传输数据。

主机 设备 OUT令牌包(包含设备地址、端点号等信息) DATA包 主机 设备 等时输出事务
主机 设备 IN令牌包(包含设备地址、端点号等信息) 切换至接收模式, 等待设备返回数据 若令牌包无误, 且确实有数据返回 DATA包 若令牌包无误, 但没有数据返回 NAK握手包 若令牌包无误, 但端点处于挂起状态 STALL握手包 若令牌包错误 (不做任何响应,让主机等待超时) 主机 设备 等时输入事务
4.2.5 控制传输

控制传输主要用于设备枚举过程中,各种描述符的获取、设置地址、设置配置等场合,需要切实保证传输过程中的数据完整性。控制传输由三个连续的过程构成:建立过程、数据过程(可选)、状态过程

  1. 建立过程使用一个建立事务。建立事务是一个输出数据的过程,与输出事务相比,区别如下:
    ① 令牌包使用SETUP令牌包;
    ② 令牌包后只能跟随DATA0数据包;
    ③ 数据包后,设备只能回复ACK(正常时)或不回复(错误时),而不能使用NAK和STALL。
  2. 数据过程是一个可选的过程,控制传输中可以没有该过程。如果有数据过程,则过程中包含一个或多个数据事务:
    ① 所有数据事务的传输方向必须相同,若中途发生了改变,就会被认为进入了状态过程;
    ② 控制传输数据过程,使用的数据事务,与批量传输中的批量事务是一样的;
    ③ 数据过程的第一个数据包必须是DATA1包,之后每正确传输一次,就在DATA0、DATA1之间,轮流改变数据包的类型,再传输。
  3. 状态过程的传输方向与数据过程相反,且只使用DATA1包。

4.3 USB端点类型

端点0,每个USB设备都必须具备的默认控制端点,它一上电就存在且可用。设备的各种描述符以及主机发送的一些命令,都是通过端点0传输的。

其它端点(非0端点),可选,需要根据具体的设备来决定,只有Set Config之后才能使用。通常把工作在XX模式下的端点,称为XX端点,如控制端点、批量端点等。

4.4 USB端点支持的最大传输包长

每个端点描述符都规定了端点所支持的最大数据包长,主机每次发送数据包,都不能超过端点的最大包长。

传输类型低速模式最大包长全速模式最大包长高速模式最大包长
批量传输(不支持)8\16\32\64字节512字节
中断传输8字节64字节1024字节
等时传输(不支持)1023字节1024字节
控制传输8字节64字节8\16\32\64字节
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值