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 枚举过程
- 等待稳定:主机通过电平差检测到设备,等待100ms让设备电平趋于稳定
- 首次复位:HUB发起复位,让设备进入初始的地址0模式
- 首次查询设备描述符:GET_DESCRIPTOR 主机查询设备描述符,只要前8字节 ==>
80 06 01 00 00 00 12 00
- 二次复位:在接收到设备描述符前8个字节后,再次重启设备
- 设置地址:SET_ADDRESS 主机下发设置地址命令,设备获取新地址 ==>
00 05 01 00 00 00 00 00
- 二次查询设备描述符:GET_DEVICE_DESCRPTOR获取整个18字节的设备描述符 ==>
80 06 01 00 00 00 12 00
- 获取配置描述符:GET_CONFIGURATION 获取9字节配置描述符 ==>
80 06 02 00 00 00 09 00
- 完成配置:SET_CONFIGURATION,
2.3 描述符详解
搞懂了描述符,调好了枚举,就完成了USB通讯的一大半,下面就对描述符进行详细的探索
设备描述符 | 18 | 配置描述符 | 9 | 接口描述符 | 9 | 终点描述符 | 7 |
bLength | 1 | bLength | 1 | bLength | 1 | bLength | 1 |
bDescriptorType | 1 | bDescriptorType | 1 | bDescriptorType | 1 | bDescriptorType | 1 |
bcdUSB |