USB转多路UART - USB 基础

一、 前言

断断续续做了不少USB相关开发,但是没有系统去了解过,遇到问题就很被动了。做这个USB转UART的项目就是,于是专门花了一天的时间学习USB及CDC相关,到写这文章时估计也忘得差不多了,趁项目收尾阶段记录一下,方便后面翻阅。
本文内容(包括图片)绝大多数来源网络,侵删。参考链接:
USB官网
USB通用串行总线基础知识详述
USB端点和传输协议(数据包、事物)详解

二、 总线

USB历代接口

经过多年发展,USB速率越来越高,总线由最初4根线,半双工发展到多根线,全双工。本文是基于 USB 2.0 版本,记录最初最基础的知识,了解了这些基础,后面的版本就很容易了。

USB总线

USB全速(高速)接线图

信号名称 说明
Vbus 电源,DC 5V
D+ 叉分信号线,正
D- 叉分信号线,负
GND 电源地

由上面可知,USB 2.0 只有4根线,两根数据线是高速串行叉分线,半双工。电源线用来主机给从设备供电,最大500mA, 5V * 500mA = 2.5W, 功率不是很高。后来的快速充电技术要么提升了电压和电流,例如9V * 2A = 18W, 再后来USB接口增加了电源和数据线的数量,传输速率和供电功率都大大提升。

数据编解码和位填充

USB采用NRZI(非归零编码)对发送的数据包进行编码 。输入数据0, 编码成“电平翻转” ;输入数据1, 编码成“电平不变” ;(NRZI遇0翻转,遇1不变)。

USB NRZi编码格式

三、 USB总线系统中的设备

可以分为三种类型:

  • 主机: 只能有一个,管理USB系统;
  • 集线器(USB HUB): 用来扩展设备;
  • 设备: 终端设备,如下图的鼠标键盘打印机;

    USB设备拓扑

四、 端点(Endpoints)

在USB规范中,设备端点是唯一可寻址可通信的基本单元,端点是有通信方向的。物理上一个USB总线(4根线)连接一个设备终端,这个设备终端逻辑上可以有多个接口,每个接口可以有多个端点,从而在主机的系统上看该设备终端可能有多个设备。例如本项目,一个USB口扩展7个UART设备。
端点0: 每个终端设备肯定会有一个端点0,用于刚连接到主机时的初始化和枚举。想象一下,一个USB设备终端可能有10个8个端点,刚插到主机时,主机并不清楚,所以规定了一定要有一个端点0,主机最开始只与端点0通信,然后把其它的设备,接口,端点枚举出来。

端点类型

USB规范定义了四种端点类型:

  • 控制端点: 收发控制信息,也可以传输数据。
  • 中断端点: 用于传输少量的数据,实时时效性比较好,例如键盘鼠标。
  • 批量端点: 用于传输大批量数据,实时时效性没要求,例如U盘文件传输。
  • 等时端点: 连续,实时的传输,例如音频。

     

    不同端点类型比较

五、 数据传输

USB通信包含一系列的帧,USB在2.0时代,分为低速设备(1.5Mbps),全速设备(12Mbps)和高速设设备(480Mbps).这些设备使用的帧的时间间隔是1±0.0005ms,而对于高速设备,又将每个帧分成了8个微帧,这样每个微帧的时间间隔变成了125±0.0625us。
每一帧包含一个起始帧(Start of Frame, SOF), 然后是若干个事务(Transaction)。每个事务由一系列数据包(packet)组成。每个数据包以同步标识(SYNC)开始,以结束标识(EOP)结束。有三种类型的包:令牌包,数据包,握手包。帧,事务,包关系如下图:

USB帧事务数据包关系图

包(package)

包是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。USB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),包的基本格式如下:

同步域(SYNC)

由8位/32位组成,作为每个数据包的前导,用来产生同步作用,使USB设备与总线的包传输率同步,它的数值固定为000000001。作用:

  • 通知USB串行接口引擎数据要开始传输;
  • 同步主机和设备之间的时钟。
标识符字段(PID)

