从零开始学USB(十二、USB包的分类和具体格式)

时间:2024-03-14 17:15:24

前面章节学习了USB的包的简要结构组成。本节从四种分类上来学习一下他们的使用场景。

从零开始学USB(十二、USB包的分类和具体格式)

 

一、令牌包

令牌由PID组成,指定IN,OUT或SETUP数据包类型以及ADDR和ENDP字段。 PING特殊令牌包也具有与令牌包相同的字段。对于OUT和SETUP事务,地址和端点字段唯一识别将接收后续数据包的端点。对于IN事务,这些字段唯一地标识哪个端点应该传输数据包。对PING事务,这些字段唯一地标识哪个端点将使用握手数据包进行响应。只有主机才能发出令牌包。

  • 一个IN PID定义从设备到主机的数据事务。
  • OUT和SETUP PID定义从主机到设备的数据事务。
  • PING PID定义从函数到主机的握手事务。
  • 建立(SETUP)令牌包:只用在控制传输中,和输出令牌包作用一样,也是通知设备将要输出一个数据包,两者区别在于:SETUP令牌包后只使用DATA0数据包,且只能发送到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制。

从零开始学USB(十二、USB包的分类和具体格式)

令牌包具有五位CRC,覆盖地址和端点字段,如上所示。 CRC不包括PID,它有自己的检查字段(高低四位补码)。 在三个字节的分组字段数据之后,令牌和SOF分组由EOP分隔。 如果数据包解码为其他有效令牌或SOF,但在三个字节后不以EOP终止,则必须将其视为无效并由接收方忽略。

即IN OUT SETUP (PING)这三个令牌包的地址字段都是设备地址+端点地址的形式组成。

而SOF令牌包是把这 11bit的字段合成了一个frame帧号字段(时间戳)。

 

拆分事务特殊令牌数据包USB为拆分事务定义了一个特殊令牌:SPLIT。 与其他普通3字节令牌包相比,这是一个4字节令牌包。 拆分事务令牌包提供额外的事务类型以及附加的事务特定信息。 拆分事务令牌用于支持主机控制器与高速运行的集线器之间的分离事务,其中全速/低速设备与其下游的一些端口进行通信。 定义了两个使用SPLIT特殊令牌的拆分事务:启动拆分事务(SSPLIT)和完全拆分事务(CSPLIT)。 SPLIT特殊标记中的字段指示特定的拆分事务。

1.1分离传输(Split Transactions)

当集线器连接有全速/低速设备时,仅在主机控制器和集线器之间使用高速拆分事务。此高速拆分事务用于通过集线器和某些全速/低速设备端点启动全速/低速事务。高速拆分事务还允许从集线器检索全速/低速事务的完成状态。这种方法允许主机控制器通过高速事务启动全速/低速事务,然后继续其他高速事务,而不必等待全速/低速事务继续/完成速度较慢。有关拆分事务的状态机和事务定义的更多详细信息,请参见第11章。(主要讲解HUB的组成和作用)

高速拆分事务有两部分:start-split和complete-split。 拆分事务仅定义为在主机控制器和集线器之间使用。 没有其他高速或全速/低速设备使用拆分事务。图8-6显示了组成通用启动拆分事务的数据包。 令牌阶段有两个数据包:SPLIT特殊令牌和全速/低速令牌。 根据数据传输的方向以及是否为事务类型定义了握手,令牌阶段可选地后跟数据包和握手包。 启动拆分事务可以包含2,3或4个数据包,具体取决于特定的传输类型和数据方向。

从零开始学USB(十二、USB包的分类和具体格式)

图8-7显示了组成通用完全拆分事务的数据包。 令牌阶段有两个数据包:SPLIT特殊令牌和全速/低速令牌。 根据数据传输方向和特定事务类型,数据或握手包在完全拆分中跟随令牌相位包。 完整的拆分事务可以包含2或3个数据包,具体由传输类型和数据方向决定。

从零开始学USB(十二、USB包的分类和具体格式)

拆分事务的结果由完全拆分事务返回。 图8-8显示了示例中断IN传输类型的概念“转换”。 主机向集线器发出启动拆分(用1表示),然后可以继续执行其他高速事务。 start-split导致集线器稍后发出全速/低速IN令牌(由2表示)。 设备使用数据包响应IN令牌(在此示例中),并且集线器通过与设备的握手进行响应。 最后,主机稍后发出完整拆分(由3表示)以检索设备提供的数据。请注意,在示例中,集线器在完成拆分之前向设备端点提供全速/低速握手(在此示例中为ACK),并且完全拆分未向集线器提供高速握手。

从零开始学USB(十二、USB包的分类和具体格式)

 

正常的全速/低速OUT事务同样在概念上“转换”为开始拆分和完全拆分事务。 图8-9显示了示例中断OUT传输类型的“转换”。 主机发出启动拆分事务,包括SSPLIT特殊令牌,OUT令牌和DATA数据包。 该集线器有时会在全速/低速总线上发出OUT令牌和DATA数据包。 设备通过握手进行响应。 稍后,主机发出完全拆分事务,并且集线器响应设备提供的结果(全速/低速数据或握手)。

