- USB 全称为 Universal Serial Bus,翻译过来就是通用串行总线。
1.按照版本划分:
USB 目前可以划分为 USB1.0、USB2.0、USB3.0 以及正在即将到来的USB4.0
- USB1.0:
- USB2.0: USB2.0 的480Mbps为半双工。目前大多数单片机以及低端 Cortex-A 芯片配置的都是 USB2.0 接口,比如 STM32和ALPHA开发板所使用的I.MX6ULL。USB2.0 全面兼容USB1.0标准。USB2.0 分为两个版本:Full-Speed(12Mbps)和High-Speed(480Mbps)
- USB3.0:USB3.0最大理论传输速度为 5.0Gbps, USB3.0引入了全双工数据传输,。USB3.0中两根线用于发送数据,另外两根用于接收数据.
- USB4.0: 目前还在标准定制中,目前还没有设备搭载。USB4.0 的速度将提升到了 40Gbps,最高支持 100W 的供电能力,只需要一根线就可以完成数据传输与供电
2.按照接口类型划分:
- USB A 插头(左)和插座(右) (大头)
- USB B 插头(左)和插座(右) (大头)
- Mini USB插头(左)和插座(右) (小头)
- Micro USB 插头(左)和插座(右) (小头)
- USB Typec插头(左)和插座(右) (小头)
3、电气特性 - USB A 插头从左到右线序依次为 1,2,3,4,
第 1 根线为 VBUS电压为5V(TTL电平),
第 2 根线为 D-,
第 3 根线为 D+,
第 4 根线为 GND。 - Mini USB插头,发现Mini USB 插头有5个触点,也就是 5根线,
第 1根线为VCC(5V),
第 2 根线为D-,
第 3根线为D+,
第 4 根线为ID,
第 5 根线为 GND - 可以看出 Mini USB 插头相比 USB A 插头多了一个 ID 线,这个 ID 线用于实现OTG功能,通过 ID线来判断当前连接的是主设备(HOST)还是从设备(SLAVE)。
ID=1:OTG 设备工作在从机模式。
ID=0:OTG 设备工作在主机模式。 - USB 采用差分信号来传输数据,因此有D-和D+两根差分信号线
3.拓扑结构
- USB 是主从结构的,也就是分为主机和从机两部分,一般主机叫做Host(大头,比如电脑等),从机叫做Device(小头,主要就是用的设备,鼠标、键盘等)
- 如果不够用的话我们可以购买 USB 集线器来扩展电脑的
USB 插口,USB集线器也叫做USB HUB。
- 主机一般会带几个原生的USB 主控制器,比如 I.MX6ULL就有两个原生的 USB主控制器。但是两个接口肯定是不够用的,这时候就要通过 USB HUB 芯片扩展出来。虽然我们可以对原生的 USB 口数量进行扩展,但是我们不能对原生 USB 口的带宽进行扩展。
- USB 只能主机与设备之间进行数据通信, USB 主机与主机、设备与设备之间是不能通信的。因此两个正常通信的 USB接口之间必定有一个主机,一个设备比如主机提供 USB A 插座,从机提供 Mini USB、Micro USB 等插座
- 在一个USB 系统中,仅有一个 USB 主机,但是可以有多个USB 设备,包括USB功能设备和USB HUB,最多支持127个设备所以一个USB主控制器最多可以分配 127 个地址。整个 USB 的拓扑结构就是一个分层的金字塔形
- 一共有 7 层,金字塔顶部是 Root Hub,这个是USB 控制器内部的。图中的 Hub就是连接的USB 集线器,Func就是具体的USB设备
USB 主机和从机之间的通信通过管道(Pipe)来完成,在主机端管道其实就是一组缓冲区,用来存放主机数据,在设备端管道对应一个特定的端点。
4.usb OTG
- 上面都已经说了,usb是一个严格遵守“主从结构”的。所以,
- 支持USB OTG 功能的USB 接口既可以做 HOST,也可以做 DEVICE。这其中使用ID线来表示是主机还是从机。
ID=1:OTG 设备工作在从机模式。
ID=0:OTG 设备工作在主机模式。
二、USB协议简述
- 上面已经提到过,usb的小头有4线和5线的结构(多一根线是ID线,支持OTG模式)
- 其中主要传输数据就是靠D+和D-两根差分信号线来实现。
1、USB 描述符
USB 描述符就是用来描述 USB 信息的,USB 设备使用描述符来向主机报告自己的相关属性信息,常用描述符如下:
1)设备描述符:设备描述符用于描述 USB 设备的一般信息,USB 设备只有一个设备描述符
2)配置描述符:配置描述符描述了设备可提供的接口(Interface)数量、配置编号、供电信息等,
3)字符串描述符:字符串描述符是可选的,字符串描述符用于描述一些方便人们阅读的信息,比如制造商、设备名称啥的
4)接口字符串:接口描述符中一般记录接口编号、接口对应的端点数量、接口所述的类等.配置描述符中指定了该配置下的接口数量,配置可以提供一个或多个接口,接口描述符用于描述接口属性。
5)端点描述符:端点描述符描述了树传输类型、方向、数据包大小、端点号等信息.端点是设备与主机之间进行数据传输的逻辑接口,除了端点 0是双向端口,其他的端口都是单向的。
2、数据包类型
- USB 是串行通信,需要一位一位的去传输数据, USB 传输的时候先将原始数据进行打包,所以 USB 中传输的基本单元就是数据包。根据用途的不同,USB 协议定义了 4 种不同的包结构:
1.令牌(Token)包、
2.数据(Data)包、
3.握手(Handshake)包
4.特殊(Special)包 - 这四种包通过包标识符 PID 来区分,PID 共有8位,USB协议使用低 4位PID3~PID0,另外的高四位 PID7PID4是PID3PID0的取反,传输顺序是 PID0、PID1、PID2、PID3…PID7。
1.令牌包的PID1~0为 01,
2.数据包的 PID1~0 为 11,
3.握手包的 PID1~0 为 10,
4.特殊包的 PID1~0 为 00 - 其中每种包又有具体的包。他们之间的区分就是包标识符PID
1、令牌包
- 首先是 SYNC 同步域,包同步域为 00000001,也就是连续7个0,后面跟一个1,如果是高速设备的话就是31个0后面跟一个1。紧跟着是PID,
- 这里是SETUP包,为 0XB4,大家可能会好奇为什么不是 0X2D(00101101), 0XB4 的原因如下:
①、SETUP 包的 PID3~PID0为1101,因此对应的 PID7~PID4 就是 0010。
②、PID 传输顺序为 PID0、PID1、PID2…PID7,因此按照传输顺序排列的话此处的PID 就是 10110100=0XB4,并不是 0X2D。 - PID后面跟着地址域(ADDR)和端点域(ENDP),为目标设备的地址和端点号。
- CRC5 域是 5位 CRC 值,是ADDR和ENDP这两个域的校验值。最后就是包结束域(EOP),标记本数据包结束。其他令牌包的结构和 SETUP 基本类似,只是 SOF 令包中间没有 ADDR 和 ENDP 这两个域,而是只有一个11 位的帧号域
2、数据包
3、握手包
3、传输类型
在端点描述符中 bmAttributes 指定了端点的传输类型,一共有 4 种传输类型。
控制传输
同步传输
批量传输
中断传输
1、控制传输
- 控制传输一般用于特定的请求,比如枚举过程就是全部由控制传输来完成的,比如获取描述符、设置地址、设置配置等
- 控制传输分为三个阶段:
1)建立阶段(SETUP):建立阶段使用 SETUP 令牌包,SETUP 使用DATA0 包。
2)数据阶段(DATA)(可选):
数据阶段是 0 个、1 个或多个输入(IN)/输出(OUT)事务
数据阶段的第一个数据包必须是 DATA1,每次正确传输以后就在 DATA0和DATA1 之间进行切换
3)状态阶段(STATUS):
状态阶段的传输方向要和数据阶段相反,比如数据阶段为 IN 的话状态阶段就要为 OUT,状态阶段使用DATA1包。 - 读控制传输阶段
2、同步传输
- 同步传输用于周期性、低时延、数据量大的场合,比如音视频传输。
- 这些场合对于时延要求很高,但是不要求数据 100%正确,允许有少量的错误。
- 因此,同步传输没有握手阶段,即使数据传输出错了也不会重传。
3、批量传输
- 批量传输就是用于大批量传输大块数据的,这些数据对实时性没有要求,比如 MSD类设备(存储设备),U 盘之类的。
- 批量传输分为批量读(输入)和批量写(输出),如果是批量读的话第一阶段的 IN 令牌包,如果是批量写那么第一阶段就是OUT 令牌包。
批量写传输过程: