0、基本概念
一个【传输】(控制、批量、中断、等时)由多个【事务】组成;一个【事务】(IN、OUT、SETUP)由一个或多个【Packet】组成。
包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。
USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。
1、包
包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。包只能在帧内传输。高速USB总线的帧周期为125us,全速以及低速 USB 总线的帧周期为1ms。帧的起始由一个特定的包(SOF 包)表示,帧尾为 EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。
注意:虽然高速USB总线和全速/低速USB总线的帧周期不一样,但是SOF包中帧编号的增加速度是一样的,因为在高速USB系统中,SOF包中帧编号实际上取得是计数器的高11位,最低三位作为微帧编号没有使用,因此其帧编号的增加周期也为 1mS。
USB包由五部分组成,同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP)。包的基本格式如下所示:
SYNC |
PID |
DATA |
CRC |
EOP |
1.1 同步字段(SYNC)
由8位/32位组成,作为每个数据包的前导,用来产生同步作用,使USB设备与总线的包传输率同步,它的数值固定为000000001。Full/low-speed为8位,high-speed为32位。
1.2 标识符字段(PID)
用来表示数据封包的类型。PID中的校验字段是通过对类型字段的每个位求反码产生的,PID字段如下所示:
PID0 |
PID1 |
PID2 |
PID3 |
~PID0 |
~PID1 |
~PID2 |
~PID3 |
信息包的类型包括令牌、数据、握手和特殊四种类型。
封包类型 |
PID名称 |
PID编码 |
意义 |
令牌 |
OUT |
0001B |
从主机到设备的数据传输 |
IN |
1001B |
从设备到主机的数据传输 |
|
SOF |
0101B |
帧的起始标记与帧码 |
|
SETUP |
1101B |
从主机到设备,表示要进行控制传输 |
|
数据 |
DATA0 |
0011B |
偶数数据封包 |
DATA1 |
1011B |
奇数数据封包 |
|
DATA2 |
0111B |
High-speed, high bandwidth isochronous transaction in a microframe数据包 |
|
MDATA |
1111B |
High-speed for split and high bandwidth isochronous transaction 数据包 |
|
握手 |
ACK |
0010B |
接收器收到无错误的数据封包 |
NAK |
1010B |
接收器无法接收数据或发射器无法送出数据 |
|
STALL |
1110B |
端点产生停滞的状况 |
|
NYET |
0110B |
接收器无响应 |
|
特殊 |
PRE |
1100B |
使能下游端口的USB总线的数据传输切换到低速的设备 |
ERR |
1100B |
Split transaction error handshake |
|
SPLIT |
1000B |
High-speed split transaction token |
|
PING |
0100B |
High-speed flow control probe for a bulk/control endpoint |
|
Reserved |
0000B |
|
1.3 数据字段(DATA)
用来携带主机与设备之间要传递的信息,其内容和长度根据PID、传输类型的不同而各不相同。在USB包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。在总线传输中,总是先传输字节的最低位,最后传输字节的最高位。
ADDR设备地址数据域
ADDR数据域由7位组成,可用来寻址多达127个外围设备。
ENDP端点数据域
ENDP数据域由4位组成,通过这4个位最多可寻址出32个端点。这个ENDP数据域仅用在IN、OUT与SETUP令牌信息包中。对于慢速设备可支持端点0以及端点1作为中断传输模式,而全速设备则可以拥有16个输入端点(IN)与16个输出端点(OUT)共32个端点。
Frame Number
当USB令牌包的PID为SOF时,其数据字段必须为11位的帧序列号。帧序列号由主机产生,且每个数据帧自动加一,最大数值为0x7FF。当帧序列号达到最大数时将自动从0开始循环。
DATA
它仅存于DATA信息包中,根据不同的传输类型,拥有不同的字节大小,从0到1023字节(同步传输)。
1.4 循环冗余校验字段(CRC)
根据不同的信息包类型,CRC数据域由不同数目的位所组成。其中重要的数据信息包采用CRC16的数据域(16位),而其余的信息包类型则采用CRC5的数据域(5位)。
1.5 包结尾字段(EOP)
发送方在包的结尾发出包结尾信号。USB主机根据EOP判断数据包的结束。
2、信息包格式
2.1 令牌(token)包
在USB系统中,只有主机才能发出令牌包。令牌包定义了数据传输的类型,它是事务处理的第一阶段。令牌包中较为重要的是SETUP、IN和OUT三个令牌包。它们用来在根集线器和设备端点之间建立数据传输。一个IN包用来建立一个从设备到根集线器的数据传送,一个OUT包用来建立从根集线器到设备的数据传输。令牌包格式如下:
8位 |
8位 |
7位 |
4位 |
5位 |
|
SYNC |
PID |
~PID |
ADDR |
ENDP |
CRC5 |
2.2 Start-of-Frame(SOF)包
SOF包由Host发送给Device。
1) 对于full-speed总线,每隔1.00 ms ±0.0005 ms发送一次;
2) 对于high-speed总线,每隔125 μs ±0.0625 μs发送一次;
SOF包构成如下图所示:
8位 |
11位 |
5位 |
PID |
Frame Number |
CRC5 |
2.3 数据(data)包
数据包有4个域。DATA数据域的长度根据USB设备的传输速度及传输类型而定,须以8字节为基本单位,若传输的数据不足8字节,或传输到最后所剩余的不足8字节,仍需传输8字节的数据域。格式如下:
8位 |
8位 |
0~1023位 |
16位 |
|
SYNC |
PID |
~PID |
DATA |
CRC16 |
2.4 握手(handshake)包
握手包是最简单的信息包类型,握手包中仅包含一个PID数据域,格式如下:
8位 |
8位 |
|
SYNC |
PID |
~PID |
3、事务
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)。事务处理的类型包括输入(IN)事务处理、输出(OUT)事务处理、设置(SETUP)事务处理和帧开始、帧结尾等类型。在输出OUT和设置SETUP事务处理中,紧接着OUT和SETUP包后的是DATA包,DATA0和DATA1包是交替地发送的,在DATA包后面,设备将回应一个握手信号,如果设备可以接收数据,就回应ACK包,如果设备忙,就回应NAK包,如果设备出错,则回应STALL包。在IN事务中,IN包后面是设备发来的DATA包或NAK包或STALL包。若设备忙或出错,则发NAK包或STALL包给主机,若设备数据准备好发送,则发DATA包,DATA0和DATA1包也是交替地发送的,紧接着DATA包后面是主机发给设备的握手包,ACK表示主机可以接收数据,NAK包表示主机忙,STALL包代表主机出错。
3.1 输入(IN)事务处理
输入事务处理表示USB主机从总线上的某个USB设备接收一个数据包的过程。
(1)正常的输入事务处理
主机->设备 |
令牌信息包 |
SYNC |
IN |
ADDR |
ENDP |
CRC5 |
设备->主机 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
主机->设备 |
握手信息包 |
SYNC |
ACK |
|
(2)设备忙时的输入事务处理
主机->设备 |
令牌信息包 |
SYNC |
IN |
ADDR |
ENDP |
CRC5 |
设备->主机 |
握手信息包 |
SYNC |
NAK |
|
(3)设备出错时的输入事务处理
主机->设备 |
令牌信息包 |
SYNC |
IN |
ADDR |
ENDP |
CRC5 |
设备->主机 |
握手信息包 |
SYNC |
STALL |
|
3.2 输出(OUT)事务处理
(1)正常的输出事务处理
主机->设备 |
令牌信息包 |
SYNC |
OUT |
ADDR |
ENDP |
CRC5 |
主机->设备 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
设备->主机 |
握手信息包 |
SYNC |
ACK |
|
(2)设备忙时的输出事务处理
主机->设备 |
令牌信息包 |
SYNC |
OUT |
ADDR |
ENDP |
CRC5 |
主机->设备 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
设备->主机 |
握手信息包 |
SYNC |
NAK |
|
(3)设备出错时的输出事务处理
主机->设备 |
令牌信息包 |
SYNC |
OUT |
ADDR |
ENDP |
CRC5 |
主机->设备 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
设备->主机 |
握手信息包 |
SYNC |
STALL |
|
3.3 设置(SETUP)事务处理
(1)正常的设置事务处理
主机->设备 |
令牌信息包 |
SYNC |
SETUP |
ADDR |
ENDP |
CRC5 |
主机->设备 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
设备->主机 |
握手信息包 |
SYNC |
ACK |
|
(2)设备忙时的设置事务处理
主机->设备 |
令牌信息包 |
SYNC |
SETUP |
ADDR |
ENDP |
CRC5 |
主机->设备 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
设备->主机 |
握手信息包 |
SYNC |
NAK |
|
(3)设备出错时的设置事务处理
主机->设备 |
令牌信息包 |
SYNC |
SETUP |
ADDR |
ENDP |
CRC5 |
主机->设备 |
数据信息包 |
SYNC |
DATA0 |
DATA |
CRC16 |
|
设备->主机 |
握手信息包 |
SYNC |
STALL |
|
4、USB传输类型
在USB的传输中,制定了4种传输类型:控制传输、中断传输、批量传输以及同步传输。控制传输类型分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)以及状态阶段。根据数据阶段的数据传输方向,控制传输又可以分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。
4.1 控制传输
控制传输是USB传输中最重要的传输。控制传输类型分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)、确认阶段。
阶段一:设置阶段
都是由USB主机发起,主机从USB设备获取配置信息,并设置设备的配置值。
设置阶段的数据交换包包含了SETUP令牌包、DATA0数据包以及ACK握手包
阶段二:数据传输阶段
数据传输阶段用来传输主机与设备之间的数据。根据数据传输的方向,分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。
控制读取是将数据从设备读到主机上,读取的数据是USB设备描述度。首先,主机发送一个IN令牌信息包,然后设备将数据通过DATA1数据信息包回给主机,最后主机以下列方式响应:当数据正确接收时,主机送出ACK握手信息包;当主机忙碌时,发出NAK握手信息包;当发生错误时,主机发出STALL握手信息包。
控制写入是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息。对每一个数据信息包而言,主机将会送出一个OUT令牌信息包表示信息要送出去。接着主机将数据通过DATA0数据信息包传递至设备。最后设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK握手信息包;当设备忙碌时,设备发出NAK握手信息包;当发生错误时,设备发出STALL握手信息包。
阶段三:确认阶段
确认阶段用来表示整个传输过程已完全结束。
确认阶段传输的方向必须与数据阶段的方向相反,即原来是IN令牌包,这个阶段应该是OUT令牌包;反之原来是OUT令牌包,这个阶段应为IN令牌包。对于控制读取而言,主机会送出OUT包,其后跟着0长度的DATA1包,此时设备也会做出相应的动作,送ACK、NAK、STALL握手包。相对地对于控制写入传输,主机会送出IN令牌包,然后设备送出表示完成状态阶段的0长度DATA1包,主机再做出相对应的动作:送ACK、NAK、STALL握手包。
4.2 中断传输(Interrupt Transfer)
中断传输由IN或OUT事务组成。
中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。
同样中断传输也采用PID翻转的机制来保证收发端数据同步。下图为中断传输的流程图。DATA0或DATA1中的包含的是中断信息,而不是中断数据。
中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机。
4.3 批量传输(Bulk Transfer)
用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等。批量传输是可靠的传输,它通过在硬件级执行“错误检测”和“重传”来确保host与device之间“准确无误”地传输数据,需要握手包来表明传输的结果。
若数据量比较大,将采用多次批量事务传输来完成全部数据的传输
翻转同步:发送端按照DATA0-DATA1-DATA0-…的顺序发送数据包,只有成功的事务传输才会导致PID 翻转,也就是说发送端只有在接收到 ACK 后才会翻转 PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到的数据包不是按照此顺序翻转的,比如连续收到两个 DATA0,那么接收端认为第二个 DATA0 是前一个 DATA0 的重传。
USB 允许连续 3次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST认为该端点功能错误(STALL),放弃该端点的传输任务。
它由三种包组成(即IN事务或OUT事务):token、data、handshake
4.3.1 IN事务
ACK: 表示host正确无误地接收到数据
NAK: 指示设备暂时不能返回或接收数据(如:设备忙)
STALL:指示设备永远停止,需要host软件的干预 (如:设备出错)
4.3.2 OUT事务
ACK: Device已经正确无误地接收到数据包,且通知Host可以按顺序发送下一个数据包
NAK: 如果接收到的数据包有误,如:CRC错误,Device不发送任何handshake包,且通知Host重传数据,由于Device临时状况(如buffer满)
STALL: 指示Device endpoint已经停止,且通知Host不再重传
4.3.3 Bulk读写序列
Bulk Write |
OUT(0) DATA0 |
OUT(1) DATA1 |
…… |
OUT(N) DATA0/1 |
Bulk Read |
IN(0) DATA0 |
IN(1) DATA1 |
…… |
IN(N) DATA0/1 |
4.4 同步传输(IsochronousTransf er)
同步传输只需令牌Token与数据Data两个信息包阶段。同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。
同步传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。同步传输一般用于麦克风、喇叭、UVC Camera等设备。