USB的概念性知识
USB的特点
USB2.0 有高速、全速和低速三种工作速度,高速是480Mbit/s,全速是12Mbit/s, 低速是1.5Mbit/s。
USB传输距离短,开发、调式难度大
USB是一种主从结构系统,主机叫HOST,从机叫Device(设备)。USB的数据交换只能发生在主机与设备之间,所有的数据传输都是由主机主动发起的,设备只是被动的负责应答,在USB OTG中,一个设备可以在从机与主机之间切换,这样就实现了设备与设备之间的连接。USB OTG增加了一种MINI USB接头,比普通的USB4线多出一条ID标识线,来表明是主机还是设备。
PC上有多个USB主控制器和多个USB口,每个控制器下有一个跟集线器,USB集线器将一个USB口扩展为多个USB口,USB1.1最多为4层,USB2.0最多为6层。理论上,一个USB主控器最多可接入127个设备:协议规定USB设备具有一个7bit的地址(0~127).
USB传输过程:USB主控器发出命令和数据,通过跟集线器→USB设备,USB设备返回信息→上一层集线器(经历每层集线器)→USB主控制器→CPU。
USB的电气特性
标准USB连接线使用4芯电缆:5V电源线Vbus;差分数据线D-;差分数据线D+;地GND。USB OTG增加了一种MINI USB接头,比普通的USB4线多出一条ID标识线。在USB的低速和全速模式下,采用的是电压传输模式,在高速模式下,采用电流传输模式。
传输速度是指总线上每秒传输的位数,实际速率要低,因为USB有甚多的协议开销。
当数据为0时,电平翻转;数据为1时,电平不翻转。

VBUS电源线,SBU2:2.0设备可悬空,CC1:主机配置上拉电阻,从机下拉。DN、DP:差分数据线。

有设备:D+或者D-接一个1.5k的上拉电阻,(D+高速;D-低俗)
没有设备:D+、D-接入15k的下拉电阻。
USB的描述符
USB1.1定义的标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)、字符串描述符(String Descriptor)。
USB2.0协议新增两个描述符(高速(High-Speed,480Mbps)):设备限定描述符(Device Qualifier Descriptor)、其他速度配置描述符(Other Speed Configuration Descriptor)。
特殊的描述符:类特殊描述符(HID描述符和音频接口描述符)、厂商自定义描述符。
一个USB设备只有一个设备描述符,
- 设备描述符:设备使用的USB协议版本号、设备类型、厂商ID、产品PID、版本号等
- 配置描述符:接口数、接口所使用的类、子类、协议等
- 端点描述符:端点号及方向、端点的传输类型、最大包长度、查询间隔等
- 字符串描述符:提供人们阅读的信息,不必需
- 设备限定描述符 :用于描述设备在不同速度下的通用特性(如高速 / 全速),仅在设备支持多速度时存在,主机枚举时先读取此描述符,再获取对应速度的配置描述符。
- 其他速度配置描述符 :与当前配置描述符一一对应,存储设备在非当前速度下的配置信息(比如设备当前工作在高速模式,此描述符则存储全速模式的配置参数)。
设备{配置{ ;配置{ };配置{接口{ };接口{ };接口{端点{ };端点{ };端点{ }}}}。
设备→配置→接口→端点。
如果一个设备的各种描述符成功返回,代表着成功一大半。(描述符不能出现错误,否则无法正常工作)
USB设备的枚举过程
枚举就是从设备读取各种描述符信息。
USB传输模式:控制传输:建立过程(都由主机发送)、可选的数据过程及状态过程。
建立过程:起始于SETUP令牌包→DATA0数据包→数据过程(读传输:输入数据,写传输:输出数据;数据长度为0:没有数据过程)→状态过程(读传输:输出数据包;写传输:输入数据包);状态过程用来确认数据是否正确传输完成。
- 复位与获取设备描述符(0 地址阶段)
- 设置地址:主机分配一个唯一的 7 位设备地址给该设备。设备收到新地址,必须等待主机发送ACK令牌包,才能启用新地址
- 再次获取设备描述符:主机切换新地址发送建立过程
- 获取配置描述符
- HID设备:报告描述符
**USB是串行总线,**数据是一位一位进行传输的,LSB在前,最先出来的是最低位,数据传输方向:从设备到主机称为输入,主机到从设备成为输出。
USB总线传输数据以包为单位,不同类型的包包含不同类型的域,包都以同步域开始,由一个包标识符PID,和包结束符EOP来结束这个包,同步域:开始传输数据,用来同步数据时钟,
- 同步域→标识符PID→结束符EOP
PID标识一个包的类型一共8位,其中USB协议使用的只有4位(0~3)另外4位是(0~3)的取反用来校验PID。
| PID 类型 | PID 名称 | PID[3:0] | 说明 |
|---|---|---|---|
| 令牌类 (Token) | OUT | 0001B |
通知设备将要执行输出传输(主机 → 设备) |
| IN | 1001B |
通知设备将要执行输入传输(设备 → 主机) | |
| SOF | 0101B |
帧起始包,用于同步 USB 总线时序(全速每 1ms、高速每 125μs 发送一次) | |
| SETUP | 1101B |
通知设备启动控制传输(用于设备枚举、配置等核心流程) | |
| 数据类 (Data) | DATA0 | 0011B |
基础数据包(与 DATA1 交替,保证传输可靠性) |
| DATA1 | 1011B |
基础数据包(与 DATA0 交替,用于传输同步) | |
| DATA2* | 0111B |
高速 / 等时传输专用数据包 | |
| MDATA* | 1111B |
多字节 / 等时传输专用数据包 | |
| 握手类 (Handshake) | ACK | 0010B |
确认(数据接收成功) |
| NAK | 1010B |
不确认(设备暂时无法发送 / 接收数据) | |
| STALL | 1110B |
挂起(设备端点错误 / 不支持当前请求) | |
| 特殊类 (Special) | NYET* | 0110B |
未准备好(高速设备批量传输专用,用于流量控制) |
| PRE | 1100B |
前导令牌包(用于低速 / 全速设备在高速总线上的兼容通信) | |
| ERR* | 1100B |
错误握手包(高速 / 分裂事务专用,用于错误通知) | |
| SPLIT* | 1000B |
分裂事务令牌包(用于高速主机与低速 / 全速设备通信) | |
| PING* | 0100B |
PING 测试令牌包(用于批量传输流量控制,避免 NAK 风暴) | |
| --- | 0000B |
保留,未使用 |
EOP大约为2个数据低位SE0,SE0:D+、D-都保持低电平状态