新闻  |   论坛  |   博客  |   在线研讨会
USB 之传输事务
鱼鹰谈单片机 | 2021-02-19 23:24:08    阅读:97   发布文章

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

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

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

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

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

包的基本格式如下:

1.png

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

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

2.png

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

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

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

3.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)地址,类似网络传输中的端口号,是主机能寻址的最小单位,所有的数据传输都是在各个端点上进行的。

4.png

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

5.png

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

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

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

6.png

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

令牌包:

7.png

数据包:

8.png

握手包:

9.png

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

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

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

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

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

10.png

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

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

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

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

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

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客