首页 > 编程知识 正文

未知usb设备设备描述请求失败USB 之传输事务,设备描述请求失败usb

时间:2023-05-05 16:37:42 阅读:233085 作者:4191

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

作者:鱼鹰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-

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

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

每周一更单片机知识

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。