【USB笔记】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字段。生成多项式为
G ( X ) = x 5 + x 2 + 1 G(X)=x^5+x^2+1 G(X)=x5+x2+1
用二进制来表示这个多项式就是00101B。如果tokens的所有位都被正确接收,那么接收器的5位余数是01100B。

Token Packets

Token Format

Split Transaction Special Token Packets

SSPLIT Token

Start-split (SSPLIT) Token

CSPLIT Token

Complete-split (CSPLIT) Transaction Token

SOF Packet

SOF Packet

2.Data CRCs(数据CRC)

data使用16位的CRC字段,应用于 data packet的DATA字段,是一个16位的多项式,生成多项式为
G ( x ) = x 16 + x 15 + x 2 + 1 G(x)=x^{16}+x^{15}+x^2+1 G(x)=x16+x15+x2+1
用二进制位来表示这个多项式就是1000000000000101B。如果所有数据和CRC位都被无错接收,那么16位的余数就是1000001101B。

Data Packet

数据包格式(Data Packet Format)如下:
Data Packet Format

参考


  1. Universal Serial Bus Specification Revision 2.0 ↩︎

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值