当前位置: 首页 > news >正文

为什么要学习 USB 协议

、为什么要学习 USB 协议

USB 是 Universal Serial Bus 的缩写,中文通常叫通用串行总线。它是电脑、手机、工控机、单片机开发板和各种外设之间最常见的连接方式之一。

在嵌入式开发中,USB 常用于:

  • 虚拟串口通信
  • U 盘读写
  • 键盘、鼠标、按键板
  • 固件升级
  • 数据采集
  • 音频设备
  • 摄像头设备
  • USB 网卡
  • 上位机参数配置

很多初学者第一次接触 USB 时会觉得它很复杂,因为 USB 不像普通 UART 那样“发字节、收字节”就结束了。USB 设备接入电脑后,电脑会先询问设备是什么、支持什么功能、需要多少电流、有哪些接口、有哪些端点,然后才开始真正传输数据。

这个“先自我介绍,再通信”的过程,就是 USB 学习的核心。

二、USB 通信中的基本角色

USB 通信中最重要的两个角色是:

  • 主机,Host
  • 设备,Device

1. 主机是什么

USB 主机是整个 USB 总线的管理者。它负责供电、检测设备插入、发起通信、读取描述符、分配地址、配置设备、调度数据传输。

常见 USB 主机包括:

  • 电脑
  • 工控机
  • 手机 OTG 模式
  • 支持 USB Host 的 MCU
  • 嵌入式 Linux 主板

USB 通信中,绝大多数数据传输都是由主机主动发起的。即使设备想发送数据,也通常需要等主机来询问或调度。

2. 设备是什么

USB 设备是被主机管理的外设。它连接到主机后,需要按照 USB 协议回答主机的问题。

常见 USB 设备包括:

  • U 盘
  • 键盘
  • 鼠标
  • USB 转串口模块
  • USB 摄像头
  • USB 声卡
  • 单片机 USB CDC 虚拟串口设备

STM32F103C8T6 使用 CherryUSB 做 CDC 虚拟串口时,STM32 就是 USB Device,电脑就是 USB Host。

三、什么是 USB 端口

很多人会把“端口”理解成电脑上的 USB 插孔,这在日常语言里没有问题。但在 USB 协议学习中,需要区分两种概念:

  • 物理端口
  • 逻辑端点

1. 物理端口

物理端口就是看得见摸得着的 USB 接口,例如电脑上的 USB-A、USB-C 插口,或者开发板上的 Micro USB、Type-C 接口。

它负责电气连接,常见信号包括:

  • VBUS:USB 供电,通常是 5 V
  • GND:地
  • D+:USB 全速/低速数据信号
  • D-:USB 全速/低速数据信号

对于 STM32F103C8T6 的 USB FS 设备:

  • PA11 是 USB_DM,也就是 D-
  • PA12 是 USB_DP,也就是 D+

USB 全速设备通常通过 D+ 上拉电阻告诉主机:“有一个全速 USB 设备接入了”。

2. 逻辑端点

USB 协议里更常说的是 Endpoint,中文叫端点。端点不是物理插口,而是设备内部用于数据传输的逻辑通道。

可以把 USB 设备想象成一栋办公楼:

  • USB 设备是整栋楼
  • 接口 Interface 是不同部门
  • 端点 Endpoint 是每个部门收发文件的窗口

电脑并不是随便往设备里写数据,而是往某个端点发送数据,或者从某个端点读取数据。

四、USB 速度等级

USB 有不同速度等级,常见如下:

速度等级英文速率常见应用
低速Low Speed1.5 Mbps鼠标、键盘
全速Full Speed12 MbpsCDC、HID、普通 MCU USB
高速High Speed480 MbpsU 盘、摄像头、网卡
超高速SuperSpeed5 Gbps 及以上高速存储、扩展坞

STM32F103C8T6 内置的是 USB Full Speed Device 控制器,速率是 12 Mbps。它不能直接做 USB High Speed。

USB 全速设备必须有准确的 48 MHz USB 时钟。对于 STM32F103,常见配置是:

  • 外部 HSE 8 MHz
  • PLL 倍频到 72 MHz
  • USB 时钟使用 PLL / 1.5
  • 得到 48 MHz

如果 USB 时钟不准,电脑可能出现无法识别、设备描述符请求失败、Code 43 等问题。

五、USB 连接后的枚举过程

USB 设备插入电脑后,不能马上开始业务通信。主机会先执行一个过程,叫枚举 Enumeration。

