一、 USB2.0通信协议简介
1. 包(Package)
包是USB传输的基本单元,USB协议规定了三种类型的包:令牌(Token)包、数据(DATAx)包、握手(Ack)包。其中,令牌包只能是从主机发出。数据包和握手包可由主机发出,也可是设备发出。
包由各个不同的域组成,所有的包都以同步域SYNC开始,以包结束信号EOP作为结束。包的结构如下:
SYNC |
…… |
…… |
…… |
EOP |
不同类型的包,组成位域是不相同的,主要有这几个域:
(1) 包标识符(PID)
包标识符主要表明当前的包是属于哪种类型的包。包标识符总共有8个位,其中USB协议使用的只有4个位[3:0],另外的4个位[7:4]是对应的前面的4个位的取反。各种类型包的PID位域以及说明如下表:
包类型 |
包名称 |
PID[7:4][3:0] |
说明 |
令牌包
|
OUT |
1110 0001 |
由主机发出,通知设备将要输出数据 |
IN |
0110 1001 |
由主机发出,通知设备将要输入数据 |
|
SOF |
1010 0101 |
通知设备,这是一个帧起始包 |
|
SETUP |
0010 1101 |
通知设备将要开始一个控制传输 |
|
数据包 |
DATA0 |
1100 0011 |
数据过程的数据包,USB1.1协议规定只有两种类型的数据包:DATA0和DATA1包;在USB2.0中新增了DATA2和MDATA包,DATA2用于高速带宽同步传输。 |
DATA1 |
0100 1011 |
||
DATA2 |
1000 0111 |
||
MDATA |
0000 1111 |
||
握手包 |
ACK |
1101 0010 |
确认,数据被正确接收 |
NCK |
0101 1010 |
不确认,因某些原因导致数据无法接收,比如:内存空间不足 |
|
STALL |
0001 1110 |
设备不支持主机的某种请求,或者端点被挂起 |
|
NYET |
1001 0110 |
不懂什么意思[待解读] |
|
ERR |
0011 1100 |
只在split事务中使用,表示错误 |
|
特殊用途 包 |
PRE |
略 |
略 |
SPLIT |
略 |
略 |
|
PING |
略 |
略 |
说明:
①USB是串行总线(使用串行方式进行传输),数据是一位接着一位在总线上进行传输的,并且使用的是LSB在前的传输方式,也就是最低位先传输,接着是次低位,最后是最高位。以传输SETUP包的PID为例,总线上的数据应该是:1011 0010,所以使用协议分析仪抓到的数据就是0xB4。
②表格中列出的是常见的数据包,还有一些特殊用途包,没有做过多的学习。以及随着USB协议更新,可能还会有一些新的包类型,具体情况需要参考官方文档。
(2) 包目标地址(ADDR)
是主机分配给设备的一个非0地址。USB主机发送的包会在总线上进行广播,所有接在总线上的设备根据自己的设备地址对令牌包以及跟在令牌包后面的数据包进行过滤。包目标地址只有7个位(共2的7次方=128个地址),即地址范围是:0~127。0地址是主机分配地址给设备之前,设备的默认地址,除去0地址不算,设备的通信地址就是1~127。也就是说,一个USB主机最多只能管理127个USB设备(理论上,一个Host,最多能接入127个Device,再多接入一个,地址就重合了)。
(3) 包目标端点(ENDP)
USB设备和USB主机之间是通过端点来发送数据的。因此在总线上传输的每一个数据包都要指定,发送数据包的目标端点(数据包要发到哪一个设备的哪一个端点上)。
(4) 数据域
数据长度的范围:0~1024字节,不同的传输类型在不同模式下的数据域长度都不相同。该值与传输类型以及端点支持的最大包长、数据对象都有关系(比如主机请求获取不同的设备描述符,指定的长度是不同的)。
(5) 循环冗余校验码(CRC)
USB协议规定,只有令牌包和数据包有循环冗余校验码,令牌包使用5位的CRC5,数据包使用的是16位的CRC16校验。
1.1 令牌(Token Packet)包
令牌包是第一个数据包,表示一次传输即将开始。共有4种令牌包:SETUP令牌包、IN令牌包、OUT令牌包、SOF令牌包。其中SETUP、IN、OUT令牌包的结构是一样的,共有6个域,格式如下:
SYNC |
PID |
ADDR |
ENDP |
CRC5 |
EOP |
000000001 |
|
|
|
|
|
SETUP令牌包
SYNC |
SETUP |
ADDR |
ENDP |
CRC5 |
EOP |
00000001 |
0xB4 |
设备的地址(7位) |
端点号(4位) |
5位的CRC5校验 |
|
IN令牌包
SYNC |
SETUP |
ADDR |
ENDP |
CRC5 |
EOP |
00000001 |
0x96 |
设备的地址(7位) |
端点号(4位) |
5位的CRC5校验 |
|
OUT令牌包
SYNC |
SETUP |
ADDR |
ENDP |
CRC5 |
EOP |
00000001 |
0x87 |
设备的地址(7位) |
端点号(4位) |
5位的CRC5校验 |
|
SOF令牌包
帧起始包(Start Of Frame),在USB的拓扑结构中,主机每隔一段时间就向总线上广播SOF包,所有的连到总线上的全速设备和高速设备都能收到SOF包。
SOF令牌包结构相对其余的三个令牌包来说,有点特殊,只有5个域。
SYNC |
PID |
Frame# |
CRC5 |
EOP |
00000001 |
0XA5 |
11位的帧号 |
5位的CRC5校验 |
|
说明:
① 设备枚举阶段使用的是控制传输,控制传输的建立事务(建立过程)使用的是SETUP令牌包(只有控制传输才会有SETUP令牌包),设备的端点0是专门用于控制传输的,所以包目标端点ENDP为0,包目标地址ADDR可以是0或者非0值[1~127]。
② 设备使用地址0时,CRC5的值是0x08;设置地址阶段过后,CRC5的值根据具体的地址值来进行计算,CRC5的计算由USB控制器自动完成。
③ SETUP令牌包中包含了紧跟在其后面的数据包的目标地址和包目标端点信息。
④ 4个令牌包中,只有SOF令牌包之后不跟随数据传输。
⑤ 对于低速/全速设备,SYNC为:0000 0001;而对于高速设备,SYNC中有31个0,最后一个位是1。
1.2 数据(DATAx)包
USB1.1协议中,只有两种数据包:DATA0 和 DATA1。USB2.0新增了两个数据包:DATA2和MDATA分别用于高速分裂事务(split)事务和高速带宽同步传输中,DATA0和DATA1是需要关注的重点。
DATA0数据包结构(DATA0数据包的PID是0xc3):
SYNC |
DATA0 |
DATA |
CRC16 |
EOP |
00000001 |
0XC3 |
8字节的数据 |
xxx |
|
DATA1数据包结构(DATA1数据包的PID是0xd2):
SYNC |
DATA0 |
DATA |
CRC16 |
EOP |
00000001 |
0XD2 |
n字节的数据 |
xxx |
|
说明:
对于控制传输
① 建立事务的数据过程使用的是DATA0数据包(SETUP事务的数据过程只能使用DATA0),DATA0数据包是8字节的请求数据。
② IN事务或者OUT事务的数据过程使用的是DATA1数据包,是实际要交互的数据。
③ 端点0传输的数据包就在DATA0和DATA1之间进行切换,这是实现设备栈时,为什么配置USB控制芯片端点的toggle功能的原因。
④ 数据包是跟随在令牌包后面的,数据包传输的目标地址和端点信息已经在令牌中指明
1.3 握手(ACK)包
握手包只有三个域,结构如下:
SYNC |
ACK |
EOP |
00000001 |
0x4B |
|
说明:
① 握手包跟随在令牌包或者数据包之后,组成一次完整的事务。
② 握手包可以由设备发出也可以由主机发出。
③ 握手包的方向和数据包的方向是相反的。
2. 事务(Transaction)
一个事务通常由两个或者三个包来组成:令牌包+数据包+握手包
1)令牌包:启动一个事务,总是由主机发出。 2)数据包:用于传输数据,可以从主机发到设备,也可以从设备发到主机,数据包的方向由令牌包来指定。 3)握手包:握手包的发送者就是数据包的接收者。所以说,握手包的方向和数据包的方向是相反的。当数据被正确接收后,接收者就发出握手包。 |
2.1 事务的分类
事务总是以令牌包开始,所以令牌包的类型决定事务的类型, 因此事务可分为:SETUP事务、IN事务、OUT事务。
3. 传输(Transfer)
USB总共有四种传输类型:批量传输、中断传输、等时传输、控制传输。不同的传输类型都有各自的数据流模型。
在设备枚举阶段,设备的主机之间的数据交互使用的是控制传输,首先了解控制传输,对于其他类型的传输及其数据流模型,后面介绍不同的类设备开发的时候,再逐一研究。
3.1 控制传输
控制传输是四种传输类型中最复杂的一种,控制传输过程分为三个阶段:第一个阶段是建立阶段;第二个阶段是可选的数据阶段;第三个过程是状态阶段。这三个阶段也称为建立过程、数据过程、状态过程。
建立过程就是一个建立事务,事务里面的第一个包是SETUP令牌包,其次是DATA0数据包(8字节的请求数据),最后是握手包(只能是ACK握手包)。
数据阶段是可选的,也就是说控制传输可以没有数据过程(SETUP包的数据域会指定为0),数据过程又分为:控制读传输,数据事务是输入的;控制写传输,数据事务是输出的(读/写是相对主机来说的)。而且数据过程的第一个数据包必须是DATA1数据包。
4. 包、事务、传输三者之间的关系
包构成事务,事务构成传输。即一个传输由多个事务构成,一个事务又由多个包构成。
事务的类型由包的类型来决定,传输的类型就看具体实现功能时所用的传输。
4.1 关系图
以控制传输,主机请求设备的描述符数据为例,关系图如下:
说明:
① 控制传输一般用来实现一条USB协议定义的请求
② SETUP事务用来将一条请求命令发送到设备
③ IN事务用于USB设备向主机返回主机所请求的数据
④ OUT事务使用握手机制对之前的数据事务的正常结束进行确认
4.2 实例:Host请求设备描述符
5. 关于端点的类型
一个具体的端点,只能工作在某一种传输模式下,工作在什么模式下的端点就叫做什么端点,比如:控制端点、批量端点、中断端点、同步端点。
6. 传输类型与端点支持的最大包长
在端点描述符中设定了端点支持的最大包长,主机每次发送数据包都不能超过端点的最大包长。
1) 对于控制传输端点:低速模式最大包长固定为8字节;高速模式最大包长固定为64字节;全速模式可以在8、16、32、64字节中做选择。
2) 对于等时传输端点:全速模式最大包长上限为1023字节;高速模式最大包长上限为1024字节;低速模式不支持等时传输。
3) 对于中断传输端点:低速模式最大包长上限为8字节;全速模式最大包长上限为64字节;高速模式最大包长上限为1024字节。
4) 对于批量传输端点:高速模式最大包长固定为512字节;全速模式可以在8、16、32、64字节中做选择;低速模式不支持批量传输。
所以,在配置端点最大包长的时候,首先需要确认USB控制器工作在什么速度模式下(首先硬件支持,其次是程序软件设定),然后相应地设置最大包长。控制传输端点最大包长 ≤ 64 Byte;等时传输端点最大包长 ≤ 1024 Byte;中断传输端点最大包长 ≤ 1024 Byte;批量传输端点最大包长 ≤ 512 Byte;