一、基础架构主从模式USB 为严格主从通信架构Host 主机通信唯一发起者只有主机可以发起总线操作。 示例CH32 配置为 USB‑Host、PC 电脑 USB 口。Device 设备被动应答方设备永远不能主动向总线发送任何包只能响应主机的请求。 示例FX3 摄像头、U 盘、鼠标。铁律所有总线动作必须主机先发起设备只能回复应答。端点 Endpoint设备内部通信信箱设备内部划分若干逻辑通信通道称为端点。EP0 控制端点所有 USB 设备强制自带。用于设备枚举、配置、下发命令同时支持 IN、OUT 双向。EP1 / EP2 / EP3 … 普通端点IN 端点设备 → 主机主机读取设备数据本项目 FX3 图像输出为EP3‑IN。OUT 端点主机 → 设备主机向设备下发数据。描述符字段0x83代表逻辑端点EP3‑IN 总线令牌包里面只填写端点编号3IN/OUT 方向由令牌 PID 来区分。四种传输类型传输绑定到端点属性Control 控制传输绑定 EP0 专用设备配置、命令交互可靠传输。Bulk 批量传输大数据传输U 盘、本项目FX3‑UVC 图像流带宽动态分配出错重传。Interrupt 中断传输鼠标键盘 HID 设备小数据、低延迟周期性上报。Isochronous (ISO) 同步传输传统音视频抢占固定带宽允许丢包无重传。⚠️本项目 FX3 固件 UVC 视频流使用 Bulk‑IN 输出图像不是 ISO‑IN。二、总线包 (Packet) 分类USB 总线只有 3 大类包所有通信全部由这三类组合令牌包 Token只有主机可以发送数据包 Data存放业务载荷握手包 Handshake设备回复主机返回操作结果设备不能发送令牌包设备只能发送数据包、握手包。① 令牌包 Token指令包主机发出作用下达总线指令告诉设备访问哪个设备地址、哪个端点执行读 (IN)/ 写 (OUT)。令牌包不携带任何业务数据没有图像、没有 Setup 命令参数仅作为指令头。高速 USB 令牌包组成PID1 字节4bit 类型 4bit 反码校验ADDR (7bit 设备地址) ENDP (4bit 端点号)CRC5对 ADDRENDP 做 5bit 校验关键令牌 PID 列表宏定义值PID 类别功能说明USB_PID_SOF0x05令牌 Token帧起始主机周期性广播标记 USB 帧边界USB_PID_SETUP0x0D令牌 Token启动 SETUP 事务控制传输起始仅主机发出USB_PID_IN0x09令牌 TokenIN 令牌主机请求设备上传数据仅主机发出USB_PID_OUT0x01令牌 TokenOUT 令牌主机向设备下发数据仅主机发出示例IN 令牌设备地址 2端点 3命令设备地址 2 的 EP3把数据发给主机。② 数据包 Data承载真实业务载荷图像数据、描述符、8 字节 Setup 请求结构体全部存放于数据包内。 PIDDATA0/DATA1/DATA2/MDATA实现 toggle 同步机制。 数据包格式PID [0~ 最大包长载荷] CRC16 校验。 高速 Bulk 最大单包载荷512 字节。⚠️重点SETUP 事务中 8 字节USB_SETUP_REQ结构体bmRequestType /bRequest/wValue /wIndex/wLength属于数据包内容不是令牌包宏定义值PID 类别功能说明USB_PID_DATA00x03数据 Data数据包标签 0SETUP 事务强制使用 DATA0USB_PID_DATA10x0B数据 Data数据包标签 1Bulk/Control 交替切换 DATA0/DATA1USB_PID_DATA20x07数据 Data仅高带宽 ISO 使用Bulk/Control 不使用USB_PID_MDATA0x0F数据 Data仅高带宽 ISO 使用Bulk/Control 不使用③ 握手包 Handshake1 字节设备回复主机无业务数据仅返回本次事务执行结果通过硬件状态寄存器获取结果。握手包不会独立出现一定依附在某个事务末尾。宏定义值PID 类别功能说明USB_PID_ACK0x02握手 Handshake应答事务接收成功USB_PID_NAK0x0A握手 Handshake无应答设备暂时无法收发主机需要重试不是报错USB_PID_STALL0x0E握手 Handshake挂起逻辑错误、请求不支持需要清除 STALL 状态USB_PID_NYET0x06握手 Handshake高速 OUT 专用Bulk‑IN 场景不会出现三、USB2.0 事务 Transaction事务USB 总线最小完整交互单元。代码层面调用一次USBHSH_Transact()产生一次事务。事务固定规则一次事务必须以令牌包开头后续可选携带数据包、可选携带握手包。公式事务 令牌包 【数据包】 【握手包】USB2.0 只有3 种事务SETUP 事务、IN 事务、OUT 事务全部 USB 通信由三者拼接。1SETUP 事务仅控制传输 Setup 阶段使用主机发送SETUP 令牌包指定 EP0主机紧接着发送DATA0 数据包固定 DATA0不翻转 toggle装载 8 字节 Setup 请求设备回复握手包ACK成功接收 Setup 包STALL不支持该请求GET_PROBE、SET_COMMIT、GetDescriptor、SetInterface全部依靠 SETUP 事务下发请求。2IN 事务主机读设备本项目 Bulk‑IN 图像流大量使用主机发送IN 令牌包指定端点本项目 EP3设备二选一应答有数据返回 DATA0/DATA1 数据包携带 payload无数据返回 NAK主机后续重新发起 IN 事务如果设备返回数据包主机回复 ACK校验错误直接丢弃不回复 ACK。Bulk‑IN 读取 FX3 图像就是循环不停发起 IN 事务。3OUT 事务主机写数据给设备主机发送OUT 令牌包指定端点主机紧接着发送 DATA0/DATA1 数据包携带下发 payload设备回复握手ACK / NAK / STALL控制传输 Status 状态阶段就是一次 0 字节的 OUT 事务。Toggle (DATA0/DATA1) 翻转规则仅作用于 IN / OUT 事务的数据阶段IN 事务收到数据包 ACK 成功toggle 翻转 DATA0 ↔ DATA1SETUP 事务固定 DATA0不翻转 toggleNAK / STALL 失败场景toggle 保持不变不翻转重点底层直接调用USBHSH_Transact()做 Bulk 收发软件代码必须手动维护 toggle 变量硬件不会自动翻转。示例GET_PROBE 控制‑IN 传输由 3 个事务拼接控制传输Transfer├─事务1SETUP事务SETUP令牌 DATA0数据包 ACK握手├─事务2IN事务IN令牌 DATA1数据包 ACK握手└─事务3OUT事务OUT令牌 0字节DATA0数据包 ACK握手每一个事务对应一次USBHSH_Transact()USBH_ControlTransfer()内部自动多次调用 Transact。四、USB2.0 四大传输类型传输类型主要用途握手重传使用端点Control 控制枚举、GET_PROBE/SET_COMMIT、读描述符有支持重传EP0强制Bulk 批量U 盘、串口、FX3‑UVC Bulk 图像流有支持重传EP1‑EP15Interrupt 中断鼠标键盘 HID、UVC 通知事件有支持重传EP1‑EP15ISO 同步传统音视频无握手不重传EP1‑EP151. Control 控制传输用途设备枚举、参数读写、命令下发仅 EP0。三段式固定结构Setup 阶段 可选数据阶段 Status 状态阶段Setup 阶段SETUP 事务下发 8 字节 Setup 请求数据阶段控制 ININ 事务主机读取设备数据GET_PROBE、读描述符控制 OUTOUT 事务主机下发数据SET_COMMITwLength0 时无数据阶段直接进入 StatusStatus 状态阶段确认本次传输完整结束控制 IN状态阶段为 0 字节 OUT 事务控制 OUT状态阶段为 0 字节 IN 事务示例 1GET_PROBE控制‑INSETUP 事务下发 GET_PROBE 请求IN 事务读取 Probe 结构体0 字节 OUT 事务完成 Status 阶段示例 2SET_COMMIT控制‑OUTSETUP 事务下发 SET_COMMIT 请求OUT 事务下发 commit 参数结构体0 字节 IN 事务完成 Status 阶段代码USBH_ControlTransfer()内部自动调度多次USBHSH_Transact()。2. Bulk 批量传输本项目 FX3 图像流特点存在 ACK/NAK/STALL 握手出错会重传带宽动态分配高速最大包 512 字节。⚠️Bulk 模式 UVC VS 接口Alt Setting 0 就已经存在 Bulk‑IN 端点不需要下发 SetInterface 切换 alt1。下发 SetInterface alt1 会造成 FX3 内部状态机异常。3. Interrupt 中断传输小数据低延迟主机按固定间隔轮询 IN 事务UVC 部分事件通知使用中断端点。4. ISO 同步传输本项目不使用抢占固定 USB 帧带宽无握手包、不重传、允许丢包传统 UVC 摄像头使用。五、本项目 FX3 Bulk‑IN UVC 正确完整业务流程❗本固件图像流为 Bulk‑IN不是 ISO‑IN删除 SetInterface alt1 这一步设备枚举控制传输读取设备描述符、配置描述符、接口描述符GET_PROBE控制‑IN 传输读取设备支持的视频参数SET_COMMIT控制‑OUT 传输下发选定分辨率、帧率参数直接循环 Bulk‑IN 事务EP3‑IN读取图像数据流解析 Bulk 数据包内 UVC 帧头识别图像帧边界注意GET_PROBE / SET_COMMIT 属于 EP0 控制传输真正图像 payload来自后续源源不断的 Bulk‑IN 事务。控制传输成功不等于图像流可以正常输出。关键概念记忆总结包 (Packet)令牌包、数据包、握手包PID 是单个包的身份标识。事务 (Transaction)一次完整总线交互1 次事务 令牌包 【数据包】【握手包】代码对应USBHSH_Transact()。传输 (Transfer)业务层面完整操作由多个事务组合例如控制传输、Bulk 传输。FX3 Bulk‑IN UVC不需要切换 AlternateSetting不要下发 SetInterface alt1。Bulk 收发 IN 事务软件必须手动维护 DATA0/DATA1 toggle。核心层级总结令牌包是总线最小指令单元事务是单令牌驱动的一次完整总线交互而控制传输是由多组不同事务有序拼接而成的完整业务交互流程。