从零开始学USB(十二、USB包的分类和具体格式)

接下来的两节描述了构成详细的开始和完整拆分令牌包的字段。 图8-10和图8-12显示了split-transaction令牌包中的字段。 SPLIT特殊标记遵循通用标记格式,并以PID字段(在SYNC之后)开始,以CRC5字段(和EOP)结束。 Start-split和complete-split令牌包都是4个字节长。 SPLIT交易必须仅来自主机。 start-split标记在第8.4.2.2节中定义,完整拆分标记在第8.4.2.3节中定义。

 

1.2 开始 - 拆分传输令牌(Start-Split Transaction Token)

从零开始学USB(十二、USB包的分类和具体格式)

 

  • Hub addr字段包含支持指定的全速/低速设备的集线器的USB设备地址,用于此全速/低速事务。
  • 将SC(开始/完成)字段设置为零的SPLIT特殊令牌包表示这是一个启动 - 拆分事务(SSPLIT)。
  • “端口”字段包含此全速/低速事务所针对的目标中心的端口号。 如图8-11所示,共有128个端口被指定为PORT <6:0>。 主机必须为单个和多个TT集线器实现正确设置端口字段。 单个TT集线器实现可以忽略端口字段。

从零开始学USB(十二、USB包的分类和具体格式)

  • S(速度)字段指定此中断或控制事务的速度,如下所示:
  1. 0  - 全速
  2. 1  - 低速
  • 对于批量IN / OUT和等时IN开始分割,S字段必须设置为零。 对于批量/控制IN / OUT,中断IN / OUT和同步IN开始分离,E字段必须设置为零。
  • 对于全速等时OUT启动拆分,S1(启动)和E(结束)字段指定高速数据有效负载如何对应于全速数据包的数据,如表8-2所示。

从零开始学USB(十二、USB包的分类和具体格式)

等时OUT启动 - 拆分事物使用这些编码来允许集线器检测由于缺少具有需要多个启动拆分的数据有效负载的端点的接收启动 - 拆分事务而导致的各种错误情况。 例如,大的全速数据有效载荷可能需要三个开始 - 拆分事务:startsplit / begin,start-split / middle和start-split / end。 如果集线器未收到任何这些事务,它将忽略全速事务(如果未收到start-split / beginning),或者它将强制相应的全速事务发生错误(如果有 其他两笔交易未收到)。 通过在微帧期间不接收开始分割,可以检测其他错误条件。ET(端点类型)字段指定全速/低速事务的端点类型,如表8-3所示。

从零开始学USB(十二、USB包的分类和具体格式)

此字段告诉集线器将哪个拆分事务状态机用于此全速/低速事务。 全速/低速设备地址和端点号信息包含在SPLIT特殊令牌包之后的普通令牌包中。

1.3 完成拆分传输令牌(Complete-Split Transaction Token)

 

从零开始学USB(十二、USB包的分类和具体格式)

  • SC字段设置为1的SPLIT特殊令牌包表示这是一个完全拆分事务(CSPLIT)。
  • U位保留/未使用,必须复位为零(0B)。
  • 完全拆分令牌包的其他字段具有与开始拆分令牌包相同的定义。

1.4 帧起始数据包(Start-of-Frame Packets)

帧速率(SOF)数据包由主机以全速总线的标称速率每1.00 ms±0.0005 ms发出一次,对于高速总线则为125μs±0.0625μs。 SOF数据包由一个PID指示数据包类型,后跟一个11位帧号字段,如图8-13所示。

从零开始学USB(十二、USB包的分类和具体格式)
SOF令牌包括仅令牌事务,其以对应于每个帧的开始的精确定时间隔分配SOF标记和伴随帧号。 所有高速和全速功能(包括集线器)都接收SOF数据包。 SOF令牌不会导致任何接收函数生成返回数据包; 因此,无法保证向任何给定功能提供SOF。

SOF包提供两条定时信息。 当检测到SOF PID时,通知功能SOF已经发生。 帧定时敏感功能,不需要跟踪帧数(例如,全速运行集线器),只需解码SOF PID; 他们可以忽略框架号码及其CRC。 如果函数需要跟踪帧编号,它必须同时理解PID和时间戳。不特别需要总线定时信息的全速设备可以忽略SOF分组。

 

令牌包总结:

 

从零开始学USB(十二、USB包的分类和具体格式)

举例

从零开始学USB(十二、USB包的分类和具体格式)

从零开始学USB(十二、USB包的分类和具体格式)

从零开始学USB(十二、USB包的分类和具体格式)

 

 

从零开始学USB(十二、USB包的分类和具体格式)

举例:

从零开始学USB(十二、USB包的分类和具体格式)

 

 

二、数据包

