本帖最后由 a976209770 于 2024-12-10 11:37 编辑
1. USB相关基础知识
USB(通用串行总线)是一种高速、可靠的通信协议,用于实现计算机与外设之间的数据交换。它支持多种设备类型,采用灵活的端点机制传输数据,适应不同的应用场景。
USB在设备模式下支持多种应用类,其中 CDC(虚拟串口通信)、MSC(大容量存储)、HID(人机交互设备)是最常见的三种类型。它们广泛用于调试、存储和交互等领域,具有不同的特点和适用场景。
1.1. CDC(Communications Device Class)
- 功能:将设备作为虚拟串口连接到主机,实现串口通信功能。
- 应用场景:
- 调试工具:通过虚拟串口输出调试信息。
- 通信模块:设备与主机之间的数据交互。
- 特点:
- 基于批量传输(Bulk Transfer),支持高效数据传输。
- 无特定数据格式,适合灵活通信。
1.2. MSC(Mass Storage Class)
- 功能:将设备作为大容量存储设备连接到主机,使其被识别为U盘或外部硬盘。
- 应用场景:
- 文件传输:数据备份与共享。
- 固件升级:通过主机写入新固件至设备。
- 特点:
- 基于SCSI命令控制数据流。
- 支持文件系统存储,数据格式需符合块存储结构。
1.3. HID(Human Interface Device Class)
- 功能:用于实现人机交互设备,如键盘、鼠标和触控板。
- 应用场景:
- 鼠标、键盘:输入设备。
- 游戏手柄、遥控器:控制设备。
- 特点:
- 使用中断传输(Interrupt Transfer),低延迟、高响应。
- 数据以报告(Report)的格式传输,结构由描述符定义。
三种应用类的对比分析
特性 | CDC | MSC | HID | 主要功能 | 虚拟串口通信 | 大容量存储设备 | 人机交互设备 | 传输方式 | 批量传输(Bulk Transfer) | 批量传输(Bulk Transfer) | 中断传输(Interrupt Transfer) | 典型数据格式 | 无固定格式,数据流传输 | 基于SCSI命令块 | 报告(Report),由描述符定义 | 适用场景 | 调试工具,通信模块 | 文件传输,固件升级 | 键盘、鼠标、游戏手柄 | 传输延迟 | 中 | 中 | 低 | 实现复杂度 | 较低 | 较高(需支持SCSI协议) | 较低 | 数据流方向 | 全双工(主机与设备双向通信) | 单向或双向(基于SCSI命令) | 主机轮询,设备定期响应 | 典型接口配置 | 1个控制端点,2个批量传输端点 | 1个控制端点,2个批量传输端点 | 1个控制端点,1个中断端点 |
总结与适用性
- MSC 适合数据存储需求较大的设备,如U盘和存储模块。
- HID 则专注于低延迟的交互式设备,如鼠标、键盘。
- CDC 适合需要灵活通信的调试工具或通信模块。
2. APM32 USB设备功能实现
以下详细分析APM32实现USB CDC、MSC和HID功能的数据传输流程,包括主要函数和数据格式。
2.1.CDC数据传输实现
- 工作流程:
- 初始化USB设备,设置CDC所需端点。
- 使用批量传输端点与主机进行数据交互。
- 主机通过虚拟串口发送数据,设备解析数据并返回响应。
- 关键代码:
ARM_DRIVER_USBD *usbd = &Driver_USBD0;
// 初始化 USB 设备
usbd->Initialize(USB_DeviceEventCallback, USB_EndpointEventCallback);
usbd->PowerControl(ARM_POWER_FULL);
usbd->DeviceConnect();
// 配置 CDC 批量端点
usbd->EndpointConfigure(0x01, ARM_USB_ENDPOINT_BULK, 64); // OUT
usbd->EndpointConfigure(0x82, ARM_USB_ENDPOINT_BULK, 64); // IN
// 数据发送
usbd->EndpointTransfer(0x82, data_to_send, data_length);
2.2.MSC数据传输实现
- 工作流程:
- 初始化USB设备,配置MSC所需的批量端点。
- 主机发送SCSI命令,设备解析命令后完成数据传输。
- 关键代码:
// 配置 MSC 批量端点
usbd->EndpointConfigure(0x01, ARM_USB_ENDPOINT_BULK, 512); // OUT
usbd->EndpointConfigure(0x82, ARM_USB_ENDPOINT_BULK, 512); // IN
// 解析 SCSI 请求
if (scsi_command == READ) {
usbd->EndpointTransfer(0x82, data_from_memory, data_length);
} else if (scsi_command == WRITE) {
usbd->EndpointTransfer(0x01, data_to_memory, data_length);
}
2.3.HID数据传输实现
- 工作流程:
- 初始化USB设备,设置HID描述符。
- 设备通过中断端点向主机定期发送数据。
- 主机可以向设备发送控制信息。
- 关键代码:
// 配置 HID 中断端点
usbd->EndpointConfigure(0x81, ARM_USB_ENDPOINT_INTERRUPT, 64); // IN
usbd->EndpointConfigure(0x01, ARM_USB_ENDPOINT_INTERRUPT, 64); // OUT
// 数据传输:发送 HID 输入报告
usbd->EndpointTransfer(0x81, hid_input_report, sizeof(hid_input_report));
// 数据接收:处理主机发送的 HID 输出报告
usbd->EndpointTransfer(0x01, hid_output_report, sizeof(hid_output_report));
数据格式:
- 输入报告(Input Report):用于设备发送数据到主机,例如鼠标移动
Byte 0: 按键状态(左键、右键)
Byte 1: X轴移动量
Byte 2: Y轴移动量
- 输出报告(Output Report):用于主机控制设备,例如控制LED状态:
Byte 0: LED指示灯状态(Caps Lock, Num Lock)
3.总结
- CDC:虚拟串口功能,简单高效,适合调试和通信模块。
- MSC:大容量存储功能,支持文件传输,复杂度较高。
- HID:低延迟交互功能,用于人机交互设备。
APM32通过配置合适的端点和描述符,可以轻松实现USB复合设备,支持多种功能类的同时运行。
|