STM32-USB学习笔记(一) USB基础

2023-05-16

USB基础知识扫盲

前言

本文将从USB的 插入检测身份识别数据传输三个方面对USB通讯整个过程扫盲,其中有些知识点的详细信息会放在文章最下面的附录中供查看,从而保证文章的整体简洁。在进入主题之前,首先了解一下USB的一些基础知识

USB的分类

  • 按接口类型分

    • 控制器/主机(controller/host)
    • 设备(peripheral)
    • OTG(on-the-go),通过id线确定作为主机还是作为设备
  • 按照USB速度分

    • 低速(low speed)
    • 全速(full speed)
    • 高速(high speed)

一、USB插入检测

USB接口一般是4根线,VCC GND DM(D-) DP(D+)
  • A:USB是如何检测到设备插入的
  • Q:主机端将DM DP接入下拉电阻;设备端根据不同速度,将DM DP的某一根接上拉电阻,插入时通过压差即可判定是否插入

    • 低速设备:在DM线上接入上拉
    • 全速设备:在DP线上接入上拉
    • 高速设备:在DP线上接入上拉,在主机对设备进行复位后进一步的确认,详情

二、USB身份识别

对于插入的USB设备,主机需要发送比较短的请求来确认设备的身份、类型、速度等信息,这个过程称之为 枚举

2.1 描述符

设备的“身份”信息存储在描述符中。每个USB设备中都有如下描述符。需要注意的是

  • 一个USB设备只能有一个设备描述符
  • 其他描述符都可以有多个,对应复合设备,例如USB键鼠
  • 设备描述符(device description)

    • 配置描述符(config description)

      • 接口描述符 (interface description)

        • 端点描述符 (endpoint description)
        • 端点描述符
      • 接口描述符

        • 端点描述符
    • 配置描述符

      • 接口描述符

        • 端点描述符

2.2 枚举过程

  1. 等待稳定:主机通过电平差检测到设备,等待100ms让设备电平趋于稳定
  2. 首次复位:HUB发起复位,让设备进入初始的地址0模式
  3. 首次查询设备描述符:GET_DESCRIPTOR 主机查询设备描述符,只要前8字节 ==> 80 06 01 00 00 00 12 00
  4. 二次复位:在接收到设备描述符前8个字节后,再次重启设备
  5. 设置地址:SET_ADDRESS 主机下发设置地址命令,设备获取新地址 ==> 00 05 01 00 00 00 00 00
  6. 二次查询设备描述符:GET_DEVICE_DESCRPTOR获取整个18字节的设备描述符 ==> 80 06 01 00 00 00 12 00
  7. 获取配置描述符:GET_CONFIGURATION 获取9字节配置描述符 ==> 80 06 02 00 00 00 09 00
  8. 完成配置:SET_CONFIGURATION,

2.3 描述符详解

搞懂了描述符,调好了枚举,就完成了USB通讯的一大半,下面就对描述符进行详细的探索
设备描述符18配置描述符9接口描述符9终点描述符7
bLength1bLength1bLength1bLength1
bDescriptorType1bDescriptorType1bDescriptorType1bDescriptorType1
bcdUSB2wTotalLength2bNumInterfaces1bEndpointAddress1
bDeviceClass1bNumInterfaces1bAlterateSetting1bmAttributes1
bDeviceSubClass1bConfigurationValue1bNumEndpoints1wMaxPacketSize2
bDeviceProtocol1iConfiguration1bInterfaceClass1bInterval1
bMaxPackeerSize01bmAttributes1bInterSubfaceClass1
idVendor2bMaxPower1bInterfaceProtocol1
idProduct2 iInterface1
bcdDevice2
iManufacturer1
iProduct1
iSerialNumber1
iNumConfigurations1

附录

F1、USB通讯协议详解

学习协议我个人觉得应该还是从整体流程向下详细到具体协议,上来就看最基本单元/协议会让人一头雾水,这段附录的大体流程也是如此。传输概念->传输流程->基础传输单元->传输流程控制->

