USB之(二)通讯协议

时间:2023-02-20 19:59:20

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

 

USB之(二)通讯协议

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设备到主机。

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等设备。