USB2.0学习(1)
目录
1 数据包结构
1.2 包的基本格式
1.3 数据包类型
1.3.1 令牌包
1.3.2 数据包
1.3.3 握手包
2 传输类型
2.1 批量传输
2.2 控制传输
2.3 中断传输
2.4 同步传输
1 数据包结构
数据包:SYNC+DATA+EOP
SYNC:同步域
EOP:数据包的结束
1.2 包的基本格式
同步字段(SYNC) | PID字段 | 数据字段 | CRC字段 | 包结尾字段(EOP) |
1.3 数据包类型
1.3.1 令牌包
一个令牌包由 PID、 ADDR、 ENDP 与 CRC5 四个域组成。其中 PID 部分为 8 比特,高四比特由低四比特取反得到, PID 域指明了令牌包的类型,令牌包主要可分为IN,OUT,SETUP 以及 PING 四种类型。如表1所示。
表 1 令牌包类型
名称 | PID[3:0] | 说明 |
OUT | 0001b | 表明一次由主机到设备的信息流开始,地址+端点 |
IN | 1001b | 表明一次由设备到主机的信息流开始,地址+端点 |
SOF | 0101b | 帧开端与帧数目 |
SETUP | 1101b | 用于传送主机的配置设备的信息,地址+端点 |
ADDR 与 ENDP 两个域的长度分别为 7 比特与 4 比特,在处理一次 OUT 事务和 SETUP 事务时,这两个域的信息分别代表了将会接收的数据包的地址和端点。令牌包拥有一个长度为 5 比特的 CRC 字段,该 CRC 域由 ADDR 与 ENDP 两个部分计算得到,因此只可以校验 ADDR 与
ENDP 两个域信息的正确性,而 PID 部分依靠自校验来确保信息的准确。
特别指出的是,根据 USB 2.0 协议规定,令牌包只可以有主机发起,设备不能够
发送该种类型的数据包。
1.3.2 数据包
数据包由数据、 PID 以及 CRC 三个域组成。其中 PID 依然为 8 比特长度,依据PID 的不同,数据包可分为四种类型: DATA0、 DATA1、 DATA2 与 MDATA。
表2 数据包类型
类型 | PID[3:0] | 说明 |
DATA0 | 0011b | 偶数据包 |
DATA1 | 1011b | 奇数据包 |
DATA2 | 0111b | 高速同步事务专用数据包 |
MDATA | 1111b | 用于高速同步事务与SPLIT事务 |
数据域的长度视发送的数据长度而定,为 0~1023 个字节。最后为 CRC16 域, 长度为 16 比特,通过数据域部分计算得到,只能够校验数据部分的正确性。
1.3.3 握手包
握手包只包含了一个 8 比特长的 PID 域。握手包用来向 USB 主机或者 USB 设备传递数据包的处理结果,例如数据的成功接收,命令是否被执行等,同样的,根据 PID域的值不同可分为 4 种类型: ACK,NAK,STALL 和 NYET。
表3 握手包类型
类型 | PID[3:0] | 说明 |
ACK | 0010b | 接收成功 |
NAK | 1010b | 接收方或者发送方不能发送或接受数据 |
STALL | 1110b | 用于数据传输的端点被停止同时连接的管道也停止工作 |
NYET | 0110b | 表示接收方将无任何响应 |
2 传输类型
主要有四种,控制传输,同步传输,中断传输,批量传输。
对于IN事务,握手阶段,主机只能回复ACK,或者不做回复。
图1 USB传输示意图
2.1 批量传输
批处理传输通常包含令牌、数据和握手三个阶段。 在传输出错的情况下,数据阶段会被取消而直接由令牌阶段进入到握手阶段。
首先是令牌阶段,在该阶段, USB 主机通过判断将要处理的事务类型来有选择的向 USB 设备发送 IN、 OUT 或者 PING 三种令牌包中的的一个, IN 令牌包表明接下来数据的流向是由设备到主机的, 此时主机在接收数据; OUT 令牌包则代表数据流由主机至设备, 此时主机将要发送数据。如果令牌阶段发送的各种令牌包没有被设备正确的接收到或者接受过程中出现任何错误,将会直接越过接下来的数据阶段进入握手阶段。
当主机要接收数据时,会首先发出 IN 令牌包, 如果设备能够正确的接收该数据包并通过校验,将返回相应的数据包给主机。如果设备由于种种原因不能返回相应的数据包,则会以 NAK 或者 STALL 握手包作为回复。 如果设备回复 NAK 包,意味着该设备不能回复信息;如果该设备回复 STALL 包,则意味着传输端点永久性的被停止。 如果上述过程均正确无误, USB 主机会向设备发送 ACK 握手包说明这次传输正确的完成。
当主机准备发送数据时,将会依次发出 OUT 令牌包和数据包,该数据包可能是DATA0、 DATA1、 DATA2、 MDATA 中的一种[21]。 当上述所有数据包均被设备成功接收,将向 USB 主机返回一个 ACK 握手包; 如果接收不成功时,要视原因而决定返回何种类型的握手包, 如果 USB 设备暂时不能接收数据, 将返回 NAK 握手包,主机收到该包后,将会重新尝试发送这个事务中的 OUT 令牌包与数据包。如果 USB 主机收到 STALL 包, 表示 USB 设备负责这次通信的端点已经被停止,表明设备出现错误, 主机将不会重试该 OUT 事务。 如果 USB 设备在接收到令牌包或者数据包后发现其有错误,将会直接丢弃,并不做任何回复,主机在未收到任何数据包时,将会重试这个失败的事务,并且不会超过 3 次。 特别的, 当设备为高速 USB 设备时,在没有足够的内存下会回复 NYET 握手包, 主机会由 OUT 事务转入处理 PING 事务,并开始一系列 PING 事务的处理流程。
图2 批量传输过程
2.2 控制传输
当 USB 设备与主机首次连接时,控制传输数据被 USB 主机系统软件用来进行USB 设备的配置工作。在进行数据通信时,控制传输使用的管道为双向管道, 该管道在被确定为将要使用的数据通路后,将会把 USB 设备的两个端点用于连接,一个为输入端点,而另一个为输出端点。
控制传输由建立阶段、数据阶段和状态阶段组成。 其中数据阶段的存在会依据传输的实际情况而定。
令牌阶段的数据流方向为从 USB 主机至 USB 设备, USB 主机会在这个阶段向设备发送一个 SETUP 令牌包用于建立主机与设备之间的数据通路。针对该令牌包,USB 设备不会做任何回复,如果其校验错误,将会被 USB 设备直接丢弃。在完成设备的配置工作后,将进入实际数据的传输过程。在该阶段内,可以由一个或多个相同的 IN 或者 OUT 事务组成,即所有数据的流向必须保持一致。在完成数据的发送或者接收后, USB 主机会进入握手阶段,用来回复这次 USB 传输的状态。
控制传输使用的端点决定了该端点所能够从总线接收或者发送的信息的大小。对于全速设备来说,控制传输所能够传输的数据的大小为 8,16,32 或者 32 个字节;而对高速设备和低速设备来说,分别是是 64 字节和 8 个字节。上述所有大小的数据包都跟在一个 SETUP 数据包的后面发送。设备端点在实际传输数据负载时,必须不能够超过所规定的最大的数据长度。当控制传输数据的大小超过了当前建立的管道的数据承载量,这些数据会被分为几个不同的部分传输,而其中每个部分都需要达到最大的长度。
在建立阶段里, USB 主机将向 USB 设备发送相关请求信息,由一个 SETUP 事务组成,主机会向设备发送 SETUP 令牌包,如果该令牌包有错误, USB 设备将会直接丢弃并且不会做任何回复;如果该令牌包正确,那么将会继续接受其后发来的数据包 DATA0,并向主机返回 ACK 握手包。特别的, USB 设备永远不能在一个 SETUP事务中对主机回复 STALL 握手包和 NAK 握手包。
图3 控制传输过程
2.3 中断传输
中断传输也是由三个阶段构成,即令牌、数据与握手阶段。当主机要发送数据时,表明要处理一次 OUT 事务,首先主机会向设备发送 OUT 令牌包,不论设备是否接收到该令牌包,都会在数据阶段发送一笔数据,该数据包的类型可能为 DATA0 与DATA1 中的一种,进入数据阶段后,根据设备接收数据的情况,会向主机回复 NYET、ACK、 NAK 与 STALL 中的一种,如果数据包接收错误,设备会直接丢弃。当主机要接收数据时,表明要开始处理一次 IN 事务,首先主机会向设备发送 IN令牌包,当数据通路建立好后,设备会向主机回复需要的数据包。如果在上一阶段接收握手包失败, USB 设备将会分别返还 NAK 或者 STALL 型数据包来告知设备状态。
图3 中断传输过程
2.4 同步传输
同步传输只包含两个阶段:令牌阶段和数据阶段, 由于实时性的需要, 握手阶段被取消。同中断传输类似, 数据流的方向同样是双向的,即主机同样可以通过该种传输方式完成收发数据。当 USB 主机要接收数据, 将会开始处理一次 IN 事务,进入令牌阶段后,主机首先向设备发出 IN 令牌包, 如果该令牌包能够成功的被设备接收并校验无误, 设备将会向主机返回所需要的数据包, 如果该数据包确实为主机所期望得到的,主机会直接接收,否则丢弃,不论是否与期望一致,主机都不会进入握手阶段向设备返回握手包告知传输状态。 如果是 OUT 事务,则表明 USB 主机要发送数据,主机会先后发送 OUT 令牌包以及对应的数据包 DATAx,同样的 USB 设备只有在该数据包正确时才会直接接收,否则将丢弃,并且在两个情况下,都不会向 USB 主机回复任何的握手包。在一个全速同步传输中, USB 设备和主机只能发出 DATA0 型数据包,而可以接收 DATA0 和 DATA1 型数据包;对于高速同步传输而言, USB 设备和主机则可以接收和发送全部四种类型的数据包。
图4 同步传输过程
参考:
[1] USB2.0协议原理解析_哔哩哔哩_bilibili.
[2] 基于AMBA总线的USB2.0设备控制器的设计与验证_张昊.中国知网.2017.