• USB设备枚举


    目录

    🍅点击这里查看所有博文

      随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有一点用处的技巧,用的不多的技巧可能一个星期就忘了。

      想了很久想通过一些手段把这些事情记录下来。也尝试过在书上记笔记,这也只是一时的,书不在手边的时候那些笔记就和没记一样,不是很方便。

      很多时候我们遇到了问题,一般情况下都是选择在搜索引擎检索相关内容,这样来的也更快一点,除非真的找不到才会去选择翻书。后来就想到了写博客,博客作为自己的一个笔记平台倒是挺合适的。随时可以查阅,不用随身携带。

      同时由于写博客是对外的,既然是对外的就不能随便写,任何人都可以看到。经验对于我来说那就只是经验而已,公布出来说不一定我的一些经验可以帮助到其他的人。遇到和我相同问题时可以少走一些弯路。

      既然决定了要写博客,那就只能认真去写。不管写的好不好,尽力就行。千里之行始于足下,一步一个脚印,慢慢来 ,写的多了慢慢也会变好的。权当是记录自己的成长的一个过程,等到以后再往回看时,就会发现自己以前原来这么菜😂。

      本系列博客所述资料均来自互联网,并不是本人原创(只有博客是自己写的)。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。

    USB电气特性

      USB使用的是差分传输模式,因而有2条数据线,分别是D+和D-。

    输入图片说明

      标准的USB连接线使用4芯电缆,接口一般的排列方式是:红白绿黑从左到右。颜色含义如下:

    • 红色-USB电源 标有-VCC、Power、5V、5VSB字样
    • 绿色-USB数据线(正)-DATA+、USBD+、PD+、USBDT+
    • 白色-USB数据线(负)-DATA-、USBD-、PD-、USBDT+
    • 黑色-地线 -GND、Ground

    输入图片说明

    USB插入检测机制

      USB设备支持即插即用,所以对于USB主机端,一个重要的特性就是USB设备的动态连接检测。

      USB主机端支持设备的连接状态的检测,是需要USB设备的配合的。USB主机端与USB设备端相互配合,实现了USB设备的连接状态检测。

      在USB集线器的每个下游端口的D+和D-上,分别接了一个15k的下拉电阻到地。这样,当集线器的端口悬空(即没有设备插入)时,输入端就被这两个下拉电阻拉到了低电平。

      在USB设备端,在D+或者D-上接了一个1.5k的上拉电阻到3.3V的电源。1.5k的上拉电阻是接在D+还是D-上,由设备的速度来决定。

      对于低速设备,其上拉电阻是接在D-上的。

    输入图片说明

      而全速设备和高速设备,上拉电阻是接在D+上的。
      高速设备首先会被检测为全速设备,然后通过被称为chirp sequence(线性调频序列)的总线握手机制来检测是否具有高速能力。

    输入图片说明

      我们可以这样记忆:速度快的,上拉电阻接正的;速度慢的,上拉电阻接负的。

    一个USB设备连接到主机后,大概分为以下几个阶段:

    输入图片说明

    USB总线信号

      USB使用差分线进行数据传输,D+/D-(3.3V逻辑电平)来表示:

    输入图片说明

    • 差分信号1:D+ > VOH (2.8V) and D- < VOL(0.3V)
    • 差分信号0:D- > VOH and D+ < VOL
    • 复位信号(Reset):(D+ and D-) < VOL,for >= 10ms

    输入图片说明

    PS:FS指全速设备,LS指低速设备

    输入图片说明

    USB设备供电方式

      USB有两种可能的电源配置,这和设备有关,分别是

    • 自供电:由外部电源提供电源
    • 总线供电:由VBUS提供电源(5v)

      对总线供电设备,才区分低功耗和高功耗通用串口总线设备之分。有两种选择:

    • 低功耗设备:最大功耗为100mA
    • 大功率设备:最大功耗为100mA

    PS:在设备枚举过程,配置描述符中,设备向主机指示其电源配置(自供电/总线供电)以及设备配置中的功耗。

    0x09,/* 描述符的长度:9字节 */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,/* 描述符的类型: 0x02 配置描述符(Configuration) */
    JOYSTICK_SIZ_CONFIG_DESC, 0x00,/* 完整的描述符包括接口描述符、端点描述符和类描述符的长度 */
    0x01,/* 配置所支持的接口数目:1*/
    0x01,/* 用SetConofiguration()选择此配置,所指定的配置号: 1*/
    0x00,/* 用于描述此配置的字符描述符的索引号:0 */
    0xE0,/* 供电配置:B7(1 保留), B6(自供电), B5(远程唤醒), B4-B0(0 保留) */
    0x32,/* 最大功耗,以2mA为单位计算:0x32表示 50×2 =100mA */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    USB的休眠(Suspend)

      为节省电源,USB设备在探测不到总线传输时自动进入挂起状态。当挂起时,USB设备保持本身的内部状态,包括它的地址及配置。

      所有的设备在一段特定的时间内探测不到总线活动时必须进入挂起态。不管设备是被分配了非缺省的地址或者是被配置了,已经连接的设备必须在任何加电的时刻随时准备挂起。

      总线活动的挂起可能是因为主机本身进入了挂起状态。另外,USB设备必须在所连接的集线器端口失效时进入挂起态。

      当总线空闲时,USB设备应进入USB IDLE模式(J状态)。当持续3毫秒以上后,设备会处于挂起状态。

      此时如果设备由总线供电时,电流从VBUS电源汲取的电流不应超过2.5mA

      USB主机通过以下方式阻止设备进入挂起模式,定期发布帧开始(SOF)或LS保持活动

    • 对于高速,SOF每125us+/-65ns微帧发送一次
    • 对于全速,SOF每帧发送1ms+/-500ns
    • 对于低速,每隔1ms发送一次Keep Alive(数据包结束)

    USB的唤醒(Resume)

      设备处于挂起状态时,任何总线上的活动(非空闲信号)都可以把设备唤醒/恢复,从而退出低功耗模式。

      当主机想要在挂起后唤醒设备时,它通过将数据线上的信号极性反转至少 20ms 来实现。并以低速EOP信号结尾。

    输入图片说明

    设备的远程唤醒

      同样,设备也可以换醒host,比如电脑待机时通过USB键盘来换醒主机,这种功能称之为远程唤醒(remote wakeup)

      前提是设备已进入idle状态至少5ms,然后发出唤醒K信号,维持1ms到15ms并由主机在1ms内接管来继续驱动唤醒信号。

      具体设备具有的远程唤醒的能力是可选的,也就是说,如果一个设备有远程唤醒的能力,此设备必须能让主机控制此能力的有效与否。当设备复位时,远程唤醒能力必须被禁止

      在配置描述符中,USB设备会将是否支持远程唤醒的能力报告给主机。

    0x09,/* 描述符的长度:9字节 */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,/* 描述符的类型: 0x02 配置描述符(Configuration) */
    JOYSTICK_SIZ_CONFIG_DESC, 0x00,/* 完整的描述符包括接口描述符、端点描述符和类描述符的长度 */
    0x01,/* 配置所支持的接口数目:1*/
    0x01,/* 用SetConofiguration()选择此配置,所指定的配置号: 1*/
    0x00,/* 用于描述此配置的字符描述符的索引号:0 */
    0xE0,/* 供电配置:B7(1 保留), B6(自供电), B5(远程唤醒), B4-B0(0 保留) */
    0x32,/* 最大功耗,以2mA为单位计算:0x32表示 50×2 =100mA */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三、总结

      那么本篇博客就到此结束了,这里只是记录了一些我个人的学习笔记,其中存在大量我自己的理解。文中所述不一定是完全正确的,可能有的地方我自己也理解错了。如果有些错的地方,欢迎大家批评指正。如有问题直接在对应的博客评论区指出即可,不需要私聊我。我们交流的内容留下来也有助于其他人查看,说不一定也有其他人遇到了同样的问题呢😂。

  • 相关阅读:
    使用Python实现强化学习算法
    Java PrintWriter类简介说明
    LeetCode 0522.最长特殊序列 II:两句话讲明思路(子序列判断)
    nlp模型训练接口
    基于Matlab求解高教社杯全国大学生数学建模竞赛(CUMCM2020A题)-炉温曲线的机理建模与优化(源码+数据)
    conda常用命令
    推荐 4 个开源工具
    如何根据纬度和经度获取城市名称
    使用rabbitmq进行支付之后的消息通知
    基于NodeJs+Express+Mysql学生社团活动管理系统
  • 原文地址:https://blog.csdn.net/weixin_44570083/article/details/126367452