USB数据帧

usb协议类型:

USB1.0   低速模式:1.5Mb/s    半双工
USB1.1   全速模式:12Mb/s  半双工
USB2.0    高速模式:480Mb/s   半双工,向下兼容USB1.0
USB3.0    4.8Gb/s  全双工

USB帧格式

 数据帧由数据包组成,数据帧以SOF包开始,包是数据传输的最小单位,不能被打断或干扰,否则会引发错误;若干个包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成;一次传输由一次到多次事务传输构成,可以跨帧完成;

USB总线的传输事务以数据包为基本单位,而数据包只能在帧内传输;
对于低速和全速USB总线:每1ms产生一个帧,即帧间隔是1ms;
对于高速USB总线:1ms内产生8个微帧,即125us产生一个微帧;

USB数据包

USB数据包的通用模板结构:

同步域:标识数据包的开始,同步主机端和设备端的时钟;

PID:PID(Packet Identifier),标识一个包的类型,总共有8bits,前面4位用来标识真正的包类型,后面4位用来校验PID;

XXXX:不同的包类型,具有不同的含义,可能包含数据、CRC、地址、端点号等。

EOP:EOP(End Of Packet):
表示一个包的结束信号,对于高速USB总线和低速/全速USB总线的包结束信号是不同的;

1、低速/全速USB总线的EOP是一个大约为2个数据宽度的单端0信号,用SE0表示,是一种D+和D-都同时保持低电平的状态;
2、高速USB总线的EOP是使用故意的位填充错误来表示,那么如何判断一个位填充错误是真的位填充错误还是包结束:根据CRC校验来判断,如果CRC校验正确,说明是EOP,否则说明传输出错。

USB数据包的类型:

根据PID的不同值,可以分为4类包。分别是:
1、令牌包(token packet, PID[1:0]: 01);
2、数据包(data packet,PID[1:0]:11);
3、握手包(handshake packet,PID[1:0]:10);
4、特殊包(special packet,PID[1:0]:00);

令牌包:

令牌包都是由主机发送
令牌包又分为4种:
1、输出(OUT)令牌包;
2、输入(IN)令牌包;
3、建立(SETUP)令牌包;
4、帧起始(SOF Start Of Frame)令牌包;

 帧起始令牌包 SOF:

1、SOF是host在每帧(或微帧)开始时发送,它以广播的形式发送,所有USB设备都可以接收到SOF包;
2、USB低速/全速总线,每1ms产生一个帧,高速总线每125us产生一个微帧;
3、USB主机会对当前帧号进行计数,再每次帧开始时,通过SOF发送帧号;注意高速USB总线在1ms内会产生8个微帧,但是这8个微帧的帧号是一样的;
4、每个令牌包都有一个CRC5校验,它只校验PID之后的数据,不包括PID本身,因为PID本身已经有4个取反的位进行校验了;

OUT、IN、SETUP令牌包:

 OUT、IN、SETUP令牌包具有同样的结构;
1、OUT令牌包:用来通知设备,主机将要输出一个数据包;
2、IN令牌包:通知设备返回一个数据包给主机;
3、SETUP令牌包:只用在控制传输中,它和OUT令牌包的作用一样,也是通知设备将要输出一个数据包,两者的区别在于:SETUP令牌包后只使用DATA0数据包,并且只能发送到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制;
4、CRC只校验PID之后的地址域的端点域;

数据包:

主要用来传输数据
1、USB1.1协议只有两种数据包类型:DATA0和DATA1;
2、USB2.0又增加了DATA2和MDATA包,主要用在高速分裂事务和高速高带宽同步传输中;

包结构:

数据包的PID校验机制:
存在多种类型使数据包可以对数据包进行校验,也可以用来当握手包出错时进行纠错;
1、主机和设备都会维护自己的一个数据包类型切换机制;
2、当数据包成功发送或者接收时,数据包类型切换;
3、当检测到对方所使用的数据包类型不对时,USB系统认为这发生了一个错误,并尝试从错误中恢复;数据包类型不匹配主要发生在握手包被破坏的情形。当一端已经正确接收到数据并返回确认信号时,确认信号却在传输过程中被破坏。这时另一端就无法知道刚刚发送的数据是否已经成功,这时它只好保持自己的数据包的类型不变。如果对方下一次使用的数据包类型跟自己的不一致,则说明它刚刚已经成功接收到数据包了(因为它已经做了数据包切换,只有正确接收才会如此);如果对方下一次使用的数据包类型跟自己的一致,则说明对方没有切换数据包类型,也就是说,刚刚的数据包没有发送成功,这是上一次的重试操作。

握手包:

1、用来标识一次传输是否被对方确认;
2、握手包只有同步域、PID和EOP;
3、ACK表示正确接收数据,并且有足够的空间容纳数据。主机和设备都可以用ACK来确认,而NAK、STALL、NYET只有设备能够返回,主机不能使用这些握手包。
4、NAK表示没有数据需要返回,或者数据正确接收但是没有足够的空间来容纳它们。当主机收到NAK时,知道设备还没有准备好,主机会在以后合适的时机进行重试传输;
5、STALL表示设备无法执行这个请求,或者端点已经被挂起了,它表示一种错误的状态。设备返回STALL后,需要主机进行干预才能解除这种STALL状态;
6、NYET只在USB2.0的高速设备输出事务中使用,它表示设备本次数据成功接收,但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将使用PING令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费;NAK并不表示数据出错,只是说明设备暂时没有数据传输或者暂时没有能力接收数据;
7、当USB主机或者设备检测到数据出错时(如CRC校验出错、PID校验出错、位填充出错等),将什么都不返回,这时等待接收握手包的一方就会收不到握手包从而等待超时;

包结构:

 特殊包:

PRE包:

PRE是通知集线器打开其低速端口的一种前导包。PRE只使用在全速模式中。平时,为了防止全速信号使低速设备误动作,集线器是没有将全速信号传送给低速设备的。只有当收到PRE令牌包时,才打开其低速端口。PRE令牌包与握手包的结构一样,只有同步域、PID和EOP。当需要传送低速事务时,主机首先发送一个PRE令牌包(以全速模式发送)。对于全速设备,将会忽略这个令牌包。集线器在收到这个令牌包后,打开其连接了低速设备的端口,接着,主机就会以低速模式给低速设备发送令牌包、数据包等。

PING包:

 PING令牌包与OUT令牌包具有一样的结构,但是PING令牌包后并不发送数据,而是等待设备返回ACK或者NAK,以判断设备是否能够传送数据。只有在USB2.0高速环境中才会使用PING令牌包,它只被使用在批量传输和控制传输的输出事务中。直接使用OUT令牌包发送数据时,不管设备是否有空间接收数据,都会在OUT令牌包之后跟着发送一个数据包,如果设备没有空间接收数据,就会返回一个NAK。当设备返回NAK时,数据以及发送出去了,浪费了总线带宽,白白发送了数据,如果在发送数据前先发送一个小包来探测设备是否有空间来接收数据,然后主机再决定是否发送数据,这样就可以提供总线带宽的利用率。因此在高速USB总线中,增加PING机制,主机先用PING令牌包试试设备是否有空间接收数据,而不用事先把数据发送出去。

SPLIT&ERR包:

SPLIT令牌包是高速事务分裂令牌包,通知集线器将高速数据包转化为全速或者低速数据包发送给其下面的端口。ERR握手包是在分裂事务中表示错误的包。高速分裂事务主要属于集线器的功能,比较复杂,详情可以阅读USB2.0协议的相关部分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值