首页|资源下载
登录|注册

您现在的位置是:首页 > 技术阅读 >  USB 之传输事务

USB 之传输事务

时间:2022-09-29

来源:公众号【鱼鹰谈单片机】

作者:鱼鹰Osprey

ID   :emOsprey


前面的笔记,鱼鹰介绍了如何通过两根数据线完成 USB 数据的差分传输,知道了最底层的传输是如何进行的,但是仅仅知道这些还是不能真正实现数据的传输。
还有一点,我们知道 USB 是半双工传输,无法同时收发数据,那么它又是如何完成数据的双向传输呢?
这里面就涉及到 USB 的两个概念:
传输事务(Transaction)与传输(Transfer)。
前面的笔记中,大家都对包(Packt)有了一定的概念,知道USB是通过各种数据包进行传输的,换句话说,包是 USB数据传输的最小(基本)单位,不可分割,数据要被正确传输,必须打包传输
包的基本格式如下:
因为是半双工,必须使用一种机制协调主机和设备的通信(不然主机和设备同时发送数据,肯定是不行的),这个机制在USB中称之为传输事务(Transaction)。
每一次传输事务的开始,都是由主机主动发送令牌开始的,比如建立事务
主机首先发送一个SETUP令牌包,告诉设备,接下来我要发送一个数据包,这个数据包内容需要按照SETUP数据格式(一般是标准请求)进行解析,换句话说,SETUP的数据包是有自己固定格式的。
当设备正确接收到这个数据包的时候,就会返回一个 ACK数据包,告诉主机,我已经正确接收到数据了,可以开始进行下一次传输事务了。
现在我们再从数据传输的角度看这些包,这样更便于理解:
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)地址,类似网络传输中的端口号,是主机能寻址的最小单位,所有的数据传输都是在各个端点上进行的。
而数据,在不同的传输方式中,最大支持的数据量将不同:
同样是全速模式,控制传输最大数据包为 64 字节,而同步传输(isoch)最大传输数据 1023 字节。并且高速、全速、低速之间也有差别。
通过以上三个数据包,就完成了一次控制传输事务

除了控制传输,还有以下传输事务:
为了更好的理解上面的各种数据包,可以看如下内容:
令牌包:
数据包:
握手包:
通过传输事务的机制,从机可以通过PID判断接下来是接收数据还是发送数据,这样主机和从机在传输数据时就不会产生冲突,而接收方在正确接收到数据后需要发送一个ACK握手包进行回应。
但是传输过程中不总是如此顺利,有的时候可能因为总线干扰,导致 CRC校验失败,此时接收方该如何处理呢?
如果主机作为接收方,那么因为传输事务是由主机发起的,所以如果主机在规定的时间内没有接收到数据,那么就会再次发送令牌包,再次从设备中获取所需的数据,如果多次获取失败,放弃此次传输。
而如果是设备作为接收方,那么如果没有在规定的时间内正确接收到数据,那么将不做任何操作。主机因为在发送数据后一直在等待设备的握手包信息,因为设备没有在规定的时间里发送握手包,就会等待超时,从而了解到,设备没有正确接收到数据,那么主机将再次发起一次传输事务
而为了防止接收到重复的数据包,USB 利用了DATA 0 ~ DATA 1令牌翻转的机制,每正确接收到一个数据包,自身的PID 会翻转一次,如果对方未翻转,那么就被认为是重发的数据包(不支持重传的传输不需要这种机制)。
事实上在传输过程中还有两种可能的情况:
第一:设备正忙着处理数据呢,主机不合时宜的发送了令牌包(还有可能有数据包)过来了,那么此时设备硬件自动回复NAK,告诉主机,我正忙着,没空搭理你,主机接收到 NAK 后就会在其它合适时间再次启动事务的传输。还有一种可能是设备没有需要传输的数据,也将以NAK回复
特别要注意的是,回复 NAK 不代表错误。
第二主机发送了一个令牌包,但是设备不支持,那么设备将回复 STALL。比如主机向设备中根本不存在或者没有配置过的端点传输数据,那么将遭到STALL回复,并且在这种状态下,必须主机干预(通过控制传输)才能恢复设备的正常传输功能。
还有一种情况是,主机往控制端点0发送了一个标准请求,但是这种请求不被设备所支持,那么也将遭到 STALL 回复,和前面不同的是,主机可以继续发送下一个请求,不需要做特殊处理。
对此感兴趣的可以找相关资料进行更深入的学习。

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


推荐阅读:
嵌入式系统优先级详解
KEIL 调试经验总结
线程CPU使用率到底该如何计算?
许久以后,你会感谢自己写的异常处理代码
终极串口接收方式,极致效率
延时功能进化论(合集)
如何写一个健壮且高效的串口接收程序?
打了多年的单片机调试断点到底应该怎么设置?| 颠覆认知

-THE END-



如果对你有帮助,记得转发分享哦


微信公众号「鱼鹰谈单片机

每周一更单片机知识

长按后前往图中包含的公众号关注