枚举可以理解为主机对设备进行“身份调查”和“建档登记”。

典型枚举流程如下:

  1. 主机检测到 D+ 或 D- 上拉,知道有设备接入。
  2. 主机复位 USB 总线。
  3. 设备进入默认地址0
  4. 主机读取设备描述符前 8 字节,知道端点 0 最大包长。
  5. 主机给设备分配一个新的 USB 地址。
  6. 主机读取完整设备描述符。
  7. 主机读取配置描述符。
  8. 主机读取接口、端点、字符串等描述符。
  9. 主机根据描述符加载对应驱动。
  10. 主机设置配置,设备进入可用状态。

如果某一步失败,Windows 可能提示:

  • 请求 USB 设备描述符失败
  • 未知 USB 设备
  • 设备无法启动,代码 10
  • Windows 已将其停止,代码 43

其中“请求 USB 设备描述符失败”通常说明设备在枚举最早期就没有正确返回 Device Descriptor。

六、什么是描述符

描述符 Descriptor 是 USB 设备给主机看的“说明书”。主机通过描述符了解设备是什么、有哪些功能、如何通信。

USB 设备必须正确提供描述符,否则主机不知道该加载什么驱动,也不知道如何访问设备。

常见描述符包括:

  • 设备描述符 Device Descriptor
  • 配置描述符 Configuration Descriptor
  • 接口描述符 Interface Descriptor
  • 端点描述符 Endpoint Descriptor
  • 字符串描述符 String Descriptor
  • 类特定描述符 Class-Specific Descriptor

1. 设备描述符

设备描述符说明整个 USB 设备的基本身份。

它包含的信息通常有:

  • USB 协议版本
  • 设备类别
  • VID,厂商 ID
  • PID,产品 ID
  • 设备版本号
  • 厂商字符串索引
  • 产品字符串索引
  • 序列号字符串索引
  • 支持多少个配置

例如 CDC 虚拟串口设备会通过设备描述符告诉电脑:“我是一个 USB 设备,我的 VID/PID 是多少,我有一个配置。”

如果设备描述符返回失败,Windows 就可能报“请求 USB 设备描述符失败”。

2. 配置描述符

一个 USB 设备可以有一个或多个配置。配置描述符说明某个配置下设备需要多少电流、包含多少接口。

配置描述符里常见字段包括:

  • 配置总长度
  • 接口数量
  • 配置编号
  • 供电方式
  • 最大电流

普通 MCU USB 设备通常只有一个配置。

3. 接口描述符

接口 Interface 表示设备的一个功能单元。

例如:

  • HID 键盘有一个键盘接口
  • U 盘有一个 MSC 接口
  • CDC 虚拟串口通常有两个接口
    • 通信控制接口
    • 数据接口

接口描述符告诉主机:

  • 这是第几个接口
  • 接口属于哪个 USB 类
  • 这个接口有几个端点
  • 这个接口使用什么协议

主机通常根据接口类别加载驱动。例如看到 HID 类,就加载 HID 驱动;看到 CDC ACM 类,就加载虚拟串口相关驱动。

4. 端点描述符

端点描述符说明一个端点的传输方向、传输类型、最大包长和轮询间隔。

端点描述符常见字段包括:

  • 端点地址
  • 传输类型
  • 最大包长
  • 轮询间隔

端点地址中最高位表示方向:

  • 0x01:端点 1 OUT,主机到设备
  • 0x81:端点 1 IN,设备到主机
  • 0x02:端点 2 OUT,主机到设备
  • 0x83:端点 3 IN,设备到主机

注意:IN 和 OUT 是以主机为视角定义的。

  • IN:主机从设备读取数据
  • OUT:主机向设备发送数据

这点对初学者很容易反。比如0x81是 IN 端点,意思是设备通过这个端点把数据发给主机。

5. 字符串描述符

字符串描述符用于显示人类可读的信息,例如:

  • 厂商名称
  • 产品名称
  • 序列号

例如在 Windows 设备管理器里看到的设备名称,可能就来自产品字符串。

在嵌入式 USB 协议栈中,字符串描述符通常需要以 UTF-16LE 格式返回。很多协议栈允许开发者写 ASCII 字符串,再自动转换成 USB 字符串描述符。

如果直接写 UTF-8 中文,而协议栈只按单字节 ASCII 转换,就可能显示乱码。

七、什么是端点 0

端点 0 是 USB 设备必须具备的默认控制端点。

