USB包类型和传输过程
USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同时在USB中数据时低字节先发送的即LSB。USB中的数据交互最小单位是包一个包由许多域组成,但是统一的是每个包都有同步域开始,然后紧接着PID,这里的PID不是指PID,而是指类似包命令码这么一个意思。PID只用到了低四位,高四位是低四位的取反用于校验PID字段,常见的PID由USB标准中查到如下,其中*号标识的是USB1.1中没有的:
有表中可以看到USB包分为16种四类,现在先以令牌包的格式介绍包格式。记住一个概念,USB中主机占主导地位,因此输入输出都是在主机角度来说的。
令牌包:
输出(OUT),输入(IN),建立令牌包(SETUP)包结构:
同步域 | 8位包标识PID | 7位地址 | 4位端点号 | 5位CRC5校验 | EOP |
SOF同步包,这个包是主机和所有从设备之间同步的特殊包,因此它是广播的,结构也就比较特殊。
同步域 | 8位标识PID | 11位帧号 | 5位CRC5校验 | EOP |
数据包:
数据包都具有同样的结构,一个同步域后面直接跟PID加上数据,最后是CRC校验,同样所有的CRC校验都是从PID字节之后的部分,最后是包结束符EOP。
同步域 | 8位包标识PID | 字节0 | 字节1 | ...... | 16位CRC16校验 | EOP |
主机和设备之间会维护一个数据包类型切换机制用于错误恢复。假如主机发送数据给设备,但是设备的ACK包在传输中被破坏了,所以主机就不知道对方是否收到了数据,主机就会保持自己的数据包类型不变,但是如果下一次设备使用数据包类型和自己不同给自己发数据了,主机就知道上一次丢失ACK那次的传输实际上是成功的。反之就是失败了。
握手包:
ACK :用来确认数据接收正确,这一部分常常有USB物理层自动完成;
NCK:表示没有数据返回,常常是主机查询设备有无数据返回时由设备返回,主机不允许使用NCK应答(猜猜为什么);
STALL:设备无法执行一个请求,或者是端点已经挂起了时,设备会返回STALL;这种情况下需要主机干预才能解除STALL状态。
NYET:只在USB2.0高速事物中使用,表示本次数据接收成功,但是没有足够的空间来接收下一数据,下一次数据传输前主机需要先发送PING探查设备状态,确认可以接收数据。
特殊包:
特殊包是在一些特殊场合使用的包,主要有三个:ERR,SPLIT、PING。
PING:用在高速设备中,主机询问设备是否可以接收数据,设备如果有足够的空间接收数据则会用ACK握手包回应主机。
PRE:只用在高速模式中,作为前导包通知集线器打开,低速端口,因为集线器在平常情况下,防止高速信号导致低速设备误动作,集线器是没有将高速信号传递给速速设备的。
ERR:用在高速事物中的SPLIT令牌包分裂错误指示。
USB定义了这么多的数据包,但是还是不能直接用这些包就开始数据传输了,这里是USB的一个概念,USB的数据交换都是主机首先发起的,所以的引入了USB事物的概念。USB事物通常都是有两个或者三个数据包组成的。令牌包有主机发送启动一个事物,然后主机发送数据包,最后由设备ACK应答。由此USB定义了四种传输类型,每种类型里包含多种USB事务。
批量传输类型
批量输出事务:首先主机发送OUT包告诉设备,我将要输出数据到你,同时在OUT包中指示了设备地址和端口号,然后接着在总线上发送数据包,设备的对应端点会接收下数据包,如果校验完CRC没有问题,则设备会用握手包ACK回应主机,如果数据出错设备什么都不会发送,主机就会自动超时。这里出错主要有两种情况,一种是令牌包出错,另一种情况时数据包出错。
批量输入事务:主机发送IN输入数据包到设备,如果设备有数据要发送就会将数据放到总线上,主机接收数据检验无错误就回应ACK给设备;如果设备无数据或挂起就会用NCK或者STALL回应主机。
PING:是在高速模式里才有的,没有数据过程,主机发送,从机可以接收数据就用ACK回应,否则回应对应的拒绝代码或不回应(令牌包错)。
中断传输类型
中断传输类型,除了数据输入的查询策略,和没有PING事物以外其他的全部同批量事物。常用在数据量不大,但是对时间要求严格的设备中。如人机接口设备的键盘鼠标。
等时传输类型
适用于数据量大,对实时性要求高,但是对数据的正确性要求不是也别严格的场合。因此常用于音频等类似设备中。事物流程图如下:
控制传输类型
控制传输类型是所有里面最复杂额,因为他为了保证数据的传输正确性,同时还是一个综合的过程。控制传输主要有三个过程组成建立过程,数据过程,状态过程。
建立过程:使用建立事物,主机发送SETUP令牌包,然后发送主机数据(DATA0)到设备,设备接收到数据并且回应ACK(必须的)后开始处理。(实际上是一个批量输出的过程)
数据过程(可选):如果上面的建立过程有数据要设备返回设备此时就会将数据在这个过程返回给主机。这个过程可能包含多次数据输入传输,有主机根据控制协议决定。数据过程实际是批量数据输入/出的过程。
状态过程:
实际还是一个批量事物,它的传输方向同数据过程相反,是一个数据为0的批量事物。也可以理解,控制事物实际是批量过程的一个更高层次的应用。因为控制传输过程中的每一次数据传输都是一个批量传输的过程。
控制过程例子:
建立过程 主机 --->设备 OUT + DATA 设备 --->主机 ACK 数据过程(可能有多次,但方向一定是同样的) 主句 --->设备 IN 设备 --->主机 DATA 主机 --->设备 ACK 状态过程 主机 --->设备 OUT(因为上面是IN) 设备 --->主机 DATA 主机 --->设备 ACK
完了结束。
以上内容就是USB协议的全部概念的东西和通信过程,目前的理解,如果不对欢迎大佬纠正。
今天就这样了
参考:《圈圈教你玩USB(第二版)》
2019-06-03 21:16:32