USB CRC
简介
循环冗余检查(CRC)用于保护所有非PID字段,CRC能100%覆盖所有单bit(single-bit)和双bit(double-bit)错误。每个Token字段和Data字段都提供了CRC。这为主机或设备提供了一种机制来识别和更正或者忽略那些损坏的字段。
本篇文章内容基于USB2.0协议1。
CRC说明
循环冗余检查(CRC)用于保护Token和Data Packet中的所有非PID字段,PID不包含在CRC校验中。
CRC错误表示一个或多个被保护的字段受到破坏,此时接收器忽略这些字段。在大多数情况下会忽略整个包。
对于CRC的产生和校验,生成器和校验器的移位寄存器都是以全1的形式开始的。
对于每个发送或接收到的数据位来说,它们都要与当前余项的高位“异或”(XOR),然后剩余的部分左移1位,最低位设为0。如果“异或”(XOR)的结果是1,那么余项要和生成器的多项式“异或”。
当发送了已校验的场的最后一位后,生成器的CRC反向,首先向校验器发出MSb(Most Significant Bit,最高有效位)。当校验器接收到CRC的最后1位且没有出现错误时,余项等于多项式的余数。
如果在包接收结束后计算出的校验和余项与多项式余项不等,这个时候会产生CRC错误。
CRC必须符合位填充的要求,包括当CRC的前6个位都是1时,在CRC的结尾插入1个0。
1.Token CRCs(令牌CRC)
tokens使用5位的CRC字段,它涵盖了IN、SETUP 和OUT tokens的ADDR和ENDP字段或者SOF tokens的时间戳字段。PING和SPLIT 特殊tokens也包含5位的CRC字段。生成多项式为
用二进制来表示这个多项式就是00101B。如果tokens的所有位都被正确接收,那么接收器的5位余数是01100B。
Token Packets
Split Transaction Special Token Packets
SSPLIT Token
CSPLIT Token
SOF Packet
2.Data CRCs(数据CRC)
data使用16位的CRC字段,应用于 data packet的DATA字段,是一个16位的多项式,生成多项式为
用二进制位来表示这个多项式就是1000000000000101B。如果所有数据和CRC位都被无错接收,那么16位的余数就是1000001101B。
Data Packet
数据包格式(Data Packet Format)如下:
参考
-
Universal Serial Bus Specification Revision 2.0 ↩︎