接上一篇。
38、数据被传送到总线时,最低有效位(Lsb)逐渐发送到最高有效位(Msb)
39、所有的包都从同步(SYNC)字段开始的,随后跟着包标识符(PID)。包标识符由4位的包类型字段和其后的4位的校验字段构成。包标识符指出了包的类型,并由此隐含地指出了包的格式和包上所用的错误检测的类型。【包标识符的校验字段通过对包类型字段的二进制求反码产生,如果4位的PID检验位不是它们各自的包标识符位的补,则PID错】
任何收到包标识符,如果含有失败的校验字段,或者经过译码得到未定义的值,则该包标识符假定是被损坏的,剩余内容直接忽略。
40、PID的类型
补充:PID位以高位在前的顺序表示,在USB上被发送的时候,右边位在第一个被发出。
41、功能部件端口使用2个字段:功能部件地址字段和端口字段。【功能部件区别于主机】
功能部件对地址或者端口字段都需要进行译码。不允许使用地址或端口别名,并且任何一个字段不匹配,此标记都会直接被忽略。
另外,对于未初始化的端口的访问将使得标记被忽略。
功能部件地址(ADDR)字段通过其地址指定功能部件,至于是数据包发出地或者是目的地,则取决于标记PID的值。比如PID是0001B对应上面表的OUT,就是输出,就是从主机到功能部件。下图为地址字段图
端口字段只对输入、建立、输出的PID有定义。端口类似于TCP协议种的端口。下图为端口字段图
42、帧号字段:帧号字段是一个11位的字段,主机每经过一帧,都会将内容加1。帧号字段达到最大值7FFH时归零,并且它仅每个帧初始时刻在SOF标记种发送。
43、数据字段:数据字段可以在0到1023字节之间变动,但必须是整数个字节。如下为3个数据字段传送时的顺序,上1包的Msb后跟着下1包的Lsb
44、循环冗余校验(CRC)被用来在标记和数据包种保护所有非PID字段。失败的CRC指出了保护字段中至少一个字段被破坏,并导致接收器忽略那些字段,且在大部分情况下忽略整个包。【CRC怎么校验,暂不阐述】
45、包格式:标记包、帧开始包(SOF)、数据包、握手包、握手回答(Handshake Response)
①标记包:由PID、ADDR、ENDP构成,只有主机可以发标记包
补充:标记包和帧开始包是由3个字节包字段数据后面的包结束(EOP)界定的。如果包被译码为合法标记或者SOF,但没有在3个字节之后以EOP终止,则被认为是无效的,直接忽略。
②帧开始包(SOF):主机以每1.00ms左右(0.0005ms误差)一次的额定速率发出SOF包
包括集线器的所有全速功能部件都可收到SOF包。SOF标记不会使得接收功能部件产生返回包;因此,不能保证向任何给定的功能部件发送的SOF都能被收到。这个对于“时间敏感”的功能部件,比较有用。
③数据包:数据包由PID,包含至少0个字节的数据区和CRC构成。数据必须以整数的字节数发出。数据CRC仅通过对包中的数据字段计算而得到,而不包括PID,它有自己的校验字段。
④握手包:握手包仅有PID构成。握手包用来报告数据事务的状态。
握手包还能用来报告数据事务的状态,能表示数据的成功接收,命令的接收或者拒绝,流控制和停止条件。握手包由一个字节的包字段后的EOP确定界限。如果包被解读为合法的握手信号,但是没有以1个字节后面的EOP终止,则它被认为是无效的,并且被忽略。
有3种类型的握手包
ACK表示数据包没有填充或数据字段上的CRC错误,并且数据PID没有被正确接收到;
NAK表示功能部件不会从主机接收数据(对于输出事务),或者功能部件没有传输数据到主机(对于输入事务)、NAK用于表示功能部件暂不能传输,或者接收数据。
STALL作为输入标记的回应,或者在输出事务的数据时相之后由功能部件返回。STALL表示功能部件不能传输,或者接收数据,或者不支持一个控制通道请求。【区别于NAK,这个是永久性的,被设置的,并不代表硬件不支持,只要换个配置可能就支持了】
⑤握手回答:传输和接收功能部件必须根据下边优先数序返回握手。