STM32 USB虚拟串口原理(上)

USB虚拟串口是使用USB的CDC(CDC为communication device class(virtual port com))类实现的一种通讯接口。使用STM32自带的USB slave功能在电脑上实现一个USB虚拟串口,在电脑上直接使用串口调试助手和STM32进行通讯。

FS : 全速
LS : 低速
USB : 通用串行总线
OTG On-the-Go
PHY : 物理层
 
OTG_FS 是双重角色设备 (DRD) 控制器,支持主机端和设备端的功能,完全遵从 On-The-Go
Supplement to the USB2.0 规范。同时,该控制器也可配置为仅支持主机端或仅支持设备端功能
的控制器,遵从 USB2.0 规范。在主机模式下, OTG_FS 支持全速 (FS, 12Mbits/s) 和低速 (LS,
1.5Mbits/s) 通信,而在设备模式下,支持全速 (FS, 12Mbits/s) 通信。 OTG_FS 控制器支持 HNP
SRP 协议。外围仅在主机模式下需要配置一个针对 V BUS 的电荷泵,即可完成设计。
 

通用串行总线(USB)协议:

管道:逻辑数据传递的信道

端点的属性:

端点号:区分同一接口上不同的端点

传输类型:不同的传输类型针对的是不同的端点,不同的端点支持的传输类型可能不同,如控制端点实现控制传输、同步端点实现同步

传输的方向:主机---->设备(OUT),设备---->主机(IN),OUT和IN的判定总是站在主机的角度

最大数据包长度:一次传输的最大数据包长度

总线供电设备是从VBUS取电,本身不自己供电,比较常见的就是U盘,有线键鼠等。对于总线供电设备,消耗电流超过500mA会报浪涌保护。设备通过设备描述符向主机自报家门,报告的信息包含供电配置(即自供电/总线供电)以及功耗要求。

主机会判断是否能够提供设备所需要的最大功耗,若可以则进行设备的枚举,若满足不了则拒绝枚举该设备。

处于挂起模式的USB总线供电设备,高功耗总线设备消耗电流不能超过2.5mA,低功耗总线设备消耗电流不能超过0.5mA

SOF(start of frame)

EOF(end of packet)

一般情况下设备不会检测到3mS无数据传输从而进入挂起模式,只有当主设备进入休眠状态或者主设备有意停止信号发送时从设备才会进入挂起模式。如当U盘插到笔记本上后是正常工作的模式,当笔记本盖子扣上后进入挂起模式。

差分信号传输,和RS485、CAN在硬件层面很类似,因为差分信号抗干扰能力比较强。总线处于Idle状态大于3mS从设备就会进入挂起模式,低速和全速模式下的J状态是不同的

USB主机内部都是通过15K电阻下拉到地的,因此当无设备接入时,D+、D-均为低电平。在USB从设备中,如果从设备是高速设备则会将D+通过1.5K电阻上拉到VBUS。如果从设备是低速设备则会在将D-通过1.5K电阻上拉至VBUS。因此主机通过对D-、D-电平的检测,就可以判断出是否有设备接入以及接入设备的通讯速度。

当需要传输的数据长度大于接口上端点的最大传输数据长度,则数据会被分为多个transaction进行传输,如需要传送100byte,断点的最大传输数据长度为64byte,则需要分为2个transaction进行传送。每一个transaction都需要由3个packet组成,只有在同步传输是transaction中没有握手包。

PID用于区分不同包的类型,就是上面Packet的四大类,不同类型的包,其组成部分即PID后面跟的内容也是不同的。

令牌包中的帧号和数据是不存在的

SOF包中不存在地址和数据

数据包中无地址和帧号

握手包中无地址、帧号、数据、CRC,握手包用于表示当前传输的传输状况

接收方只有正确收到数据包且数据包的PID和自身期望的PID一致时才会toggle自身的PID。发送方只有收到来自接收方有效的ACK握手信号后才会toggle自身的PID。数据传输起始的PID会在USB reset阶段被清0,因此传输开始时发送方和接收方都是DATA0的PID。

当接收方在成功接收一个数据包并toggle自身的PID(从DATA0变为DATA1),在回复发送方ACK信号的过程中由于某种原因造成ACK信号被破坏,因此发送方并未受到ACK信号。发送方不切换自身的PID(保持DATA0),此时收发双方的PID不再保持一致。在下一次通讯的时候,发送方以DATA0作为PID进行数据的发送。当数据正确到达接收方时,接收方发现当前数据的PID和自身的PID对不上,因此回复ACK信号表示当前数据已成功收到,但其并不toggle自身的PID。当发送方收到接收方返回的ACK信号时会切换自身的PID(从DATA0变为DATA1),在下一次通讯的时候,手法双方就又会回到同步的状态(收发双方的PID都是DATA1)。

 

参考资料:

【1】B站视频

 视频对应PDF:https://www.stmcu.com.cn/Index/search?search_keywords=usb2.0

【2】STM32CubeMX系列教程25:USB Device

https://www.waveshare.net/study/article-664-1.html