数据包由PID,包含零个或多个字节数据的数据字段和CRC组成,如图8-15所示。 有四种类型的数据包,由不同的PID识别:DATA0,DATA1,DATA2和MDATA。 定义了两个数据包PID(DATA0和DATA1)以支持数据切换同步。 所有四个数据PID都用于高带宽高速等时端点的数据PID排序。 在拆分事务中使用三个数据PID(MDATA,DATA0,DATA1)。

从零开始学USB(十二、USB包的分类和具体格式)

数据必须始终以整数个字节发送。 数据CRC仅在数据包中的数据字段上计算,并且不包括PID,PID具有其自己的检查字段。低速设备允许的最大数据有效负载大小为8个字节。 全速设备的最大数据有效负载大小为1023.高速设备的最大数据有效负载大小为1024字节。

 

数据切换同步和重试:USB提供了一种保证数据发送器和数据之间数据序列同步的机制跨多个交易的接收者。这种机制提供了一种保证握手的方法交换阶段由发送器和接收器正确解释。该机制提供了一种保证发送器和接收器正确解释事务的握手阶段的方法。通过使用DATA0和DATA1 PID以及数据发送器和接收器的单独数据切换序列位来实现同步。仅当接收器能够接收数据并接收具有正确数据PID的无差错数据包时,接收器序列位才会切换。仅当数据发送器接收到有效的ACK握手时,发送器序列位才会切换。数据发送器和接收器必须在事务开始时使其序列位同步。使用的同步机制因事务类型而异。 等时传输不支持数据切换同步。有些情况使用状态机以更紧凑的形式描述了数据切换同步。 它不使用显式标识DATA0和DATA1,而是使用值“DATAx”来表示DATA0 / DATA1 PID中的任何一个/两个。 在特定数据PID很重要的某些情况下,使用标记为“x”的另一个变量,其中DATA0的值为0,DATA1的值为1。高速,高带宽等时和中断端点支持类似但不同的数据同步技术,称为数据PID排序。 使用该技术代替数据切换同步。

 

三、握手包

握手数据包,如图8-16所示,仅由PID组成。 握手包用于报告数据事务的状态,并且可以返回指示成功接收数据,命令接受或拒绝,流控制和停止条件的值。 只有支持流控制的事务类型才能返回握手。 握手总是在事务的握手阶段返回,并且可以在数据阶段返回而不是数据。 在一个字节的分组字段之后,握手分组由EOP分隔。 如果数据包解码为有效的握手但在一个字节后不以EOP终止,则必须将其视为无效并由接收器忽略。

从零开始学USB(十二、USB包的分类和具体格式)

握手包有四种类型,一种是特殊的握手包:

  • ACK表示在数据字段上没有比特填充或CRC错误的情况下接收到数据包,并且正确接收了数据PID。 当序列位匹配且接收器可以接受数据或者序列位不匹配且发送器和接收器必须彼此重新同步时,可以发出ACK。 ACK握手仅适用于已发送数据的事务以及预期握手的事务。 主机可以为IN事务返回ACK,也可以通过OUT,SETUP或PING事务的函数返回ACK。
  • NAK表示函数无法接受来自主机(OUT)的数据,或者函数没有数据要传输到主机(IN)。 NAK只能由IN事务的数据阶段或OUT或PING事务的握手阶段中的函数返回。 主持人永远不会发出NAK。 NAK用于流量控制目的,以指示功能暂时无法传输或接收数据,但最终能够在不需要主机干预的情况下执行此操作。
  • STALL由函数返回,以响应IN令牌或在OUT的数据阶段之后或响应PING事务。 STALL表示函数无法传输或接收数据,或者不支持控制管道请求。 返回STALL(对于除默认端点之外的任何端点)后的函数状态是未定义的。 在任何情况下都不允许主机返回STALL。 STALL握手由设备在两种不同的场合之一使用。 第一种情况称为“功能停顿”,即设置与端点关联的暂停功能。功能失速的特殊情况是“命令“当主机明确设置端点的暂停功能时发生命令停顿。一旦功能的端点停止,该功能必须继续返回STALL,直到通过主机干预清除导致暂停的条件。第二种情况称为“协议停顿”,详见第8.5.3节。 协议停顿对于控制管道是唯一的。 协议停顿与意义和持续时间中的功能停顿不同。 在控制传输的数据或状态阶段期间返回协议STALL,并且STALL条件在下一个控制传输(Setup)开始时终止。 本节的其余部分涉及功能失速的一般情况。
  • NYET是一种高速握手,在两种情况下返回。 它由高速端点返回。 当全速/低速交易尚未完成或者集线器无法处理拆分交易时,NYET也可以由集线器返回以响应拆分事务。 
  • ERR是仅返回高速的握手,允许高速集线器报告全速/低速总线上的错误。 它仅作为拆分事务协议的一部分由高速集线器返回。

 

如下图,数据包后面就跟随有握手包。同时也可以看到数据包没出错,是在正常翻转的。

从零开始学USB(十二、USB包的分类和具体格式)

 

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    原文链接:https://blog.csdn.net/qq_16777851/article/details/85385889