USB转多路串口 - 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: STM32F103是一款高性能的微控制器,具有丰富的外设资源,可以通过USB多路串口来拓展其串口通信的功能。 首先,STM32F103具有一个USB接口,可以作为主机或者从机进行USB通信。通过在固件中使用相应的USB库,并配置相应的中断和通信协议,可以实现STM32F103作为USB主机与外部设备进行通信。 其次,STM32F103还拥有多个USART和UART串口接口,可以用来进行串口通信。通过配置相应的串口参数,包括波特率、数据位、校验位和停止位等,可以实现STM32F103与其他外部设备进行串口通信。 为了实现STM32F103的USB多路串口功能,我们可以通过以下步骤来操作: 1. 配置STM32F103的USB功能,使其能够作为USB主机与外部设备进行通信,通过USB中断和通信协议来实现数据的传输和接收。 2. 配置STM32F103的USART或UART串口接口,根据需要可以选择多个串口接口,配置它们的串口参数,使其能够与其他外部设备进行串口通信。 3. 在主程序中编写相应的代码,通过USB接收到的数据进行处理,并通过串口接口将数据发送到外部设备,或者通过串口接口接收到的数据进行处理,并通过USB接口将数据发送到外部设备。 通过以上步骤,就可以实现STM32F103的USB多路串口功能。可以根据具体的需求,配置相应的串口USB参数,来满足不同的串口通信需求。这样可以使STM32F103具备更丰富的通信功能,同时提高其在嵌入式系统中的应用灵活性和可拓展性。 ### 回答2: STM32F103系列微控制器自带的USB接口可以通过软件配置为多路串口模式。具体步骤如下: 1. 配置GPIO引脚:选择作为串口通信的GPIO引脚,并进行相应的初始化配置。 2. 配置USB为虚拟串口:使用HAL库函数或者直接访问寄存器的方式,将USB配置为虚拟串口模式。 3. 初始化串口:配置串口的波特率、数据位、校验位、停止位等参数,并使能串口的中断。 4. 接收数据:在中断函数中,判断接收缓冲区是否有数据,如果有则读取数据并进行处理。 5. 发送数据:将需要发送的数据写入发送缓冲区,并设置发送标志位。 通过以上步骤,就可以将STM32F103的USB接口换为多路串口,以实现串口通信的功能。 需要注意的是,由于只有一个USB接口,因此多路串口模式下只能同时进行一路串口的收发操作。在处理多路串口数据时需要进行切换,确保每个串口的数据收发不会冲突。另外,应根据实际需求来调整串口的波特率等参数,以确保数据的可靠传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值