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

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


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

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

每周一更单片机知识

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

未知usb设备(设备描述请求失败)_USB 之传输事务相关推荐

  1. 未知usb设备(设备描述请求失败)_HomePod mini?电源线同样不可拆卸:但或能用USB-C移动电源供电...

    尽管在技术规格中没有详细说明,但外媒 MacRumors 可以确认新款 HomePod mini 具有不可拆卸的电源线,该电源线的末端带有 USB-C 接口,可与包装盒中随附的 20W 电源适配器一起 ...

  2. 未知USB设备(设备描述符请求失败)是什么?

    未知USB 设备(设备描述符请求失败)是什么? 参考解决方案:Win10一个USB设备描述符请求失败解决方法 恕我直言,对我们没有什么用,我们需要的是不用插拔usb也能让错误消失

  3. CH330显示未知USB设备(设备描述符请求失败)

    CH330接上电脑后显示未知USB设备(设备描述符请求失败),原因是:VCC脚的0.1uF退耦电容一定必不可少!!

  4. 移动硬盘未知usb设备(设定地址失败)

    @ 移动硬盘未知usb设备(设定地址失败) 移动硬盘出现未知usb设备(设定地址失败) 有可能是供电不足导致的,如果是笔记本,请换一个USB接口试试.(我的就是这个原因) 其他原因请自行百度. 我已尽 ...

  5. 未知USB设备(设备描述符请求失败)伴随笔记本蓝牙消失

    本人使用的笔记本电脑已经两次遇到这种情况了,第一次遇到的时候是因为发现电脑开机之后蓝牙消失了.第二次也是一样的结果,当然第二次有经验了,很快就解决了. 首先呢,蓝牙消失的同时,设备管理器中会出黄色感叹 ...

  6. win10检查更新后,蓝牙没了,卸载usb也没有用,蓝牙 未知usb设备 设备描述符请求失败

    最后解决方案: 长按电源键30s放电: 将bios的所有设置恢复默认 然后就有了蓝牙

  7. stlink 未知usb设备 设备描述符请求失败

    一般是STLINK烧了,可以用STM32的串口下载程序: 只可以用UAART_1:PA9,PA10 需要软件:FlyMcu ① PA9:为TX,要接CH340的RX PA10:为RX,要接CH340的 ...

  8. U盘 未知USB设备 设定地址失败 由于该设备有问题Windows 已将其停止(代码 43) 终极解决方案(做过系统装机盘而无法解决的必看)

    U盘由于该设备有问题Windows 已将其停止(代码 43) 终极解决方案 我们在使用U盘的时候偶尔会碰到下列情况 一般是因为传输数据的过程中,死机或未响应直接断点或拔掉设备导致的,U盘再次插上之后出 ...

  9. 未知USB设备 端口重置失败

    1.开启手机中USB调试 进入"设置"->"应用程序"->"开发"勾选"USB调试程序".这样设备才可以通过 ...

最新文章

  1. 【SignalR学习系列】4. SignalR广播程序
  2. 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以
  3. 阿里云知位停车:让车主好停、车场好管
  4. git 常用commands(转)
  5. Nuc972使用NandFlash时,uboot所需要的改动
  6. 重写、重构、重载区别
  7. RequestMapping
  8. 十大经典排序算法5(Python版本)
  9. 供应链B2B项目一直赚不到钱
  10. 免费下载百度文库需下载券文件
  11. ubuntu16.04系统下配置caffe的GPU环境,训练mobileNet-SSD并在EAIDK-310嵌入式上推理
  12. 0002深度学习初体验-基于Tensorflow and Keras 实现卷积神经网络(CNN-AlexNET)实现CIFAR图像训练
  13. JIRA + FishEye + Crucible + Confluence + PostgreSQL
  14. 前端学习第二课——基础1——基本标签
  15. oracle中不等于怎么表示,sql语句不等于怎么表示
  16. 智商黑洞(门萨Mensa测试)1
  17. 数据库实体间关联关系:一对一、一对多、多对多
  18. java 电梯类图,电梯控制系统(用UML图理解)
  19. SCSS常用语法总结
  20. 《云计算架构技术与实践》拆书12讲!

热门文章

  1. 平凡的女人,伟大的奉献
  2. 计算机网络口诀,网线水晶头接法顺序图解分享,这个简单口诀记好了(超实用)...
  3. STM32MP157驱动开发——Linux IIO驱动(上)
  4. php截图整个网页,selenium save_screenshot 如何进行全网页截图?
  5. linux hairpin mode
  6. 共阴数码管显示0~9的数字
  7. pycharm——python调用dubbo接口返回句柄无效(Connection dropped:socket connection error:句柄无效)
  8. Unity开发时遇到的各种需要注意的地方
  9. 迅雷11下载报错:下载引擎未启动
  10. Android 高级开发 JNI NDK 介绍与使用