NEWS

首页   /   新闻资讯

NEWS

首页   /   新闻资讯

USB协议层

发布时间:2022/3/1

USB协议层

这章从字段(Field)和包(Packet)的定义开始,从底向上地展示USBUniveral Serial Bus)协议。接着是对不同事务(Transaction)类型的包事务格式的描述。然后是链路层(Link layer)流程控制(Flow Control)和事务级别的故障恢复(Fault recovery)。本章的最后将讨论复执同步化(Retry synchronization),超时干扰(Babble)和总线活动丧失(Loss of bus activity)的恢复。

 

8.1 位定序

数据位被发送到总线的时候,首先最低有效位(LSb),跟着是下一个最低有效位,最后是最高有效位(MSb)。在以后图表中的,包以下列形式给出,即包中单个的位和字段从左到右的顺序就是它们通过总线的顺序。

 

8.2同步字段

所有的包都从同步(SYNC)字段开始的,同步字段是产生最大的边缘转换密度(Edge TransitionDensity)的编码序列。同步字段作为空闲状态出现在总线上,后面跟着以NRZI编码的二进制串“KJKJKJKK”。通过被定义为8位长的二进制串,输入电路以本地时钟对齐输入数据。同步字段是用于同步的机制,在以后图表当中将不被表示(参照节7.1.10)。同步字段里的最后的2位是同步字段结束的记号,并且标志了包标识符(PID,Packet Identifer)的开始

 

8.3包字段格式

在后面几节将描述标记,数据和握手包的字段格式。包中位的定义是以未编码的数据格式给出。为了清楚起见,在此不考虑NRZI编码和位填充(Bit Stuffing)的影响。所有的包都分别有包开始(Start-of-Packet)和包结束(End-of-Packet)分隔符。包开始(SOP)分隔符是同步字段的一部分,而包结束(EOP)分隔符在第7章有所描述。

 

8.3.1包标识符字段

所有USB包的同步字段后都紧跟着包标识符(PID)。如图8-1所示,包标识符由4位的包类型字段和其后的4位的校验字段构成。包标识符指出了包的类型,并由此隐含地指出了包的格式和包上所用错误检测的类型。包标识符的4位的校验字段可以保证包标识符译码的可靠性,这样包的余项也就能被正确地解释。包标识符的校验字段通过对包类型字段的二进制的求反码产生的。如果4 个PID检验位不是它们的各自的包标识符位的补,则说明存在PID错。


8-1 PID 格式

主机和所有功能部件都必须对得到全部PID字段实行完整的译码。任何收到包标识符,如果含有失败的校验字段,或者经译码得到未定义的值,则该包标识符被假定是被损坏的,而且包的余项将被包接收机忽略(Ignore)。如果一个功能部件(Function)收到了包含了它所不支持的事务类型或方向的合法包标识符,则不必应答。例如,只能输入的端口(IN-only Endpoint)必须忽略输出标记(Token)。表8-1列出了包标识符类型,编码及其描述。

 

 

8-1 PID 类型

PID 类型

PID

PID[3:0]

描述

标记

Token

