首页 > 版块 > 物联网 > 帖子正文

USB之数据包和握手包

蔡琰 发布于 2022-02-08 11:02
收藏 0 回复 0 浏览 114 原创

前面的文章我们一起了解了USB的包结构以及令牌包,今天我们来说说USB的数据包和握手包.

顾名思义,数据包就是用来传输数据的,USB1.1协议中,只有两种数据包:DATA0包和DATA1包。在USB2.中又增加了DATA2MDATA,主要用在高速分裂事务和高速高带宽同步传输中。

数据包都具有同样的结构:一个同步域,后面跟整数字节的数据,然后是CRC16校验,最后是包结束符EOP,如图1所示。

image.png 

1

之所以有不同类型的数据包,是用在当握手包出错时纠错.下面以DATA0包和DATA1包的切换为例进行具体的解释。

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

 

握手包有ACKNAKSTALLNYETACK表示正确接收数据,并且有足够的空间来容纳数据。主机和设备都可以用ACK来确认,NAKSTALLNYET只有设备能够返回,主机不能使用这些握手包。

image.png 

2

>NAK表示没有数据需要返回,或者数据正确接收但是没有足够的空间来容纳它们。当主机收到NAK,知道设备还未准备好,主机会在以后合适的时机进行重试传输。

> STALL表示设备无法执行这个请求,或者端点已经被挂起了,它表示一种错误的状态。设备返回 STLSTALL,需要主机进行干预才能解除这种状态。

>NYET只在USB2.0的高速设备输出事务中使用,它表示设备本次数据成功接收,但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将先使用PING令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费。

需要注意的是,返回NAK并不表示数据出错,只是说明设备暂时没有数据传输或者暂时没有能力接收数据。当USB主机或者设备检测到数据出错时(CRC校验错、PID校验错、位填充错等),将什么都不返回。这时等待接收握手包的一方就会收不到握手包从而等待超时。

以上就是数据包和握手包的内容,你明白了吗?


0 0
发表评论 侵权投诉
评论 (0)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。

文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。