F1.1 USB通讯概念

  1. 在USB的通讯中,有传输(transfer),事务(Transaction),包(packet)三级。包是最基础的传输单元,与TCP/IP协议中的MAC层协议作用相同。
  2. 在一次传输中,由多次事务组成,每次的事务又由多个包组成
  3. 与众多协议相同,较高级别的协议的报文是基于/内嵌在低级协议的报文当中的,在USB中也不例外,例如,包中预留了DATA位,其目的就是填写报文
  • 传输(transfer): 控制(control)、中断(interrupt)、批量(bulk),同步(Isochronous)

    • 事务(transaction):传输方向、流程控制

      • 包(packet):

        1. 令牌(Token):IN、OUT、SETUP、SOF,前导包,用于确认本次事务的方向、目的等,是每次事务必须要有的包。
        2. 数据(data):DATA0、DATA1、DATA2、MDATA,夹带数据
        3. 握手(handshake):ACK、NAK、STALL、NYSET,作为应答、状态回复

F1.2 一次完整传输过程

下图为一次完整的获取设备描述符的过程

  • 传输:获取设备描述符

    • 设置事务:主机向设备下发 -> 80 06 00 01 00 00 40 00

      • 令牌包 --> :SETUP类型
      • 数据包 --> :由于令牌是SETUP类型,所以主机紧接着下发数据包,DATA0类型
      • 握手包 <-- :设备收到数据包,回复应答
    • 输入事务:设备向主机上发 -> 12 01 00 01 DC 00 00 10 71 04 F0 FF 00 01 00 00

      • 令牌包 --> :IN类型,主机准备好,设备可以上发数据
      • 数据包 <-- :DATA1类型:DATA0与DATA1在发送数据时需要交替,DATA中夹带设备描述符
      • 握手包 --> :主机收到回复,向设备应答
    • 输出事务:无

      • 令牌包 --> :OUT类型
      • 数据包 --> :DATA0类型,再一次切换为DATA0,没有需要发送给设备的
      • 握手包 <-- :设备收到数据包,回复应答

F1.3 基础传输单元:传输基本单元 -- 包(packet)

不同包的组成部分如下表所示,数字为每一个字段所代表位数。结合上面的完整流程可以更输入的理解包的概念。
Token 令牌包SYNCPIDADDRENDPCRC5
8/328745
Data 数据包SYNCPIDDATACRC16
8/3280-102316
Handshake 握手包SYNCPID
8/328
SOF 起始包SYNCFrame NumberCRC5
8/32115
  1. SYNC字段:为固定,FS/LS为8位,HS为32位
  2. PID字段:决定了该包的类型,例如Token包的SETUP,IN,OUT,数据包的DATA0,DATA1,握手包的ACK,NAK等
  3. ADDR字段/ENDP字段:前面说过,一个设备只有一个设备描述符和多个终点描述符,这两个字段就可以在多个设备中准确的找到目标设备以及设备中的目标终点,类似TCP/IP中的IP与PORT
  4. SOF包:在Token包之前发送,Frame Number为主机内部自增序列号,不断循环

    • FS/LS:每1ms发送一次
    • HS:每125us发送一次
  5. EOF:EOF不属于字段或者数据,而是在每个包最后加上2个数据位宽的SE0信号(DM DP都为低),用于表示包的结束

F1.4 传输流程控制 -- 事务(Transaction)

在分析那个设备描述符的流程时会发现,必须在每次事务的开始,要使用Token(令牌包)确认该次事务的传输“基调”。原因在于,USB是半双工,DM DP并非独立工作,所以采用"三段式"通讯,保证总线不会冲突

  • 令牌包(Token):主机发起
  • 数据包(Data):根据令牌包中的方向,由主机发起(OUT/SETUP)或者设备发起(IN)数据包
  • 握手包(Handshake):数据包接收方发起握手包,返回状态,包含ACK NAK STALL状态等。

图片描述

  1. 不能中断:USB的每次事务是“堵塞”,必须该事务完整后才能做其他事务
  2. 状态判断:之前的举例当中,每次传输都是成功的回复了ACK,可以看到,上图中,事务发起了三次IN的Token包,设备才发送了下一帧数据。不会因为设备忙就退出事务。
  3. 流程控制: 下发/接收数据、控制进出方向、确认回复

F1.5 传输(Transfer)

终于说到顶层部分了,有点耐心马上就说完了,首先传输分为以下几种方式,对应不同需求
传输方式令牌包数据包握手包特点及医用特殊性
控制枚举过程中使用多次事务,简单的下发命令+回复需要2次事务6个包
批量数据量大,要求准确性,常用于U盘等设备多次事务,DATA0/DATA1交替
中断数据量小,要求固定频率,常用于USB键盘鼠标与批量相似,主机会按照固定间隔向设备发令牌包
同步×数据量大,要求低延迟,常用于USB摄像头、声卡无握手包的批量传输