它非常重要,因为枚举过程基本都依赖端点 0 完成。

端点 0 用于:

  • 接收标准请求
  • 返回设备描述符
  • 返回配置描述符
  • 设置设备地址
  • 设置配置
  • 处理类请求
  • 处理厂商自定义请求

端点 0 是双向控制端点,既能 IN,也能 OUT。

如果端点 0 不能正常工作,USB 设备通常无法枚举成功。

八、USB 传输类型

USB 有四种基本传输类型:

  • 控制传输 Control Transfer
  • 批量传输 Bulk Transfer
  • 中断传输 Interrupt Transfer
  • 同步传输 Isochronous Transfer

1. 控制传输

控制传输主要用于设备管理和枚举,端点 0 默认使用控制传输。

典型用途:

  • 获取描述符
  • 设置地址
  • 设置配置
  • 获取设备状态
  • 发送类请求

控制传输可靠性高,有明确的请求、数据和状态阶段。

2. 批量传输

批量传输适合大量可靠数据传输,但不保证固定延时。

典型用途:

  • U 盘数据读写
  • USB 打印机
  • CDC 虚拟串口数据收发
  • 大块普通数据传输

CDC ACM 虚拟串口的数据端点通常使用 Bulk 传输。

3. 中断传输

中断传输适合小数据量、低延迟、周期性查询的场景。

典型用途:

  • 键盘
  • 鼠标
  • HID 设备
  • CDC 通知端点

这里的“中断”不是 MCU 中断的意思,而是 USB 协议中的一种传输调度方式。

4. 同步传输

同步传输适合实时数据流,强调固定带宽和实时性,但错误重传能力较弱。

典型用途:

  • USB 音频
  • USB 视频

例如 USB 麦克风和摄像头通常会用到同步传输。

九、USB 类 Class

USB Class 是 USB 官方定义的一类标准设备功能。主机操作系统可以根据 Class 加载通用驱动。

常见 USB Class:

类名作用常见设备
CDC通信设备类虚拟串口、调制解调器
HID人机接口设备类键盘、鼠标、自定义 HID
MSC大容量存储类U 盘、读卡器
DFU固件升级类USB 升级设备
Audio音频类USB 声卡、麦克风
Video视频类USB 摄像头
RNDIS/ECM/NCMUSB 网络类USB 网卡

使用标准 Class 的好处是:电脑端通常已有驱动,开发者不需要自己写 Windows 驱动。

十、以 CDC 虚拟串口为例理解 USB 结构

CDC ACM 虚拟串口是 MCU 项目最常见的 USB 应用。

一个 CDC ACM 设备通常包含:

  • 1 个设备描述符
  • 1 个配置描述符
  • 2 个接口
  • 3 个端点

1. 两个接口

CDC ACM 通常有两个接口:

  • 通信控制接口
  • 数据接口

通信控制接口用于处理串口参数,例如波特率、DTR、RTS 等。

数据接口用于真正收发串口数据。

2. 三个端点

CDC ACM 常见端点:

  • 中断 IN 端点:通知串口状态
  • Bulk OUT 端点:主机发送数据给设备
  • Bulk IN 端点:设备发送数据给主机

例如你的 STM32F103 CherryUSB 工程中:

  • 0x83:CDC 通知 IN 端点
  • 0x02:CDC 数据 OUT 端点
  • 0x81:CDC 数据 IN 端点

当电脑串口助手发送数据时,数据会通过 OUT 端点到达设备。

当 MCU 回传数据时,数据会通过 IN 端点发送给电脑。

十一、USB 数据方向怎么理解

USB 里的 IN 和 OUT 都是站在主机角度看的。

这是 USB 初学者最容易混淆的地方。

方向主机视角设备视角
IN主机读取数据设备发送数据
OUT主机写出数据设备接收数据

所以:

  • CDC_IN_EP 0x81是设备发给电脑的数据通道
  • CDC_OUT_EP 0x02是电脑发给设备的数据通道

十二、USB 请求

USB 主机会向设备发送请求 Request。请求通过端点 0 控制传输完成。

请求大致分为:

  • 标准请求
  • 类请求
  • 厂商自定义请求

1. 标准请求

标准请求是所有 USB 设备都需要支持的基础请求。

常见标准请求:

  • GET_DESCRIPTOR:获取描述符
  • SET_ADDRESS:设置设备地址
  • SET_CONFIGURATION:设置配置
  • GET_STATUS:获取状态
  • CLEAR_FEATURE:清除特性
  • SET_FEATURE:设置特性

