无CDC数据接口类的CDC设备USB主机通信及NXP i.MX RT适配问题
需求背景
我需要使用NXP i.MX RT系列微控制器与一款USB CDC功率计(以虚拟串口VCP形式呈现,下文简称“该设备”)通信。
遇到的问题
- 在NXP评估板上运行NXP SDK提供的USB CDC Host示例项目时,连接该设备后显示“不支持”;
- 用STM32L4评估板搭载USB CDC Device示例代码测试,可被NXP评估板成功识别并枚举;
- 通过USBView查看该设备描述符:设备类描述符为
0x00(接口类定义设备),接口描述符中bInterfaceClass=0x02(通信及CDC控制类)、bInterfaceSubClass=0x02、bInterfaceProtocol=0x01,属于CDC控制类接口设备,但缺少常规CDC设备具备的CDC数据接口类(0x0A)。
咨询问题
- 若CDC设备无需数据接口类,USB CDC主机如何处理数据收发?是否通过控制接口传输?
- 熟悉NXP i.MX RT系列MCU的开发者,如何让该设备被MCU识别为支持的CDC设备?
问题1:无数据接口类的CDC设备数据收发方式
根据USB CDC规范,常规VCP设备会包含一个CDC控制接口(类0x02)和一个CDC数据接口(类0x0A),数据接口负责批量传输串口数据。但如果设备仅保留控制接口,数据收发只能通过控制接口的标准请求(如SET_LINE_CODING/GET_LINE_CODING)或厂商自定义控制请求实现——这种设计属于简化版CDC控制设备,而非标准虚拟串口。
你需要查阅该功率计的厂商文档,确认它是否通过控制端点传输测量数据,或是否存在未识别的隐藏接口(比如复合设备的其他接口)。若确实仅依赖控制接口,主机端需实现对应控制请求的处理逻辑来完成数据收发。
问题2:让NXP i.MX RT识别该特殊CDC设备
NXP SDK的USB CDC Host示例默认只兼容标准VCP配置(控制接口+数据接口的组合),因此你的特殊设备会被判定为“不支持”,可通过以下步骤修改适配:
修改设备匹配逻辑
找到SDK中CDC Host的枚举代码(通常在usb_host_cdc.c或同类文件中),默认逻辑会检查设备是否同时包含0x02类控制接口和0x0A类数据接口。你需要调整这部分逻辑,允许仅存在0x02类接口(且bInterfaceSubClass=0x02、bInterfaceProtocol=0x01)的设备通过匹配。适配控制接口收发逻辑
若设备通过控制接口传输数据,需在CDC Host驱动中添加对应的控制请求处理函数,替代原本依赖数据接口的批量传输逻辑。例如实现自定义CDC_ControlTransfer函数,发送厂商指定的控制请求读取功率计数据。调试枚举流程
修改后重新编译下载,开启USB调试日志(SDK通常提供USB_HOST_DEBUG_LEVEL配置),确认设备描述符被正确解析、接口匹配逻辑通过。若仍有问题,检查设备配置描述符是否包含有效端点信息(控制接口至少需要一个控制端点)。参考STM32兼容逻辑
既然STM32的CDC Host能识别该设备,可对比两者枚举逻辑的差异,将STM32中对单接口CDC设备的兼容逻辑移植到NXP SDK中。
内容的提问来源于stack exchange,提问作者dapoorpokeguide

