打印
[应用方案]

APM32的USB设备数据传输流程分析及实现

[复制链接]
115|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a976209770|  楼主 | 2024-12-10 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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)的格式传输,结构由描述符定义。

三种应用类的对比分析

特性CDCMSCHID
主要功能虚拟串口通信大容量存储设备人机交互设备
传输方式批量传输(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复合设备,支持多种功能类的同时运行。
















使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

31

帖子

0

粉丝