USB 教程合集 - 总目录
本讲目标
理解标准设备类与厂商自定义类的区别,认识 HID、CDC、MSC、Audio 和 Video 等常见类别。
一、如果每家厂商都自己定义协议,会发生什么?
假设有十家厂商生产 USB 键盘,每家都使用完全不同的数据格式。
那么操作系统就可能需要针对每一家厂商开发一套驱动,用户使用和维护起来都会非常麻烦。
USB 类规范就是为了解决这类问题而设计的。
它通过统一设备的行为、请求和数据格式,让操作系统可以使用通用驱动支持符合规范的设备。
因此,USB Class 不只是一个编号,而是一套通信约定。
二、常见的 USB 设备类
2.1 HID:人机接口设备
HID(Human Interface Device)常见于键盘、鼠标和许多游戏手柄。
HID 的一个重要特点是使用报告描述符(Report Descriptor)描述数据格式。操作系统根据这些信息理解设备上报的数据。
2.2 CDC:通信设备类
CDC(Communication Device Class)包含多种通信设备子类。
其中,CDC ACM 常用于实现 USB 虚拟串口。电脑上可能出现 COM 端口,应用程序可以通过串口 API 收发数据。
不过,虚拟串口并不意味着 USB 线上真的存在 UART 的 TX/RX 信号。
2.3 MSC:大容量存储类
MSC(Mass Storage Class)用于 U 盘等存储设备。
这类设备通常使用批量端点,并配合相应的存储命令协议,让操作系统能够读取和写入存储介质。
2.4 Audio:音频类
USB Audio 用于声卡、麦克风、扬声器等设备,涉及音频数据格式、采样率和相关控制机制。
2.5 Video:视频类
USB Video Class,通常简称 UVC,是 USB 摄像头常见的标准类别之一。
它定义了设备如何描述视频功能、协商格式以及传输视频数据。
三、标准类与厂商自定义类有什么区别?
标准类的优势是兼容性。
只要设备遵守相应类规范,并且目标操作系统具有合适的驱动支持,通常就可以利用系统提供的通用驱动。
厂商自定义类则不同。
当接口类代码声明为FFh时,通常表示厂商自定义接口。此时,厂商可以定义自己的命令和数据格式,但 Host 端也需要有能够理解这些协议的软件或驱动。
这里必须强调:
仅仅把接口类代码设置为FFh,并不会自动产生一套可用的通信协议。
你仍然需要定义数据格式、命令、响应、错误处理和 Host 端的访问方式。
四、一个设备可以同时使用不同的类吗?
可以。
例如,一个 USB 设备可能包含:
USB Device | └── Configuration | ├── HID Interface | └── CDC InterfaceHID 接口负责按键和状态上报,CDC 接口负责调试信息或命令通信。
这类设备涉及多个接口的组织方式,我们将在第8讲中详细介绍。
五、单片机开发中应该怎么选?
如果目标是实现键盘或鼠标,通常优先考虑 HID。
如果目标是让电脑通过串口助手收发数据,CDC ACM 往往比较方便。
如果目标是实现 U 盘功能,需要考虑 MSC 以及相应的存储协议。
如果标准类无法满足需求,才进一步评估厂商自定义接口是否合适。
选择之前,最好确认目标操作系统、驱动绑定方式、开发 SDK 和后续维护成本。
六、本讲小结
USB Class 是 Host 与 Device 之间的一套标准化约定。
标准类通常能够减少驱动开发工作量;厂商自定义类则提供更大的灵活性,但也需要自行维护两端的通信协议。
留给下一讲的问题
能不能亲手实现一个 USB 虚拟串口,让开发板插入电脑后出现 COM 端口,并通过串口助手完成数据收发?
下一讲,我们开始第一个实战项目:CDC 虚拟串口。