未知usb设备(设备描述请求失败_USB 之传输事务(四)

前面的笔记,鱼鹰介绍了如何通过两根数据线完成 USB 数据的差分传输,知道了最底层的传输是如何进行的,但是仅仅知道这些还是不能真正实现数据的传输。

还有一点,我们知道 USB 是半双工传输,无法同时收发数据,那么它又是如何完成数据的双向传输呢?

这里面就涉及到 USB 的两个概念:

传输事务(Transaction)与传输(Transfer)。

前面的笔记中,大家都对包(Packt)有了一定的概念,知道USB是通过各种数据包进行传输的,换句话说,包是 USB数据传输的最小(基本)单位,不可分割,数据要被正确传输,必须打包传输

包的基本格式如下:

9a805c735d719a2d032e5d2050a3512b.png

因为是半双工,必须使用一种机制协调主机和设备的通信(不然主机和设备同时发送数据,肯定是不行的),这个机制在USB中称之为传输事务(Transaction)。

每一次传输事务的开始,都是由主机主动发送令牌包开始的,比如建立事务

c687a05c371ed829b104e92ad51ddf4b.png

主机首先发送一个SETUP令牌包,告诉设备,接下来我要发送一个数据包,这个数据包内容需要按照SETUP数据格式(一般是标准请求)进行解析,换句话说,SETUP的数据包是有自己固定格式的。

当设备正确接收到这个数据包的时候,就会返回一个 ACK数据包,告诉主机,我已经正确接收到数据了,可以开始进行下一次传输事务了。

现在我们再从数据传输的角度看这些包,这样更便于理解:

a2b6e35766ad055e6b494b002a270e0e.png

PID本身就有校验功能(四位 PID,四位取反PID),所以不需要额外校验,5 bit CRC对设备地址和端点地址进行校验,16 bit CRC 对数据校验。

设备地址共有 7 bit,范围 0~127,0 地址是设备插入后的默认地址,在主机枚举设备后将给设备重新分配一个1~127范围的地址。

端点地址 4 bit,范围 0~15。全速设备最多有 16 个端点,低速设备最多 3个端点,其中端点 0 是所有 USB 设备必须支持的默认端点,USB中唯一可以进行双向传输的端点(物理上还是分为两个端点 IN 和 OUT,但是对于开发者而言,操作是一样的),也是唯一一个不需要端点描述符就可以进行通信的特殊端点,端点类型是控制传输(四大传输之一)。

所谓端点(Endpoint)地址,类似网络传输中的端口号,是主机能寻址的最小单位,所有的数据传输都是在各个端点上进行的。

5fee6df6590b47cc29191323e9f61c1d.png

而数据,在不同的传输方式中,最大支持的数据量将不同:

00637b326f22d26638c80c1bd8dc9857.png

同样是全速模式,控制传输最大数据包为 64 字节,而同步传输(isoch)最大传输数据 1023 字节。并且高速、全速、低速之间也有差别。

通过以上三个数据包,就完成了一次控制传输事务

除了控制传输,还有以下传输事务:

ba765f9c9c4706d957cf51f6347f1b55.png

为了更好的理解上面的各种数据包,可以看如下内容:

令牌包:

ad7ad7945109ec50f38dbd7d32b4c86d.png

数据包:

83820a4ba27b10683c0e028ebd0ece7a.png

握手包:

226f0ab69a0ee73090760212633b1d09.png

通过传输事务的机制,从机可以通过PID判断接下来是接收数据还是发送数据,这样主机和从机在传输数据时就不会产生冲突,而接收方在正确接收到数据后需要发送一个ACK握手包进行回应。

但是传输过程中不总是如此顺利,有的时候可能因为总线干扰,导致 CRC校验失败,此时接收方该如何处理呢?

如果主机作为接收方,那么因为传输事务是由主机发起的,所以如果主机在规定的时间内没有接收到数据,那么就会再次发送令牌包,再次从设备中获取所需的数据,如果多次获取失败,放弃此次传输。

而如果是设备作为接收方,那么如果没有在规定的时间内正确接收到数据,那么将不做任何操作。主机因为在发送数据后一直在等待设备的握手包信息,因为设备没有在规定的时间里发送握手包,就会等待超时,从而了解到,设备没有正确接收到数据,那么主机将再次发起一次传输事务。

而为了防止接收到重复的数据包,USB 利用了DATA 0 ~ DATA 1令牌翻转的机制,每正确接收到一个数据包,自身的PID 会翻转一次,如果对方未翻转,那么就被认为是重发的数据包(不支持重传的传输不需要这种机制)。

0b690a3502b4340c38c5c40d45de6c84.png

事实上在传输过程中还有两种可能的情况:

第一:设备正忙着处理数据呢,主机不合时宜的发送了令牌包(还有可能有数据包)过来了,那么此时设备硬件自动回复NAK,告诉主机,我正忙着,没空搭理你,主机接收到 NAK 后就会在其它合适时间再次启动事务的传输。还有一种可能是设备没有需要传输的数据,也将以NAK回复

特别要注意的是,回复 NAK 不代表错误。

第二:主机发送了一个令牌包,但是设备不支持,那么设备将回复 STALL。比如主机向设备中根本不存在或者没有配置过的端点传输数据,那么将遭到STALL回复,并且在这种状态下,必须主机干预(通过控制传输)才能恢复设备的正常传输功能。

还有一种情况是,主机往控制端点0发送了一个标准请求,但是这种请求不被设备所支持,那么也将遭到 STALL 回复,和前面不同的是,主机可以继续发送下一个请求,不需要做特殊处理。

对此感兴趣的可以找相关资料进行更深入的学习。

以上就是传输事务的内容了,那么这些内容和四大传输有什么关系?下期再见。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值