输出(OUT

 

输入(IN

 

帧开始(SOF

 

建立(SETUP

0001B

 

1001B

 

0101B

 

1101B

在主机到功能部件的事务中有地址+端口号

 

在功能部件到主机的事务中有地址+端口号

 

帧开始标记和帧号

 

在主机到功能部件建立一个控制管道的事务中有地址+端口号

数据

DATA

数据0DATA0

 

数据1DATA1

0011B

 

1011B

偶数据包PID

 

奇数据包PID

握手(Handshake

确认(ACK

 

不确认(NAK

 

停止(STALL

0010B

 

1010B

 

1110B

接收器收到无措数据包;

 

接收设备部不能接收数据,或发送设备不能发送数据;

端口挂起,或一个控制管道请求不被支持。

专用

Special

前同步(PRE

1100B

主机发送的前同步字。打开到低速设备的下行总线通信。

 

*注解:PID位以最高位在前的顺序被表示。在USB上被发送的时候,最右的位(位0)将被第一个发出。

 

包标识符被分为4个编码组:标记,数据,握手和专用。包标识符传送的前2位(PID<0 1>)指出了其属于哪个组。这说明包标识符编码的分布。

 

8.3.2地址字段

功能部件端口使用2个字段:功能部件地址字段和端口字段。功能部件对地址和端口字段都需要进行译码。不允许使用地址或端口别名(Aliasing),并且任何一个字段不匹配,此标记都必须被忽略。另外, 对未初始化的端口的访问将使得标记被忽略。

 

8.3.2.1地址字段

功能部件地址(ADDR)字段通过其地址指定功能部件,至于是数据包的发出地还是目的地,则取决于标记PID的值。如图8-2所示,ADDR<6 0>指定了总共128个地址。地址字段被用于输入,建立和输出标记。由定义可知,每个ADDR值都定义了单一的功能部件。刚一复位(Reset)和加电(Power-up)的时候,功能部件的地址默认值为零,并且必须由主机在枚举过程(Enumeration Process)中编程。功能部件地址零被用作为缺省地址,不可被分配作任何别的用途。

8.3.2.2端口字段

如图8-3所示,附加的4位的端口(ENDP)字段在功能部件需要一个以上端口时候允许更灵活的寻址。除了端口地址0之外,端口个数是由功能部件决定的。端口字段只对输入,建立和输出标记PID有定义。所有的功能部件都必须在端口0提供一个控制管道(缺省控制管道)。对于低速(Low Speed)设备,每个功能部件最多提供3个管道:在端口0的控制管道加上2个附加管道(或是2个控制管道,或是1个控制管道和1个中断端口,或是2个中断端口)。全速(Full Speed)功能部件可以支持最多可达16个的任何类型的端口。

8.3.3帧号字段

帧号字段是一个11位的字段,主机每过一帧就将其内容加一。帧号字段达到其最大值7FFH时归零,且它仅每个帧最初时刻在SOF标记中被发送。

 

8.3.4数据字段

数据字段可以在01,023字节之间变动,但必须是整数个字节。图8-4为多字节显示格式。每个字节的范围内的数据位移出时都是最低位(LSb)在前。

循环冗余校验(CRC)被用来在标记和数据包中保护所有的非PID字段。在上下文中,这些字段被认为是保护字段。PID不在含有CRC的包的CRC校验范围内。在位填充之前,在发送器中所有的CRC都由它们的各自的字段产生。同样地,在填充位被去除之后,CRC在接收器中被译码。标记和数据包的CRC100 %判断单位错和双位错。失败的CRC指出了保护字段中至少有一个字段被损坏,并导致接收器忽略那些字段,且在大部分情况下忽略整个包。为了CRC的发生和校检,发生器和检验器里的移位寄存器置成为全1All-ones)型。对于每个被发送或者被收到的数据位,当前余项的最高一位和数据位进行异或(XOR),然后,余项是左移1位,并且,最低一位置零。如果异或的结果是1,余项和生成多项式作异或。当检查的字段的最后的一位被发送的时候,发生器里的CRC被颠倒,再以最高位(MSb)在前发给检验器。当检验器收到CRC的最后的一位,且不发生错误的时候,余项将等于多项式的的剩余。如果剩余与包接收器中最后计算出的检验和余项(Checksum remainder)不匹配,则存在CRC误差。对于CRC,必须满足位填充的要求,且如果前6位都是1的话,这包括在CRC的最后插入零,。

ACK表示数据包没有位填充或数据字段上的CRC错,并且数据PID被正确收到。ACK在下列的情况下被发放,当时序位(Sequence Bit)匹配且接收器能接受数据的时候,或者当时序位失配,但发送方和接收器互相之间必须再同步(Resynchronize)(在第8.6节详细提到)的时候。ACK握手信号只适用于数据被传送且期待握手信号的事务中。对于输入事务,ACK由主机返回,而对于输出或建立事务则由功能部件返回;

 

NAK表示功能部件不会从主机接受数据(对于输出事务),或者功能部件没有传输数据到主机(对于输入事务)。NAK仅由功能部件在输入事务的数据时相返回,或在输出事务的握手时相返回。主机决不能发出NAK。出于流控制的目的,NAK用于表示功能部件暂时不能传输,或者接收数据,但是最终还是能够在不需主机干涉的情况下而传输或接收数据;

 

STALL作为输入标记的回应,或者在输出事务的数据时相之后由功能部件返回(见图8-9和图8-13)。STALL表示功能部件不能传输,或者接收数据,或者不支持一个控制管道请求。在任何条件下都不允许主机返回STALL

 

STALL握手由设备用于在两个不同的场合之一。第一种情况,是当设置了与端口相联系挂起特征(Halt feature)的时候,称为“功能STALLfunctional stall”(挂起特征在这文档的第9章中详细说明)。功能STALL的特殊情况是“命令STALLcommanded stall)”。如同在第9章中详细叙述的那样,命令STALL发生在主机显式地设置了端口的挂起特征的时候。如果功能部件的端口被挂起,则功能部件必须继续返回STALL,直到引起停止的条件通过主机干涉而被清除。

如同在节8.5.2中详细叙述的那样,第二种情况称为“协议STALLprotocol stall)”。协议STALL对于控制管道是唯一的。协议STALL和功能STALL在意义和持续时间上是不同。协议STALL在控制传送(Control Transfer)的数据或状态阶段(Stage)被返回,并且,STALL条件在下一个控制传送的开始终止(建立事务)。这节的剩下的部分将提到功能STALL的一般情况。

 

8.4.5握手回答(Handshake Response

传输和接收功能部件必须根据从表8-2中到表8-4详细叙述的优先顺序返回握手。不是所有的握手都是被允许,依赖于事务类型和功能部件或主机是否发出握手。如果标记在传输到功能部件的阶段里发生了错误,则功能部件将不以任何包回应,直到下一个标记被收到并成功地译码。

 

8.4.5.1功能部件对输入事务回答

8-2显示了功能部件作为对输入标记的反应而可能做的回答。如果由于停止或流控制条件,功能部件不能发送数据,它将发出STALLNAK握手。如果功能部件能发出数据,它就发出数据。如果收到的标记被损坏,则功能部件不应答。

8-2 功能部件对输入事务的回应

收到的标记损坏

功能部件的发送

端口的挂起特征

功能部件能发送数据

采取的动作

不管

不管

不回应

置了位

不管

发送STALL握手

没置位

发送NAK握手

没置位

发送数据包

 

8.4.5.2主机对输入事务回答

8-3显示了主机对输入事务回答。主机只能返回1种类型的握手:ACK。如果主机收到了损坏的数据包,它把数据丢弃且不应答。如果主机不能从功能部件接受数据,则(出于类似内部缓冲溢出的问题)这条件被认为是错误,并且主机不应答。主机能接受数据,并且如果数据包是完整无错地被接收到,则主机接受数据并发出ACK握手。

8-3 主机对输入事务的回应

数据包损坏

主机能接受数据

主机返回的握手

N/A

丢弃数据,不回应

丢弃数据,不回应

接受数据,发送ACK

 

8.4.5.3功能部件对输出事务回答

对输出事务的握手回答由表8-4表示。假设标记译码成功,功能部件收到数据包后,可以返回三种握手类型中的任何一种。如果数据包被损坏,功能部件不返回握手。如果数据包是被完整无错地接收到,而功能部件的接收端口被停止,则功能部件返回STALL。如果事务正维持着时序位同步而探测到失配(在第8.6节有详细描述),那么功能部件返回ACK,并丢弃数据。如果功能部件能够接受数据并完整无错收到数据,它返回ACK。如果由于流控制的原因,功能部件不能接受数据包,它返回NAK

8-4 功能部件对输出处理的回应(按优先顺序)

数据包损坏

接收器的挂起特征

时序位匹配

功能部件可接收数据

功能部件返回的握手

N/A

N/A

N/A

置了位

N/A

N/A

STALL

没置位

N/A

ACK

没置位

ACK

没置位

NAK

8.4.5.4功能部件对建立事务的回答

建立事务定义了特殊的主机-功能部件的数据事务,它允许主机初始化端口的同步位为主机的同步位。一收到建立标记,功能部件就必须接受数据。功能部件不能对建立标记用STALLNAK应答,并且,接收功能部件必须接受建立标记后的数据包。如果非控制端口收到建立标记,它必须忽略事务且不应答。

CPCI产品,PXI/PXIe产品,VPX 产品,飞腾主板

服务于客户是我们的宗旨。关注客户需求,满足客户需求,通过服务为客户创造价值,是我们不懈的追求;通过快速反应、精益生产、专业服务,实现产品性能和价值最大化,同时将费用和复杂性降到最低。

  备案号:沪ICP备20004832号-1

联系我们

联系地址

上海市松江区九亭镇西飞路1号A208-210

邮编:201615

电话:021-67630928

传真:021-67630905

手机:18939739869(同微信)

邮箱:rocky_pang@163.com

Q  Q: 2814911302

快速链接

展开