USB具体通讯过程(含枚举过程)

本文深入探讨USB通讯流程,涵盖行业标准、枚举过程和控制传输细节,是USB开发初学者的入门指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/***********************************************************************

USB入门系列:

1、USB行业标准介绍

2、USB具体通讯过程

3、USB中端点详细了解

4、USB传输之控制传输

......(待补充)

************************************************************************/


前言
    现在刚开始接触USB的开发,零零散散学习了一些USB基础知识,但是却得不到连贯。在这个学习过程中首先困惑的就是USB通讯过程究竟是什么样子的,我觉得做一下的了解后整合后记录下来,首先从USB整体结构基础来入手直到整个通讯过程。可能有理解不到位的地方,望各位能够指正,我会及时改正。

一、USB系统的结构
    USB系统是由三个逻辑层组成:功能层、USB设备层和USB总线接口层。并且每一层都是由主机和USB设备不同的功能模块组成,如下图所示:
1、功能层(接口)
    功能 层是由客户软件和设备方的功能单元组成,其能够实现USB设备传输的特定功能。通过功能层可直观地理解USB传输的数据内容。其中,客户软件通过USB系统软件来与USB设备进行通信。功能单元对于客户软件,可视为接口的集合。

2、USB设备层 (端点)
    USB设备层是由USB系统软件和USB设备的USB逻辑设备组成,其实现主机和USB设备之间传输的具体配置。USB逻辑设备对于USB系统软件,可视为端点的集合。

3、USB总线接口层
    USB总线接口层是由主机的USB主控制器和设备的USB总线接口组成。其实现主机和USB设备实际的数据传输。

4、主机部分
    USB主机部分由客户软件、USB系统软件和USB总线接口组成。
4.1 客户软件
     客户软件负责和USB设备的功能单元进行通信,以实现特定的功能。客户软件不能直接与USB设备相连接,必须通过USB系统软件和USB总线接口才能实现连接。客户软件包括USB设备驱动程序和界面应用程序两部分。

4.2 USB系统软件
    USB系统软件负责和USB逻辑设备进行配置通信,并管理客户软件启动的数据。一般包括 USB总线驱动程序USB主控制驱动程序和非USB主机软件三个部分,这部分会由系统提供。

4.3 USB总线接
   
### CMSIS-DAP USB通信流程及协议详解 #### 1. CMSIS-DAP简介 CMSIS-DAP是一种用于嵌入式开发板的调试接口标准,旨在简化Cortex-M系列微控制器的编程和调试过程。该标准定义了一种通过USB连接主机(通常是PC)与目标设备之间的高效数据交换机制[^1]。 #### 2. 数据传输结构 为了处理来自上位机的应用层命令请求并返回响应,在固件内部设置了两个主要的数据缓存区域: - `static uint8_t USB_Request[DAP_PACKET_COUNT][DAP_PACKET_SIZE];`:存储接收到的指令包。 - `static uint8_t USB_Response[DAP_PACKET_COUNT][DAP_PACKET_SIZE];` :保存待发送回给宿主机的回答信息[^2]。 这些缓冲区被组织成二维数组的形式,其中每一行代表一个独立的消息帧,允许并发接收多个命令或准备多条回复消息。 #### 3. USB通信流程概述 当开发者利用IDE或其他工具向目标MCU发送操作指令时,实际上传输的是遵循特定格式编码后的二进制流。以下是典型的交互步骤描述: - **枚举阶段**:一旦物理立完成,操作系统会自动检测新接入的硬件资源,并加载相应的驱动程序来识别此设备为合法的CMSIS-DAP适配器。 - **配置设置**:随后,系统会对端点进行初始化配置,指定其属性如方向、类型以及最大有效载荷长度等参数;对于CMSIS-DAP而言,默认情况下至少包一对IN/OUT类型的批量转移端点用于常规I/O事务处理。 - **命令解析与执行** - 主机会周期性地查询是否存在未决的任务队列项; - 若发现新的控制请求,则将其读取到本地内存空间内; - 解析所携带的操作码及其关联参数后调用对应的底层API函数实施具体动作; - 执行完毕之后组装好应答报文写回到预分配好的输出缓冲区内等待下一步骤触发传送动作。 - **状态反馈** - 经过上述一系列运算活动结束后,最终形成的回应会被推送到上游直至抵达发起方那里; - 整个过程中涉及到的状态变化均需及时更新至相应寄存器位置以便于实时监控当前工作进展状况。 ```c // 示例代码片段展示如何处理一次完整的读写循环 void ProcessCommand(void){ while (true) { // 检查是否有可用的新命令到达 if(IsNewCommandAvailable()){ ReadFromRequestBuffer(); ExecuteParsedInstruction(); PrepareResponseData(); WriteToResponseBuffer(); } Yield(); // 让出CPU时间片供其他任务运行 } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值