枚举过程主要依赖标准请求。

2. 类请求

类请求和具体 USB Class 有关。

例如 CDC ACM 中常见类请求:

  • SET_LINE_CODING:设置波特率、停止位、校验位、数据位
  • GET_LINE_CODING:获取串口参数
  • SET_CONTROL_LINE_STATE:设置 DTR、RTS

虽然 CDC 是虚拟串口,但 USB 传输本身并不真的依赖 UART 波特率。波特率更多是为了兼容传统串口软件的概念。

3. 厂商自定义请求

厂商自定义请求由开发者自己定义,适合实现特殊控制功能。

例如:

  • 读取设备版本号
  • 设置设备参数
  • 进入升级模式
  • 控制 LED 或继电器
  • 读取内部状态

自定义请求灵活,但主机端也需要自己写对应程序。

十三、VID 和 PID

VID 是 Vendor ID,厂商 ID。

PID 是 Product ID,产品 ID。

电脑通过 VID/PID 识别不同厂商和不同产品。

正式量产产品应使用合法申请的 VID/PID。学习、测试和内部开发阶段可以使用示例 VID/PID,但不要用于商业量产。

如果多个不同设备使用相同 VID/PID 和相同序列号,Windows 可能会把它们当作同一个设备,导致驱动、COM 号或缓存状态混乱。

十四、USB 供电和电气检测

USB 接口通常提供 VBUS 5 V。设备可以从 USB 取电,也可以自供电。

描述符里会声明设备供电方式:

  • Bus Powered:总线供电
  • Self Powered:自供电

还会声明最大电流。例如配置描述符中写 100 mA,主机就认为设备最大从 USB 取 100 mA。

全速 USB 设备通过 D+ 上拉告诉主机设备接入。低速设备通过 D- 上拉告诉主机设备接入。

STM32F103 做 USB 全速设备时,关键硬件点是:

  • PA11 接 D-
  • PA12 接 D+
  • USB 时钟 48 MHz
  • D+ 上拉正确
  • USB 线是数据线,不是纯充电线

十五、为什么复位后要重新插拔 USB

有些 STM32F103 开发板的 D+ 上拉电阻是固定接到 3.3 V 的。这样 MCU 软件复位时,电脑并不会看到 USB 设备真正断开。

结果是:

  • 电脑还以为旧设备在线
  • MCU 内部 USB 外设已经复位
  • 主机和设备状态不同步
  • 设备可能无法重新枚举

解决办法是软件模拟断开。

常见做法:

  1. USB 初始化前,将 PA12 配置为 GPIO 开漏输出。
  2. 拉低 PA12 一小段时间,例如 20 ms 到 100 ms。
  3. 释放 PA12。
  4. 初始化 USB 外设。
  5. 主机检测到设备重新接入并重新枚举。

这个过程相当于让 Windows 感知一次“拔出再插入”。

十六、USB 协议栈做了什么

USB 协议栈是帮开发者处理 USB 协议细节的软件模块。

以 CherryUSB 为例,它通常负责:

  • 处理 USB 标准请求
  • 管理设备描述符
  • 管理配置、接口和端点
  • 处理端点 0 控制传输
  • 处理 CDC、HID、MSC 等类请求
  • 调用底层 USB 控制器驱动收发数据
  • 在 USB 事件发生时通知应用层

开发者通常只需要关心:

  • 写好描述符
  • 注册接口和端点
  • 处理接收回调
  • 调用发送接口
  • 实现业务协议

底层寄存器、端点状态、枚举细节由协议栈处理。

十七、USB Device 开发常见错误

1. USB 时钟错误

USB 全速设备需要 48 MHz。时钟错误会导致枚举失败。

2. D+ 和 D- 接反

PA11 是 D-,PA12 是 D+。接反后主机无法正常识别。

3. D+ 上拉问题

没有上拉,主机检测不到设备。固定上拉则可能导致复位后不能重新枚举。

4. 描述符长度错误

配置描述符总长度、接口数量、端点数量不匹配,可能导致枚举失败或驱动加载异常。

5. 端点地址不一致

代码里使用的端点地址必须和描述符里的端点地址一致。

6. 中断没有进入协议栈

USB 中断没有调用协议栈处理函数,设备无法响应主机请求。

7. HAL USB 库和第三方协议栈同时操作外设

例如同时调用 STM32 HAL PCD 和 CherryUSB,会导致 USB 寄存器状态冲突。