包标识符PID是用来标识一个包的类型。PID共有8位,目前USB协议仅使用4位(PID0 - PID3),另外4位(PID4 - PID7)是PID0 - PID3的取反,用来校验PID。传输的顺序为PID0,PID1,PID2,PID3,...,PID7。

令牌包(token packet, PID1~0为01)、数据包(data packet, PID1~0为11)、握手包(handshake packet, PID1~0为10)、特殊包(special packet, PID1~0为00):

令牌类型.

特殊包是一些在特殊场合使用的包。总共有4种:PRE、ERR、SPLIT和PING。其中PRE、SPLIT和PING是令牌包,ERR是握手包。这里不打算展开讲。

帧传输过程

如下图,所有通信都由主机定时发起,帧头一定是SOF,然后包含多个事务,每个事务有多个包,每个包都是SYNC开头,EOP结束。要注意每个事务是有应答的,即一个帧里面数据传输的方向是不断切换的。下图中,主机先发一个SOF,然后发一个SETUP包,这个包带有DATA0,设备端收到后返回ACK。然后主机连续发了3个IN令牌包,前2个从设备端都回复NAK,表示无数据上传。第3个IN回复数据了,主机收到后回复了ACK。然后下一帧,主机发送SOF后,发了个OUT令牌包,跟着又发送了数据DATA0,从设备端回复ACK。

USB帧时间数据传输过程.

举一个实际的例子,全速USB传输每一个帧为1ms。首先会发送一个SOF包(帧起始包),此时USB主机检测到总线没有事务可以传输,则总线进入idel(空闲状态),这里的空闲时间996.917us,3us左右是EOP占用的时间。
5个idle后,有事务了,分析一下这次传输。同样的首先会发送一个SOF包(帧起始包),等了176.817us后,紧接着USB主机会发送一个SETUP令牌包,收到ACK后继续SETUP包和数据包,从设备端也返回了ACK包。下一个是IN的事务,不详细讲。两个事务传输完成后,主机检测到没有事务了,总线同样会进入空闲状态,这里空闲了478.767us。所有的时间开销加起来差不多1ms。然后后面又有几个没有事务的帧。

全速USB帧内容

实际开发中,当MCU做从设备时,一般MCU的软件架构都是在中断中响应主机端各种交互,例如可配置每个SOF都产生一个中断,或者收到SETUP包后产生中断,在中断中处理相应事务,软件不能做太耗时的处理,一般产生事件标志然后异步处理。数据IN是预先拷贝到指定的缓存(或者DMA缓存),当主机轮询时,硬件自动上传,没有数据就回复NAK。数据OUT也是硬件先接收到指定的缓存(或DMA缓存),回复ACK,接收完后产生中断,通知软件处理。

(END)

相关推荐

  1. 为什么USBTTL

    2024-07-22 04:50:03       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 04:50:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 04:50:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 04:50:03       45 阅读
  4. Python语言-面向对象

    2024-07-22 04:50:03       55 阅读

热门阅读

  1. redis的分片集群(仅供自己参考)

    2024-07-22 04:50:03       16 阅读
  2. Log4J reminder

    2024-07-22 04:50:03       15 阅读
  3. 探索未知:无监督目标检测的前沿之旅

    2024-07-22 04:50:03       18 阅读
  4. conda:导出与创建环境快照

    2024-07-22 04:50:03       20 阅读
  5. linux搭建redis cluster集群

    2024-07-22 04:50:03       14 阅读
  6. centos/rocky容器中安装xfce、xrdp记录

    2024-07-22 04:50:03       16 阅读
  7. 【Python】 深入理解 Python 的 repr 方法

    2024-07-22 04:50:03       17 阅读
  8. 【2024德国签证】留学面签问题汇总

    2024-07-22 04:50:03       25 阅读
  9. 为了zoom

    2024-07-22 04:50:03       24 阅读
  10. vue中hash和history的区别 ?

    2024-07-22 04:50:03       16 阅读
  11. 使用 KerasNLP 从头开始生成 GPT 文本

    2024-07-22 04:50:03       15 阅读
  12. 2024-7-20 IT领域最新资讯概览

    2024-07-22 04:50:03       14 阅读
  13. 墨烯的C语言技术栈-C语言基础-017

    2024-07-22 04:50:03       17 阅读