USB学习笔记(一)

一、USB枚举流程概览

USB枚举是设备与主机建立通信的初始化过程,共分8个关键步骤:

二、详细步骤解析

1. 设备连接与电压检测
  • 物理连接​:设备插入USB端口时,D+/D-信号线被上拉电阻拉高(全速设备拉D+,低速拉D-)。
  • 主机检测​:USB集线器通过端口状态改变中断通知主机有新设备接入。
2. 设备复位与速度检测
  • 复位操作​:主机发送持续10ms以上的RESET信号,使设备进入默认状态(地址0)。
  • 速度协商​:主机检测D+/D-空闲电压判断设备速度(全速/高速:D+高;低速:D-高)。
3. 首次设备描述符获取
  • 请求内容​:主机向地址0发送GET_DESCRIPTOR请求,仅获取设备描述符前8字节。
  • 关键字段​:
    struct DeviceDescriptor {
      uint8_t bLength;          // 描述符长度(0x12)
      uint8_t bDescriptorType;  // 类型标识(0x01)
      uint16_t bcdUSB;          // USB协议版本(如0x0200表示USB2.0)
      uint8_t bMaxPacketSize0;  // 端点0最大包长度(8/16/32/64)[9,10](@ref)
    };
  • 作用​:确定端点0的最大传输包长度,为后续通信建立基础。
4. 地址分配(SET_ADDRESS)​
  • 新地址范围​:1~127(地址0为临时地址)。
  • 交互流程​:
    1. 主机发送SET_ADDRESS请求(数据包包含新地址)。
    2. 设备返回0长度状态包确认。
    3. 设备启用新地址,后续通信均使用此地址。
5. 完整描述符获取
  • 获取顺序​:
    1. 设备描述符​(完整18字节)
    2. 配置描述符​(包含接口/端点信息)
    3. 字符串描述符​(可选,含厂商/产品名称)。
  • 配置描述符结构​:
    struct ConfigDescriptor {
      uint8_t bNumInterfaces;    // 接口数量
      uint8_t bConfigurationValue; // 配置编号
      uint8_t bmAttributes;      // 供电模式(如总线供电/自供电)
      uint8_t bMaxPower;         // 最大功耗(单位2mA)[9,11](@ref)
    };
6. 配置选择与接口激活
  • SET_CONFIGURATION请求​:主机根据配置描述符选择合适配置(通常选择第一个配置)。
  • 接口初始化​:激活指定接口及端点(如批量传输端点、中断传输端点)。
7. 驱动加载与设备就绪
  • 驱动匹配​:系统根据VID/PID查找匹配驱动,若未找到则提示用户安装。
  • 状态切换​:设备进入"Configured"状态,可进行数据传输。
8. 错误处理机制
  • 超时重试​:主机对未响应请求最多重试3次。
  • 常见故障​:
    现象可能原因解决措施
    设备未被识别端点0包长度错误检查bMaxPacketSize0字段

    10

    枚举中途断开电源不足(超过100mA)优化设备功耗设计
    驱动加载失败VID/PID未注册申请合法厂商ID

    9

 

三、技术要点补充

  1. 描述符树结构​:

  2. 控制传输三阶段​:

    • 建立阶段​:主机发送8字节SETUP包(包含请求类型)
    • 数据阶段​:可选的数据传输(IN/OUT方向)
    • 状态阶段​:设备返回0长度包确认
  3. USB3.0新增特性​:

    • 新增设备能力描述符(Device Capability Descriptor)
    • 支持并行配置请求(减少枚举时间)

四、学习建议

  1. 实践工具​:
    • 使用Wireshark抓包分析枚举过程
    • STM32CubeMX生成基础枚举代码
  2. 调试技巧​:
    • GET_DESCRIPTOR阶段添加断点
    • 监控设备地址切换时的电源状态

通过以上流程,可全面掌握USB枚举机制。建议结合网页9的设备描述符示例和网页4的抓包数据进行实践验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值