F1.5.1 控制传输(Control Transfer)

控制传输常用于USB枚举阶段,读取设备描述符、设置地址等少量频繁的工作。上面举的获取完整设备描述符就是一个非常典型的控制传输过程,分为以下几个阶段
  1. 建立阶段:SETUP事务,发下指定命令,设备应答
  2. 数据过程:设备等待主机发起IN事务,并将数据上传,主机回复应答
  3. 状态过程:确认完成,这个阶段传输方向必须与数据传输阶段相反,数据传输是IN,确认就应该用OUT。

图片描述

F1.5.2 批量传输(Bulk Transfer)

  • 区分方向,有批量读与批量写,不能同时执行
  • 一次批量传输由多次事务组成
  • 传输过程中数据包类型DATA0/DATA1不断切换,如果发生错误,则主机会要求重传

图片描述

F1.5.3 中断传输(Interrupt Transfer)

中断传输在数据传输方面与批量传输相同,重点在于,主机对中断传输设备必须 保持固定扫描间隔,在设备描述符中标注了该扫面间隔。USB总线即使被其他设备批量传输占用,也会在完成中间抽空向中断传输设备下发令牌

F1.5.4 同步传输(Isochronous Transfer)

因为要求实时性,对数据准确性不是很敏感,所以同步传输中的事务是没有握手包的,如下图

图片描述

F2 USB通讯请求 Request

命令bmRequestTypebRequestwValuewIndexwLengthData
GET_STATUS 0
CLEAR_FEATURE 1
SET_FEATURE 3
SET_ADDRESS 5设备地址00
GET_DESCRIPTOR80H6描述符类型+索引0/languageID描述符长度描述符
SET_DESCRIPTOR 7
GET_CONFIGURATION 8
SET_CONFIGURATION00H900xxH 配置值,高字节固定0000
GET_INTERFACE 10
SET_INTERFACE 11
GET_STATUS 12

bmRequest字段

