STM32 USB虚拟串口原理(上)

USB虚拟串口是使用USB的CDC(CDC为communication device class(virtual port com))类实现的一种通讯接口。使用STM32自带的USB slave功能可以在电脑上实现一个USB虚拟串口,在电脑上可以直接使用串口调试助手打开该虚拟串口和STM32进行通讯。STM32 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协议。外围仅在主机模式下需要配置一个针对VBUS的电荷泵,即可完成设计。

FS: 全速
LS: 低速
USB: 通用串行总线
OTG On-the-Go
PHY: 物理层

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

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

控制端点:具有双向通讯能力的默认端点,是所有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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread使用ENV生成工程时自己添加的文件被清掉的解决方法

在项目中难得一次就可以将需要的模块或组件包添加完成,因此在实际开发中经常会遇到在未完成的项目中增加软件包或使能硬件功能的情况。一般我们会使用RT-Thread的ENV辅助开发环境的menuconfig图形化系统配置工具对组件包进行配置,配置完后使用pkgs --upd…

怎样使用两行代码实现博客园打赏功能

也许大家看博客园博客的时候,遇到过一些博客右侧,展示了打赏二维码~ 如下图所示 那么,这是怎么实现的呢~~~ 不错,你没猜错,他们使用的是本人写的一个js插件--tctip。 大家搜一下,还能搜到网上有些tctip的教…

STM32 HAL库 .c/.h 文件介绍

HAL库中各个文件的介绍: startup_stm32l475xx.s 启动文件的主要作用是进行RAM中堆、栈内存的分配和初始化,中断向量表及中断函数的定义等,进行完这一系列工作后执行系统复位从而跳转至用户main函数开始执行。 stm32l4xx_hal_ppp.c/.h 基本…

RT-Thread设备框架学习感悟

前面几周跟着野火的教程从0到1实现了RT-Thread的内核,对RT-Thread的调度机制和线程、定时器的底层实现有了总体的了解。后面还需进一步对齐实现细节进行探索,但大致先了解其框架,后面再进行细致的了解。在学习新知识时,最重要的是…

RT-Thread中自定义MSH命令传入的参数是字符串,需用户自行检查和解析

如下是在将安富莱的dac8563模块对接到潘多拉开发板RT-Thread SPI设备框架中时导出到RT-Thread的自定义MSH命令,需要注意的是MSH传入的是字符串,需要自行对字符串进行解析处理。 #include "stdlib.h" /* 使用其中的函数:atoi(); */…

安富莱DAC8653模块

产品规格:1、供电电压 : 2.7 - 5.5V 【3.3V供电时,输出电压也可以到正负10V】2、通道数: 2路 (通过1片DAC8563实现)3、输出电压范围 : -10V ~ 10V 【客户可以自己更改为 0-10V输出范围。使…

flex布局应用与踩坑

一、预告本文不是一篇入门的文章所有请符合以下条件的战斗人员绕道: 1、初学前端,对前端的传统布局还不是很熟悉的人 2、后端人员对前端不打算深入学习的同学 二、开篇flex布局原本是好几个月前就一直想学习的东西,当时flex布局还算是比较新鲜…

RT-Thread I/O设备模型

I/O设备指的是嵌入式系统中的一些Input输入/Output输出设备,输入输出设备是嵌入式系统重要的组成部分。输入和输出设备可以看做是计算机系统和外界进行沟通的桥梁,因此在计算机组成原理中输入输出设备是重要的组成部分。 计算机组成原理中的5大组成部分…

如何使用易我数据恢复向导恢复数码相机删除的图片

1 使用"易我数据恢复向导"的高级恢复(务必将数码相机的存储卡取出单独插入SD卡槽,而不是直接用数据线连接到电脑上,这样存储卡才能以磁盘方式显示) 2 选中对应磁盘,点击下一步 3 如果出现"分区参数不正确"提示,直接取消即可开始搜索 4 搜索完…

RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动

在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档《AN0002-RT-Thread-通用 GPIO 设备应用笔记》有如下描述,因此产生使用文档中未使用的方式1)通过设备操作接口 方法实现GPIO操作的想法! 使用潘多拉开…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(一)

I2C是一种双向2线制同步串行通讯接口,是一类非常经典的串行总线通讯,理解好I2C通讯会帮助理解USB通讯、以太网通讯中的握手、数据帧等环节。 I2C的发展历史: SPI串行通讯主要是由MOTOROLA公司提出的,MOTOROLA公司的半导体部门独立…

清华大学-曾鸣-《ARM微控制器与嵌入式系统》I2C总线(二)

I2C(Inter IC Bus)的通讯数据帧: SCL线无方向区分,SDA线上有数据的流动方向。上图中灰色的代表的是主机向从机发送数据,此时SDA线的电平控制权由主机掌控,从机只能监听该线上的电平状态。白色代表的是从机向…

RT-Thread I2C设备驱动框架的对接使用

I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线。I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯。I2C协议并未规定I2C总线上哪个是主机?哪…

RT-Thread 简介及架构

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在…

iOS HTML标签字符实体,转译字符串归类大全 【转载】

为什么要用转义字符串&#xff1f; HTML中<&#xff0c;>&#xff0c;&等有特殊含义&#xff08;<&#xff0c;>&#xff0c;用于链接签&#xff0c;&用于转义&#xff09;&#xff0c;不能直接使用。这些符号是不显示在我们最终看到的网页里的&#xff0c…

RT-Thread在github上的教程中图片显示不出来问题的解决方法

在github上查看RT-Thread STM32系列BSP制作教程时发现教程中所有的图片都加载不出来&#xff0c;非常影响教程的阅读使用。 使用记事本打开文件&#xff1a; C:\Windows\System32\drivers\etc\hosts 将如下内容复制粘贴到hosts文件末尾&#xff1a; # GitHub Start 140.82.11…

在STM32CubeMX生成的MDK5工程上添加RT-Thread Nano后双击工程名无法打开.map文件的解决方法

当我们基于STM32CubeMx完成芯片的基础配置&#xff0c;再将RT-Thread Nano添加到工程编译完成之后。双击工程名称发现无法打开工程的.map文件&#xff0c;.map文件是STM32开发中非常重要的一个文件&#xff0c;map文件中详细描述了各个函数在ROM中的存储地址和大小&#xff0c;…

STM32实现USB虚拟串口原理(下)

中断传输应用如主机定期间隔送鼠标读取当前的输入信息&#xff0c;或键盘的输入键值 同步传输应用于音视频等对延迟有严格要求的场合 大容量传输对实时性没有太高要求&#xff0c;对延迟有较大的容忍&#xff0c;且在协议层面并未规定最大的容忍延迟时间&#xff0c;但能从协议…

RT-Thread中堆和栈内存的分配

在嵌入式软件开发中&#xff0c;我们经常会提到堆和栈&#xff0c;实际上堆和栈都是RAM上的物理内存空间&#xff0c;只是使用方式不同而已。栈和堆都是单片机RAM中一段连续的存储空间&#xff0c;该段空间一般在启动文件或链接脚本中指定&#xff0c;最后在C库的_main函数中进…

RT-Thread Nano版本和RT-Thread Master版本的关系

RT-Thread Nano版本和RT-Thread Master版本的关系&#xff1a; RT-Thread Master版本不仅仅是一个实时内核&#xff0c;还包含了丰富的中间层组件。 RT-Thread Nano是RT-Thread Master之上进行剪裁后形成的精简版&#xff0c;去掉了一些组件和各种开发板的BSP&#xff0c;仅保…