8. 字符串描述符编码错误

ASCII 通常安全。中文需要确保协议栈正确转换为 UTF-16LE。

9. PMA/FIFO 配置错误

对于 STM32 FSDEV,PMA 是 USB 专用包缓冲区。PMA 访问方式、端点缓冲区分配错误,会导致设备描述符或数据传输异常。

十八、学习 USB 的推荐路线

建议初学者按以下顺序学习:

  1. 理解 Host 和 Device。
  2. 理解枚举过程。
  3. 理解描述符。
  4. 理解端点和 IN/OUT 方向。
  5. 理解四种传输类型。
  6. 先做 CDC 虚拟串口。
  7. 再做 HID 自定义设备。
  8. 最后学习 MSC、DFU、Audio、Video 等复杂类。

对于 STM32F103 和 CherryUSB,最推荐从 CDC ACM 虚拟串口开始,因为它能同时覆盖:

  • 设备描述符
  • 配置描述符
  • 接口描述符
  • 端点描述符
  • 控制传输
  • Bulk 传输
  • 类请求
  • 主机驱动加载
  • 应用层数据收发

十九、用一句话理解 USB

USB 不是简单的串口线,而是一套由主机统一管理的分层通信协议。

设备接入后,先通过描述符告诉主机“我是谁、我有什么功能、你该怎么和我通信”,主机完成枚举和驱动加载后,双方才通过端点进行真正的数据传输。

如果能理解“主机、设备、枚举、描述符、接口、端点、传输类型”这几个核心概念,就已经掌握了 USB 协议入门最重要的骨架

http://www.jsqmd.com/news/1152131/

相关文章:

  • 2026年开发小程序公司有哪些,模板与定制服务商汇总
  • 去虚向实、聚力深耕!
  • 告别手动复制粘贴!用 RPA 微信自动化接口实现社群高效管理
  • 开源金融 Agent 横评,LangAlpha 与 TradingAgents 的路线之争
  • 深入解析HotSpot VM源码,Java程序员进阶必备!
  • AI学习回路:基础模型同质化时代的企业核心竞争力构建
  • 终极Photoshop AI插件SD-PPP:5分钟让你的设计工作流智能化
  • 2026年健康新风尚:探秘苦荞快餐粉背后的匠心制造
  • 影刀RPA Excel数据清洗实战:空行、重复、乱码、格式混乱的处理
  • Stable Diffusion批量生成商品主图:单日产出2000+合规图,中小卖家必须掌握的3个LoRA微调技巧
  • TikTok爆款搬运与二创全链路:从无水印提取到AI去重复刻,这套工具组合让产能翻倍
  • [TradeAI] Kario 系统启动与运维指南
  • 7000元保鲜强的冰箱怎么选?海尔麦浪9系测评
  • word文档如何按照章节修改页眉
  • 储能充电桩186kWh/120kW配置:老旧小区电网扩容的3种替代方案
  • BurpSuite 2023.12 垂直越权实战:3步手工测试与2类常见响应结果分析
  • 3 种蛋白质理化性质计算方案对比:Expasy vs BioPython vs EMBOSS
  • 拒绝黑箱计算,用 Python 沙箱让金融 Agent 的分析结果可审计
  • 最大公有云核心算力池迎来“中国芯“
  • Transformer+物理约束的PCT模型
  • Cursor AI × Angular开发闭环(企业级工程实践大揭秘):从Prompt设计到CI/CD自动集成
  • 信安毕设2026课题100例
  • 影刀RPA Excel批注管理:添加与读取批注
  • AI编程生产力断层真相:Claude Code的RAG架构缺陷 vs Cursor的AST-aware编辑器深度集成——资深架构师20年经验解构
  • 【SSM课程设计/毕业设计】基于前后端分离的学生干部事务审批系统的设计与实现 基于 SSM+Vue 的学生干部综合考评系统【附源码、数据库、万字文档】
  • 第十三:Python+Airtest+poco+pytest+pytest-html实现Android App自动化测试框架
  • 为什么你的SD出图总发灰?Stable Diffusion模型推荐暗藏玄机:3个被99%新手忽略的精度匹配陷阱
  • DDR4 和 DDR5 的价格太离谱了,准备继续用DDR3了
  • Core2vst – 苹果macOS虚拟跳线内录/直播跳线工具 使用教程
  • 百度网盘提取码终极指南:3秒解锁加密资源的免费神器