https://blog.csdn.net/wwt18811707971/article/details/77447492 USB总线专题(二)——数据传输及协议 https://blog.csdn.net/myarrow/article/details/8270029 USB枚举过程 http://www.cnblogs.com/sheshiji/p/3590203.html USB概述及协议基础 http://www.cnblogs.com/leon19870907/archive/2011/09/23/2186291.html USB协议基本知识
1 USB协议传输结构
集合关系:传输类型 -> 事务 -> 包 -> 域
传输类型: 控制、中断、同步、批量 事务: IN、OUT、SETUP 包: 令牌包、数据包、握手包 域: 同步序列域、包标识域、地址域、端点域、帧号域、数据域、CRC校验域
注: 1、 USB基本数据结构是包,而包由不同的域构成,而不同的包又组成不同的传输类型。 2、 USB总线发送是LSB在前,MSB最后。
1.1
1.1.1
位于一个包的最开始处,8bit,固定0000 0001
1.1.2
在同步域之后,标明包类型。8bit,LSB四位为标识码,MSB四位为标识码的反码。类型见下图。 USB 协议1 .1 中, 定义了10 种不同类型的包。USB 协议2 .0 中则定义了全部16 种标识域。如下图所示,标橙色为2.0所有。
1.1.3
由主机分配唯一地址,7bit,由于地址0保留用作初始化,因此地址最多有127个,也是usb结构中最大127个设备的原因。
1.1.4
4bit,端点0必须作为控制端点,端点可被定义为IN、SETUP、OUT、PING端点,所有设备必须支持端点0作为默认的控制管道。低速设备最大支持3个管道,1个0端点和2个其他端点(可以是都是控制,一个控制一个中断也可以是两个中断)。高速全速支持最大16个输入输出管道。
1.1.5
11bit,每个帧都有一个特定帧号,帧号域最大容量为0x7FF
1.1.6
在不同的传输类型中,数据域的长度不同(0到1024Byte),但是必须为整数个字节的长度。
1.1.7
对令牌包和数据包中非PID域进行校验,令牌包使用CRC5(5bit),数据包使用CRC16(16bit)。
1.2
包( Packet )是最基本的USB 的数据单元, 由一系列的域组成。如前PID域所述, USB 中定义了4 种类型的包, 即令牌包、数据包、握手包和特殊包。 包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。
1.2.1
IN、OUT、SETUP包结构是一样的,如下图 帧起始包机构,如下图 - frame:全速设备一帧1.00 ms ±0.0005 ms - microframe:高速设备一帧125 μs ±0.0625 μs。 帧的起始由一个特定的包(SOF 包)表示,所有高速和全速还有hub都会收到SOF包,但是不会引起任何作用
split传输特殊令牌包(Split Token)
在主机控制器和 HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分为start-split transaction (SSPLIT)和complete-split transaction (CSPLIT)。具体可看USB2.0协议8.4.2。
1.2.2
USB 发送数据包的时候, 如果一次发送数据长度大于端点容量时候, 就要把数据分成几个包, 分批发送。如果第一个数据包被确定为DATA0 , 那么第二个发送的数据包就应该是DATA1⋯⋯如此交替下去。而数据的接收方在接收数据时检查其类型是否是DA TA0、DATA1 交替的, 这是保证数据交换正确的机制之一。 但是当处于同步传输中,所有的数据包都是DATA0。 所有的四个数据包用于高带宽高速同步端点,三个数据包(MDATA DATA0,DATA1)用于split事务传输。 所有数据包都是整数发送,CRC校验不包括PID域。允许数据包最大大小为低速8Byte,全速1023Byte,高速1024Byte。
1.2.3
ACK
标识域PID 被正确接收; 并且没有发生数据位错误; 没有发生数据域的CRC 校验错误等。 一般由接收到数据的一方发出,主机和设备都可以发送 ACK。
NACK
在接到主机发来的OU T 命令后, 设备无法接收数据; 接到主机的IN 命令, 但是设备没有数据发送给主机。 NAK 只能由设备发送, 而不能由主机发送。
STALL
设备无法发送数据; 设备无法接收数据; 不支持某一种控制管道的命令 STALL 也只能是由设备来发送,NAK 是USB 的一种暂时状态, 当设备处于“ 忙”的工作状态时, 就会发送NAK。等到设备处于空闲状态。这时, 如果主机再要求设备发送或接收数据时, 设备不再返回NAK, 而是进行正常的数据传输。而STALL 与NAK 不同, STALL所表示的传送失败的意义更加严重。当在控制传输中出现STALL 后, 主机就会丢弃所有发给设备的控制命令, 而且要重新进行控制传输后, 才能停止STALL 状态。
NYET
ERR
1.3
事务分为IN,OUT,SETUP3个事务。每个事务由令牌包,数据包,握手包3个阶段构成。事务3个阶段如下: 1)令牌包阶段:启动一个输入,输出或设置的事务。 2)数据包阶段:按输入,输出发送相应的数据。 3)握手包阶段:返回数据接收情况,在同步传输的IN事务和OUT事务中没有这个阶段。
1.3.1 事务的3种类型
令牌包阶段 –主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据。 数据包阶段 –设备根据情况会做出3种反应: a. 设备端点正常,设备往主机内发出数据,DATA0和DATA1交替发送。 b. 设备正在繁忙,无法往主机发出数据包,此时发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续。 c. 相应设备端点被禁止,此时发送STALL错误包,事务提前结束,总线进入空闲状态。 握手包阶段 –主机在正确接收到数据后,就会向设备发送ACK包。
令牌包阶段 –主机发送一个PID为OUT的输出包给设备,通知设备要接收主机数据。 数据包阶段 –主机交替发送数据DATA0和DATA1。 握手包阶段 –设备根据情况做出3种反应: a. 设备端点接收正确,设备向主机返回ACK包,通知主机可以发送新的数据,如果数据包发送了CRC校验数据,将不返回任何握手信息。 b. 设备正在忙碌,无法从主机接收数据包就发送NAK无效包,通知主机再次发送数据。 c. 相应设备端点被禁止,发送错误STALL包,事务提前结束,总线直接进入空闲状态。
令牌包阶段 –主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据。 数据包阶段 –主机设备发送数据,注意这里只有一个固定为8个字节的DATA0包,其中就是标准的USB设备请求指令。 握手包阶段 –设备接收到主机的命令信息后,返回ACK包,此后总线进入空闲状态,并准备下一个传输。一般来说,在SETUP事务后面通常是一个IN或OUT事务构成的传输。
1.4
USB 定义了4 种数据传输的类型:控制传输、中断传输、批量传输和同步传输。任何一种传输都是由上面的3 种事务所组成的,传输类型由一笔或者多笔事务完成。 USB 把事务分为IN、OU T 和SET UP 3 种类型, 但在每一种传输类型中, 这些相同事务结果并不是完全一样。比如,同步传输IN 事务和中断传输IN事务就有差别。
1.4.1
由IN 事务或OU T 事务构成 翻转同步:发送端按DATA0-DATA1-DATA0-…顺序发送数据包,只有成功的事务传输才会导致 PID 翻转,发送端只有在接收到 ACK 后才会翻转 PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到到的数据包不是按照此顺序翻转的,比如连续收到两个 DATA0,那么接收端认为第二个 DATA0 是前一个 DATA0 的重传。 没有固定传输速率,不占固定带宽 PING事务是USB2.0高速模式特有的,全速模式和低速模式没有 全速和高速设备支持批量传输, 而低速设备不支持
数据包大小
数据包大小可设定为8、16、32、64字节,高速设备必须设定为512字节除了最后一个包
1.4.2
中断传输(Inte r rupt T ransfer)
IN 事务或OU T 事务组成。 除了不支持PING之外与批量传输一致 主机根据中断端点描述符指定查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。 没有固定传输速率,不占固定带宽 全速设备可选轮询周期是1~255 ms , 低速设备轮询周期10~255 ms
数据包大小
低速设备数据包大学1-8字节,全速1-64字节,高速1-1024字节
1.4.3
同步传输(Isochronous Transfer)
只有IN和OUT事务 没有握手包,总线优先保证占用带宽 只使用DATA0 数据包大小全速1-1023字节,高速1024字节 低速设备不支持 全速设备的同步传输, 在1 个帧内, 可以包含1 笔IN 事务或OUT 事务, 而高速设备可以包含3 笔事务。总线将会优先保证同步传输的带宽, 甚至会因此而暂时中止批量传输的进行。
数据包大小
全速设备数据包的大小为0~1 023 字节, 而高速设备为1 024 字节
1.4.4
结构
(1)初始设置阶段
上图可知,初始设置阶段也分为 令牌包阶段: 主机发送SETUP令牌包。 数据包阶段: 主机发送固定为8 个字节的DATA0 包, 并且有确定的结构, 将这8 个字节分配给5 种命令信息, 即bmRequestType、bRequest、wValue、wIndex 和wLength。具体看标准命令
(2)可选数据阶段
如果在上一步骤中的命令要求读/ 写数据的话, 就由这一步骤来具体交换数据。如果没有数据交换要求的, 这个步骤就可以省去。(由SETUP事务的数据包阶段发送的标准请求命令决定),当一个数据包阶段发送不了时候,就分多个数据包发送。 根据数据阶段的数据传输的方向,控制传输又可分为3种类型: 1) 控制读取(读取USB描述符) 2) 控制写入(配置USB设备) 3) 无数据控制
(3)状态信息阶段
获取状态信息,由IN或OUT事务构成的传输 传输方向相反,这里IN表示向设备里面传送数据,OUT表示数据向主机里送数据,这是为了和可选数据阶段向结合。 数据包都是0长度
数据包大小
初始设置中, 1 个固定为8 字节大小的DATA0 包。可选数据步骤中, 低速设备,则数据包为8 字节; 全速设备数据包大小可以是8、16、32 和64 字节; 高速设备的数据包大小必须为64 字节。
2 数据流模型
2.1
设备硬件上具有一定大小的数据缓冲区 有惟一的地址和端点号 端点0是设备的默认控制端点 端点描述符中规定了端点所能支持的最大包长。 控制传输 :高速模式的最大包长固定为64个字节;全速模式可在8、16、32、64字节中选择;低速模式的最大包长固定为8个字节。 批量传输 :高速模式固定为512个字节;全速模式最大包长可在8、16、32、64字节中选择;低速模式不支持批量传输。 同步传输 :高速模式的最大包长上限为1024个字节;全速模式的最大包长上限为1023个字节;低速模式不支持同步传输。 中断传输 :告诉模式的最大包长上限为1024个字节;全速模式最大包长上限为64个字节;低速模式最大最大包长上限为8个字节。
2.2
管道就是主机与设备端点之间逻辑上的的连接 管道的概念主要用于PC 上驱动程序和用户程序的编写
2.3
完整的数据传输过程: PC 上, 设备驱动程序通过调用USB 驱动程序接口USBD( USB Drive r Inter face) , 发出输入输出请求包IRP; 在USB 驱动程序接到请求之后, 调用主控制器驱动程序接口HCD( Host Cont roller Drive r Inte rface ) , 将IRP 转化为USB的传输。一个IRP 可以包含一个或多个USB 传输; 接着, 主控制器驱动程序将USB 传输分解为总线事务, 主控制器以包的形式发送给设备。这里各种驱动程序和IRP的概念, 都是基于PC 和其操作系统的, 当在设计嵌入式USB 主机的时候, 完全可以摆脱这种框架 , 而仅以最简单的能够实现USB 各种类传输为目标即可。