D7D6-D5D4-D0
0:OUT
1:IN
00:标准请求
01:类请求
10:用户自定义
00:设备
01:接
02:端
03:其他
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32-USB学习笔记(一) USB基础 的相关文章

  • js深拷贝和浅拷贝

    数组的深浅拷贝 浅拷贝 var arr 61 span class hljs string 34 One 34 span span class hljs string 34 Two 34 span span class hljs strin
  • OpenGL/OpenGL ES入门:纹理初探 - 常用API解析

    系列推荐文章 xff1a OpenGL OpenGL ES入门 xff1a 图形API以及专业名词解析 OpenGL OpenGL ES入门 xff1a 渲染流程以及固定存储着色器 OpenGL OpenGL ES入门 xff1a 图像渲染
  • 获取hadoop集群资源信息

    根据hadoop提供的restful接口获取 http hadoop apache org docs stable gt YARN REST APIs gt Resource Manager 1 获取每个node的信息 import url
  • java版电子商务spring cloud分布式微服务b2b2c社交电商 (八)springboot整合mongodb

    电子商务社交平台源码请加企鹅求求 xff1a 三五三六二四七二五九 准备工作 安装 MongoDBjdk 1 8maven 3 0idea 环境依赖 在pom文件引入spring boot starter data mongodb依赖 xf
  • 金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?

    为什么80 的码农都做不了架构师 xff1f gt gt gt 根据 2017 年的 DevOps 发展报告 xff0c 高效能组织和低效能组织在软件交付的效率上有数量级上的差异 技术组织的软件交付能力是一种综合能力 xff0c 涉及众多环
  • MongoDB的无缝集成,重拾后端之Spring Boot

    MongoDB是什么 xff1f MongoDB是一个NoSQL数据库 xff0c 是NoSQL中的一个分支 xff1a 文档数据库 和传统的关系型数据库比如Oracle SQLServer和MySQL等有很大的不同 传统的关系型数据库 x
  • 关于区块链智能合约的真相

    2019独角兽企业重金招聘Python工程师标准 gt gt gt title 关于智能合约的真相 就像 区块链 xff0c AI 和 云 这样的词语一样 xff0c 智能合约 也是那些得到大量炒作的短语之一 毕竟 xff0c 没有什么比不
  • 访问者模式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt https blog csdn net jason0539 article details 45146271 转载于 https my oschina net u 2511
  • zip不是内部或外部命令,也不是可执行程序”详细解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 书中第11章学习实例 xff1a 将文件备份成一个zip文件 xff08 python实现 xff09 书中源码 xff08 文件目录是自己新建文件夹的路径 xff0c 和
  • Struts2学习:HelloWorld

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 项目结构 xff1a 1 用IDEA新建一个SpringBoot 43 Maven的项目 2 新建的项目是没有webapp WEB INF 与web xml文件的 xff0
  • 泛型--继承泛型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt package com atguigu javase generic import java util ArrayList import java util List im
  • springboot之读取配置文件

    1 propertie配置读取数据 通过value取配置文件中的数据 64 Component 64 PropertySource value 61 34 config db config properties 34 public clas
  • Kotlin与Java互操作

    1 xff0c Kotlin 调用Java import java util fun demo source List lt Int gt val list 61 ArrayList lt Int gt for item in source
  • Oracle基础和进阶笔记第二篇

    Oracle的中级操作部分 六 索引1 索引的特点2 索引的创建 七 视图1 普通视图2 物化视图 八 序列1 序列创建语法 九 触发器1 触发器的语法2 替代触发器3 系统触发器 十 游标1 一般游标创建2 静态隐式游标3 静态显示游标4
  • Python 工匠:使用装饰器的技巧。

    作者 xff1a piglei xff08 本文来自作者投稿 xff09 前言 装饰器 xff08 Decorator xff09 是 Python 里的一种特殊工具 xff0c 它为我们提供了一种在函数外部修改函数的灵活能力 它有点像一顶
  • AI听6秒语音就能知道你的长相

    声音可以暴露很多讯息 xff0c 麻省理工学院 xff08 MIT xff09 最近一项研究发现 xff0c 经过训练的 AI 不仅能从声音辨别出性别 年龄和种族 xff0c 甚至能猜出这人大概长什么样子 这些 秘密 都藏不住了 研究人员用
  • selenium编程01-简单163邮箱登陆登出_模块化

    from selenium import webdriver from time import sleep class Login def init self driver self driver 61 driver def login s
  • 163music 反爬分析

    网易163 音乐的 mp3下载 view source https music 163 com playlist id 61 924680166 这个是网页源代码 链接 中间的 拿不到具体的数据 所以获取页面的时候 要去除 http mus
  • 二层链路聚合实验

    交换机1 xff1a ystem view vlan 10 vlan 20 qu interface range g1 0 1 to g1 0 2 port link type access port access vlan 10 qu i
  • plsql

    1 添加快捷键设置 摘抄自https www cnblogs com guangxiang p 9487132 html 汉化版 xff1a 工具 首选项 用户界面 编辑器 自动替换 定义文件 英文版 xff1a Tools gt Perf

