嵌入式开发中usb设备枚举流程
嵌入式开发中usb设备枚举流程
一. 简介
本文简单学习一下,嵌入式开发过程中,usb设备的枚举流程。
在嵌入式开发中,USB 设备枚举是设备与主机建立通信的关键过程,主机通过枚举识别设备类型、获取配置信息(如端点、传输模式等),最终为设备分配资源使其进入工作状态。
二. 嵌入式开发中 usb设备枚举流程
在嵌入式开发中,USB 设备的枚举流程是设备插入主机后,从物理连接到被主机识别并配置为可工作状态的全过程。以下是嵌入式视角下的完整枚举流程:
1. 物理连接与设备上电(硬件触发)
主机识别设备接入:嵌入式设备需在硬件上按 USB 规范设置 上拉电阻:高速设备(USB 2.0)在 D+ 线接 1.5kΩ 上拉电阻到 VCC;全速 / 低速设备在 D- 线接 1.5kΩ 上拉电阻。这是主机检测设备插入的关键(主机通过检测 D+/D- 线的电平变化判断有设备接入)。
初始供电:主机通过 VCC 线为设备提供 5V 电压,初始电流限制在 100mA(枚举完成前)。嵌入式设备需设计电源管理电路,确保在低功耗下完成枚举。
2. 主机复位设备(设备进入默认状态)
主机发送复位信号给设备:主机检测到设备插入后,通过将 D+/D- 线拉低(至少 10ms)发送复位信号。
设备响应复位:嵌入式固件需监测总线复位信号,触发内部初始化:
重置设备地址为 0(枚举阶段的临时地址,所有新设备共用)。
初始化 端点 0(控制端点,唯一在默认状态下可用的端点),设置其最大包大小(如 8/16/32/64 字节,需与设备描述符中 bMaxPacketSize0 一致)。
清空之前的缓存和状态,准备接收主机的控制传输请求。
3. 主机读取设备描述符(获取基本信息)
主机以地址 0 向端点 0 发送控制请求,要求获取 设备描述符(类型 0x01)。请求包包含:
描述符类型(设备描述符)、请求长度(通常先请求 8 字节,获取关键信息)。
嵌入式设备响应:固件需解析控制请求,通过端点0 返回设备描述符的前 8 字节(包含 bMaxPacketSize0 等关键信息)。
核心字段:bMaxPacketSize0(端点 0 最大包大小,决定后续控制传输的单位)、bcdUSB(支持的 USB 版本)。
若返回错误(如描述符格式错误),枚举失败,设备无法被识别。
4. 主机分配设备地址(唯一标识)
主机发送 SET_ADDRESS 请求:
主机通过控制传输发送地址分配命令(如地址 0x05),要求设备使用新地址。
设备设置新地址:
嵌入式固件解析请求后,在内部寄存器中设置新地址,并通过端点 0 返回 确认响应(ACK)。
注意:新地址在当前控制传输完成后生效,后续所有通信均使用新地址(地址 0 不再使用)。
5. 主机读取完整描述符集(确定设备功能)
读取完整设备描述符:主机以新地址发送 GET_DESCRIPTOR 请求,获取完整的 18 字节设备描述符,确认 VID(厂商 ID)、PID(产品 ID)、支持的配置数量等。
读取配置描述符:
主机请求获取 配置描述符(类型 0x02)。
嵌入式设备需返回:
配置描述符(9 字节):包含总长度(wTotalLength)、接口数量、供电方式等。
接口描述符(9 字节 / 个):声明设备功能(如存储类、HID 类)、端点数量。
端点描述符(7 字节 / 个):定义端点类型(批量 / 中断)、方向、最大包大小等。
(可选)专用描述符:如 HID 描述符、CDC 描述符(根据设备类型)。
关键:wTotalLength 必须准确,否则主机可能截断读取,导致枚举失败。
读取字符串描述符(可选):主机根据设备描述符中的索引(如制造商、产品名称),请求读取 字符串描述符(类型 0x03)。嵌入式固件需返回 Unicode 编码的字符串(或不支持时返回错误)。
6. 主机选择配置(设备进入工作状态)
主机发送 SET_CONFIGURATION 请求:
主机选择一个配置(通常是默认配置,编号 1),要求设备启用该配置。
设备启用配置:嵌入式固件解析请求后,执行以下操作:
启用配置中声明的接口和端点(除端点 0 外)。
初始化端点硬件(如设置批量端点的缓冲区、中断端点的轮询间隔)。
调整供电模式(如从 100mA 提升到配置描述符中声明的最大电流,如 500mA)。
返回确认响应,进入 配置状态(Configured State)。
7. 枚举完成(设备可正常通信)
此时,嵌入式设备已被主机识别,所有声明的端点(如批量输入端点、中断输出端点)均可用于数据传输。
主机将根据设备的 VID/PID 或接口类加载对应的驱动,设备进入正常工作状态(如 U 盘可被挂载、鼠标可发送坐标数据)。
三. 总结
嵌入式开发中的关键实现要点
描述符组织:固件中需将描述符定义为固定数组(如 const uint8_t device_descriptor[]),按 USB 标准格式填充,确保主机能正确解析。
端点 0 响应:端点 0 是枚举的核心,固件需实现完整的控制传输逻辑(SETUP 阶段解析请求、DATA 阶段发送 / 接收数据、STATUS 阶段返回确认)。
硬件抽象:需对接 USB 控制器硬件(如单片机的 USB 外设),实现底层信号处理(如差分信号接收、CRC 校验、包解析)。
错误处理:对主机的无效请求(如读取不存在的描述符),需返回 STALL 响应,避免枚举中断。
通过以上流程,嵌入式 USB 设备完成从物理连接到被主机识别的全过程,核心是通过标准描述符和控制传输与主机交互,固件实现需严格遵循 USB 规范,才能确保兼容性和可靠性。
更多推荐



所有评论(0)