USB协议层
发布时间:2022/3/1
USB协议层
这章从字段(Field)和包(Packet)的定义开始,从底向上地展示USB(Univeral 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) |
数据0(DATA0)
数据1(DATA1) |
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数据字段
数据字段可以在0到1,023字节之间变动,但必须是整数个字节。图8-4为多字节显示格式。每个字节的范围内的数据位移出时都是最低位(LSb)在前。
循环冗余校验(CRC)被用来在标记和数据包中保护所有的非PID字段。在上下文中,这些字段被认为是保护字段。PID不在含有CRC的包的CRC校验范围内。在位填充之前,在发送器中所有的CRC都由它们的各自的字段产生。同样地,在填充位被去除之后,CRC在接收器中被译码。标记和数据包的CRC可100 %判断单位错和双位错。失败的CRC指出了保护字段中至少有一个字段被损坏,并导致接收器忽略那些字段,且在大部分情况下忽略整个包。为了CRC的发生和校检,发生器和检验器里的移位寄存器置成为全1(All-ones)型。对于每个被发送或者被收到的数据位,当前余项的最高一位和数据位进行异或(XOR),然后,余项是左移1位,并且,最低一位置零。如果异或的结果是1,余项和生成多项式作异或。当检查的字段的最后的一位被发送的时候,发生器里的CRC被颠倒,再以最高位(MSb)在前发给检验器。当检验器收到CRC的最后的一位,且不发生错误的时候,余项将等于多项式的的剩余。如果剩余与包接收器中最后计算出的检验和余项(Checksum remainder)不匹配,则存在CRC误差。对于CRC,必须满足位填充的要求,且如果前6位都是1的话,这包括在CRC的最后插入零,。
l ACK表示数据包没有位填充或数据字段上的CRC错,并且数据PID被正确收到。ACK在下列的情况下被发放,当时序位(Sequence Bit)匹配且接收器能接受数据的时候,或者当时序位失配,但发送方和接收器互相之间必须再同步(Resynchronize)(在第8.6节详细提到)的时候。ACK握手信号只适用于数据被传送且期待握手信号的事务中。对于输入事务,ACK由主机返回,而对于输出或建立事务则由功能部件返回;
l NAK表示功能部件不会从主机接受数据(对于输出事务),或者功能部件没有传输数据到主机(对于输入事务)。NAK仅由功能部件在输入事务的数据时相返回,或在输出事务的握手时相返回。主机决不能发出NAK。出于流控制的目的,NAK用于表示功能部件暂时不能传输,或者接收数据,但是最终还是能够在不需主机干涉的情况下而传输或接收数据;
l STALL作为输入标记的回应,或者在输出事务的数据时相之后由功能部件返回(见图8-9和图8-13)。STALL表示功能部件不能传输,或者接收数据,或者不支持一个控制管道请求。在任何条件下都不允许主机返回STALL。
STALL握手由设备用于在两个不同的场合之一。第一种情况,是当设置了与端口相联系挂起特征(Halt feature)的时候,称为“功能STALL(functional stall) ”(挂起特征在这文档的第9章中详细说明)。功能STALL的特殊情况是“命令STALL(commanded stall)”。如同在第9章中详细叙述的那样,命令STALL发生在主机显式地设置了端口的挂起特征的时候。如果功能部件的端口被挂起,则功能部件必须继续返回STALL,直到引起停止的条件通过主机干涉而被清除。
如同在节8.5.2中详细叙述的那样,第二种情况称为“协议STALL(protocol 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显示了功能部件作为对输入标记的反应而可能做的回答。如果由于停止或流控制条件,功能部件不能发送数据,它将发出STALL或NAK握手。如果功能部件能发出数据,它就发出数据。如果收到的标记被损坏,则功能部件不应答。
表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功能部件对建立事务的回答
建立事务定义了特殊的主机-功能部件的数据事务,它允许主机初始化端口的同步位为主机的同步位。一收到建立标记,功能部件就必须接受数据。功能部件不能对建立标记用STALL或NAK应答,并且,接收功能部件必须接受建立标记后的数据包。如果非控制端口收到建立标记,它必须忽略事务且不应答。
服务于客户是我们的宗旨。关注客户需求,满足客户需求,通过服务为客户创造价值,是我们不懈的追求;通过快速反应、精益生产、专业服务,实现产品性能和价值最大化,同时将费用和复杂性降到最低。 备案号:沪ICP备20004832号-1 |
联系我们
联系地址
上海市松江区九亭镇西飞路1号A208-210
邮编:201615
电话:021-67630928
传真:021-67630905
手机:18939739869(同微信)
Q Q: 2814911302
|
快速链接 |