随机推荐

  • 如何利用python制作微信好友头像照片墙?

    这个不难 xff0c 主要用到itchat和pillow这2个库 xff0c 其中itchat用于获取微信好友头像照片 xff0c pillow用于拼接头像生成一个照片墙 xff0c 下面我简单介绍一下实现过程 xff0c 代码量不多 xf
  • 软件需求工程与UML建模第二周工作总结

    项目范围 xff1a 1 能够实现仅弹道技能的躲避训练和带有技能发射主体的技能躲避训练 2 要能够玩家自由选择角色进行训练 3 要能够实现包含技能躲避 1v1对线训练等多模式选择的训练方式 4 要能够快捷进行多次练习 xff0c 我们计划加
  • 阻塞和非阻塞~

    很清楚 先记下 https www zhihu com question 19732473 answer 14413599 转载于 https www cnblogs com Mickey697 p 10863679 html
  • vnc利用ps命令查看所有DISPLAY

    ps aux grep vnc 使用该命令可以看到详细的vnc进程和使用的DISPLAY和DISPLAY的分辨率
  • 基础数据类型的补充,编码的进阶,基础数据类型之间的转换

    1 内容总览 基础数据类型的补充数据类型之间的转换 其他数据类型转成bool值为False的情况编码的进阶 2 具体内容 数据类型的补充 str 6个 code str xff1a 补充的方法练习一遍就行 6个 s1 61 39 taiBA
  • Keepalived

    Keepalived双机热备 Keepalived简介 Keepalived是使用C语言编写的路由热备软件 xff0c 该项目软件的主要目标是为Linux系统提供简单高效的负载均衡及高可用解决方案 负载均衡架构依赖于知名的IPVS xff0
  • Scyther 形式化分析工具资料整理(三)

    1 作者Cas Cremers在做TLS1 3的时候我么发现并没有使用Scyther 形式化丰分析工具对其进行分析 xff0c 而是使用了 The Tamarin 作者建立了TLS 13的模型 那么我的目标是 使用Scyther工具对TLS
  • java产生随机数的三种方式

    public class Test public static void main String args Random类 创建随机数对象有2种 一种是添加参数 也叫种子 这种方式创建出来的数 刷新后不会改变 相当于常量了 主要方法 nex
  • gcc 编译两个so其中soA依赖soB

    有两个so xff0c 其中soB中调用soA xff1b 那么我们打包soB的时候连接soA xff1b 在打包test程序的时候连接soB 此时soB会自动查找依赖的soA xff1b 如下测试 在编译之前指定环境变量 xff1a ex
  • Vue 循环 [Vue warn]: Avoid using non-primitive value as key

    页面中不添加 xff1a key 索引的时候 xff0c 会不停的提示虚线 xff0c 但不影响使用 后来加了一个索引 xff0c 加成了 key 61 34 content 34 从后台取出来的contents是一个list xff0c
  • 博客系统 01 登录退出

    一 工程搭建 使用的是IDEA xff08 1 xff09 新建个动态web工程 xff08 Blog xff09 xff08 2 xff09 导入jar包 xff08 SSH jar包 xff09 xff08 3 xff09 导入配置文件
  • 蓝桥杯2017国赛JAVAB组 树形显示 题解

    标题 xff1a 树形显示 对于分类结构可以用树形来形象地表示 比如 xff1a 文件系统就是典型的例子 树中的结点具有父子关系 我们在显示的时候 xff0c 把子项向右缩进 xff08 用空格 xff0c 不是tab xff09 xff0
  • 读《【解密】京东B2B业务架构演变》有感

    京东的B2B业务目前来说发展比较好 xff0c 它的定位是让各类型的企业都可以在京东的 B 平台上进行采购 建立采购关系 京东 B2B 的用户群体主要分为 2 类 xff0c 一类是大 B 用户 另一类是小 B 用户 比如联通 移动公司跟京
  • python中线程、进程和协程的区别

    进程是资源分配的单位线程是操作系统调度的单位协程 xff0c 又称微线程 xff0c 纤程 xff0c 协程的切换只是单纯的操作CPU的上下文 xff0c 资源很小 xff0c 效率高进程切换需要的资源很最大 xff0c 效率很低一个程序至
  • linux下常用alias

    alias xx 61 39 39 其中 61 两边不要有空格
  • C#常用控件(2)

    1 Botton 控件 按钮用图片应该设置内阁为Image xff0c 而不能设置Background为Image xff0c 如果只设置背景 xff0c 按钮鼠标经过样式还在 XAML写法 C 写法 2 Combobox 控件 下拉框控件
  • Django 路由层 虚拟环境下建项目

    路由匹配规律 第一个参数是正则表达式 xff0c 匹配规则按照从上往下一次匹配 xff0c 匹配到一个之后立即匹配 xff0c 直接执行对应的视图函数 urlpatterns 61 url r 39 admin 39 admin site
  • 磁盘显示设备未就绪,要怎么找到资料

    设备未就绪说明这个盘的文件系统结构损坏了 在平时如果数据不重要 xff0c 那么可以直接格式化就能用了 但是有的时候里面的数据很重要 xff0c 那么就必须先恢复出数据再格式化 具体恢复方法可以看正文了解 xff08 不格式化的恢复方法 x
  • centos7下安装vnc更改vnc默认端口号

    应用场景 xff1a 某些情景下 xff0c 需要用的linux的桌面环境 xff0c Ubuntu的桌面性能在linux发行版中算是数一数二的 xff0c 如果不熟悉Debian系统 xff0c Centos RHEL系列也行 xff1b
  • STM32-USB学习笔记(一) USB基础

    USB基础知识扫盲 前言 本文将从USB的 插入检测 身份识别 数据传输三个方面对USB通讯整个过程扫盲 xff0c 其中有些知识点的详细信息会放在文章最下面的附录中供查看 xff0c 从而保证文章的整体简洁 在进入主题之前 xff0c 首