目录
Ⅰ USB总线接口
1 USB接口标准
2 USB总线信号
3 USB数据编解码和位填充
4 USB拓扑结构
5 USB逻辑部件
Ⅱ USB设备
1 USB设备供电方式
2 USB设备插入检测机制
3 USB设备状态
4 USB设备枚举过程
5 USB描述符
Ⅲ USB传输
1 USB传输格式
2 包packet
3 事务transaction
4 传输transfer
USB是通用串行总线(Universal Serial Bus)的缩写。在USB1.0和USB1.1版本中,只支持1.5Mb/s的低速(low-speed)模式和12Mb/s的全速(full-speed)模式,在USB2.0中,又加入了480Mb/s的高速模式。
ⅠUSB总线接口
1 USB接口标准
标准的USB连接器有A型、B型和Mini B型,每个型号又分为插头和插座。
2 USB总线信号
USB使用差分传输模式,两根数据线D+和D-。
差分信号1:D+>2.8V,D-<0.3V;
差分信号0:D->2.8V,D+<0.3V。
- J状态和K状态
低速下:D+为“0”,D-为“1”是为“J”状态,“K”状态相反;
全速下:D+为“1”,D-为“0”是为“J”状态,“K”状态相反;
高速同全速。 - SE0状态
D+为“0”,D-为“0” - IDLE状态
低速下空闲状态为“K”状态;
全速下空闲状态为“J”状态;
高速下空闲状态为“SE0”状态。
针对全速模式,有以下几个重要信号:
- Reset信号
主机在要和设备通信之前会发送Reset信号来把设备配置到默认的未配置状态。即SE0状态保持10ms。 - Resume信号
20ms的K状态+低速EOP - Suspend信号
3ms以上的J状态 - SOP信号
从IDLE状态切换到K状态 - EOP信号
持续2位时间的SE0信号,后跟随1位时间的J状态 - SYNC信号
3个重复的K、J状态切换,后跟随2位时间的K状态
3 USB数据编解码和位填充
USB采用NRZI(非归零编码)对发送的数据包进行编码。即:
输入数据0,编码成“电平翻转”;输入数据1,编码成“电平不变”
位填充是为了保证发送的数据序列中有足够多的电平变化。填充的对象时输入数据,即先填充后编码。数据流中每6个连续的“1”,就要插入1个“0”。
接收方解码NRZI码流,然后识别出填充位,并丢弃它们。
4 USB拓扑结构
USB是一种主从结构的系统,主机叫做Host,从机叫做Device。Device包括USB function和USB HUB。
USB总线基于分层的星状拓扑结构,以HUB为中心,连接周围设备。总线上最多可连接127个设备。Hub串联数量最多5个。
5 USB逻辑部件
Ⅱ USB设备
1 USB设备供电方式
USB设备有两种供电方式:
1)自供电设备:设备从外部电源获取工作电压
2)总线供电设备: 设备从VBUS(5v)取点
对总线供电设备,区分低功耗和高功耗USB设备。
低功耗设备是最大功耗不超过100mA。
高功耗设备是枚举时最大功耗不超过100mA,枚举完成配置结束后功耗不超过500mA。
设备在枚举工程中,通过配置描述符来向主机报告它的供电方式和功耗要求的。
2 USB设备插入检测机制
没有设备连上主机时,主机的D+和D-都在低电平(SE0状态),当SE0状态 持续一段时间了,就被主机认为是断开状态。
当设备连上主机时,主机检测到某一数据线电平拉高并持续一段时间,就认为有设备连上来了。主机必须在复位设备前,立即采样总线状态来判断设备的速度。
3 USB设备状态
USB设备有插入、供电、初始化、分配地址、配置和挂起六中状态,其状态转移图如下。
4 USB设备枚举过程
对应USB设备的状态,host对USB设备会有以下活动:
在枚举过程中,都是使用控制传输。
- 复位阶段
USB主机检测到USB设备插入后,就会对设备复位。USB设备在总线复位后其地址为0,这样主机就可以通过地址0和那些刚刚插入的设备通信。USB主机往地址为0的设备的端点0发送获取设备描述符的标准请求。设备会将设备描述符返回给主机,主机在成功获取到数据包后,就会返回一个确认数据包给设备,从而进入接下来的分配地址阶段。 - 分配地址阶段
主机对设备又一次复位,就进入到分配地址阶段。主机往地址为0的设备的端点0发送一个设置地址的请求,新的设备地址就包含在建立过程的数据包中。具体的地址由主机负责管理,主机会分配一个唯一的地址给刚接入的设备。设备在收到这个建立过程后,就会进入到状态过程。设备等待主机请求状态返回,收到状态请求后,设备就返回0长度的状态数据包。如果主机确认该状态包已经正确收到,就会发送应答包ACK给设备,设备在收到这个ACK之后,就要启用新的设备地址了。这样设备就分配到了一个唯一的设备地址。 - 获取描述符阶段
获取描述符可以形象地表述如下:
Host:你是什么设备?
Device:12 01 0100....Device Descriptor
Host:你有几种功能?
Device:09 02 09....Configuration Descriptor
Host:每个功能有几个接口?
Device:09 04 00....Interface Descriptor
Host:每个接口使用哪几个端点?
Device:06 05 82....Endpoint Descriptor
Host:好了,我知道你是谁了,开始传输设备吧!
Device:OK,Read Go!
5 USB描述符
USB描述符有以下11类:
每种描述符的第一个字节描述该描述符包含的字节数目,第二个节描述该描述的类型。
-
Device Descriptor
-
Configuration Descriptor
-
Interface Descriptor
-
Endpoint Descriptor
-
String Descriptor
Ⅲ USB传输
1 USB传输格式
USB总线上传输数据是以包(packet)为基本单位的,必须把不同的包组织成事务(transaction)才能传输数据。
USB协议规定了四种传输(transfer)类型:批量传输、同步传输、中断传输和控制传输。其中,批量传输、同步传输和中断传输每传输一次数据都是一个事务,控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
2 包packet
一个包被分为不同域,根据不同类型的包,所包含的域是不一样的。但都要以同步域SYNC开始,紧跟一个包标识符PID,最终以包结束符EOP来结束这个包。
-
PID域
PID是用来标识一个包的类型的。它共有8位,只使用4位(PID0PID3),另外4位是PID0PID3的取反,用来校验PID。
PID规定了四类包:令牌包、数据包、握手包和特殊包。同类的包又各分为具体的四种包。
仅在帧首传输一次SOF包。 -
地址域
地址共占11位,其中低7位是设备地址,高4位是端点地址。
帧号域
帧号占11位,主机每发出一个帧,帧号都会自加1,当帧号达到0x7FF时,将归零重新开始计数。-
数据域
根据传输类型的不同,数据域的数据长度从0到1024字节不等。
-
CRC域
A. 令牌包
令牌包有四种:
- OUT: 通知设备将要输出一个数据包
- IN: 通知设备返回一个数据包
- SETUP: 只用在控制传输中,也是通知设备将要输出一个数据包,与OUT令牌的区别是:只使用DATA0数据包,且只能发到device的控制端点
- SOF: 在每帧开始时以广播的形式发送,针对USB全速设备,主机每1ms产生一个帧,USB主机会对当前帧号进行统计,每次帧开始时通过SOF包发送帧号。
OUT/IN/SETUP令牌包没有帧号域和数据域。
SOF令牌包没有地址域和数据域。
B.数据包
数据包没有地址域和帧号域。根据transfer的类型不同,数据包最大长度有所不同。
C.握手包
握手包有四种可选:
- ACK: 传输正确完成
- NAK: 设备暂时没有准备好接收数据,或没有准备好发送数据
- STALL: 设备不能用于传输
- NYET/ERR: 仅用于高速传输,设备没有准备好或出错
握手包仅有PID域。
3 事务transaction
事务可以分成三类
- setup事务:主机用来向设备发送控制命令
- 数据输入事务:主机用来从设备读取数据
- 数据输出事务:主机用来向设备发送数据
事务组成:Token packet + Data packet + 可选的Handshake packet
4 传输transfer
USB协议定义了四种传输类型:控制传输(Control transfer)、大容量数据传输(Bulk transfer)、同步传输(Isochronous transfer)和中断传输(Interrupt transfer)。
传输类型 | 特点 | 应用场景 |
---|---|---|
控制传输 | 非周期性,突发 | 命令和状态的传输 |
大容量传输 | 非周期性,突发 | 数据可以占用任意带宽,容忍延迟 |
同步传输 | 周期性 | 持续性传输,传输与时效相关的信息,并且在数据中保存时间戳的信息 |
同步传输 | 周期性,低频率 | 允许有延迟的通信 |
A.大容量传输 bulk transfer
图中一个方框表示一个 Packet,灰色的包表示主机发出的包,白色的包表示Device 发出的包。批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID 按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。
一次批量传输( Transfer)由 1 次到多次批量事务传输( Transaction)组成。
B.中断传输 interrupt transfer
中断传输在流程上除不支持 PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
这里所说的中断,跟硬件上的中断是不一样的,它不是由设备主动发出一个中断请求,而是由主机保证在不大于某个时间间隔内安排一次传输。
主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。
C.同步传输 Isochronous transfer
同步传输是不可靠的传输,所以它没有握手包,也不支持 PID 翻转。主机在排定事务传输时,同步传输有最高的优先级。
D.控制传输 Control transfer
一次控制传输分为三(或两个)个阶段:建立( Setup)、 数据( DATA)(可能没有)以及状态( Status)。 每个阶段都由一次或多次事务传输组成。
- 建立过程 setup stage
使用一个建立事务,如下:
- 数据过程 data stage
数据过程是可选的。一个数据过程包含一笔或者多笔数据事务。数据过程的第一个数据包必须是DATA1包,然后每次正确传输一个数据包就在DATA0和DATA1之间交替。 - 状态过程 status stage
状态过程也是一笔批量事务。状态过程只使用DATA1包。
设备枚举过程中各种描述符的获取以及设置地址和设置配置等,都是通过控制传输来实现的。
参考资料
- USB开发者论坛