USB MIDI数据包格式异常排查:LPC1768的MSC传输问题
问题:USB MIDI MSC数据包格式异常排查
设备与通信背景
- 基于LPC1768微控制器的设备,通过USB-C接口(已配置正确下拉电阻)与笔记本USB-A接口通信
- 发送**Midi Show Control(MSC)**数据包,使用USBPcap结合Wireshark捕获分析总线数据
异常现象
- 数据包解析错误:MSC数据从
F0起始到末尾的内容符合MSC规范,但Wireshark将其解析为两个独立的MIDI Event数据包 - 主机响应异常:笔记本主机每次接收数据包后都会回复一个URB_BULK包,该响应未在《USB Device Class Definition for MIDI Devices》或其他MSC相关文档中找到对应说明
- 设备识别异常:设备被系统枚举为USB Composite Device,发送的MSC消息无法被支持MSC的专业软件或数据包嗅探器识别
已尝试的调试操作
- 修改MSC数据包的内容格式
- 调整数据发送时序参数
- 更改数据包长度掩码、RD_EN/WR_EN控制位配置
- 切换传输端点设置
- 修改设备挂载/枚举流程及USB总线初始化逻辑
相关代码片段
端点写入函数(来自mbed OS usbcore.cpp)
#define TxENDPKT (1<<7) #define WR_EN (1<<1) #define LOG_ENDPOINT(ep) ((ep>>1)<<2) void ep_write(uint8_t ep, uint8_t *tbuf, uint32_t len) { uint32_t *buf = (uint32_t*) tbuf; LPC_USB->USBCtrl = LOG_ENDPOINT(ep)|WR_EN; // RD_EN bit and LOG_ENDPOINT LPC_USB->USBTxPLen |= (len & 0x3FF); // write and mask packet length while (!(LPC_USB->USBDevIntSt & TxENDPKT)) { LPC_USB->USBTxData = *buf++; } LPC_USB->USBCtrl = 0; LPC_USB->USBDevIntClr |= TxENDPKT; sie_command(SIE_SEL_EP+ep); // select endpoint sie_command(SIE_VAL_BUFFER); // validate TX buffer }
MSC消息发送函数
/* Takes command byte (0x06 for set), data pointer, and data length. Sends a formatted MSC message over serial. Returns 0 on success. */ int sendMSC(uint8_t command, uint8_t *data, int datalen) { uint8_t msc_packet[] = {0xF0, 0x7F, 0x7F, 0x02, 0x7F, command}; /*[F07F] header, marks univ sys ex/realtime [7F] target device (broadcast) [02] MSC specifier [7F] command format (all)*/ memcpy(msc_packet + 6, data, datalen); //copy data to end of msc packet uint8_t msc_close = 0xF7; //closing octet memcpy(msc_packet + 6 + datalen, &msc_close, 1); if (VERBOSE) { debug(("Sending MSC packet => ")); for (int i = 0; i < 7 + datalen; ++i) { debug(("%x ", msc_packet[i])); } debug(("\n")); } ep_write(EP5, msc_packet, 7 + datalen); return 0; }
USB设备枚举相关结果
- 原配置下:USBTreeView显示设备为USB Composite Device,端点EP5配置为批量输出端点
- 改为HID兼容设备后:设备被枚举为HID类设备,但MSC消息仍无法被目标软件识别
核心疑问
当前发送的数据包与USB MIDI标准格式存在哪些差异?如何修正数据包格式,使MSC消息能被系统及专业软件正确识别?
内容的提问来源于stack exchange,提问作者Nate.Olson
相关产品推荐
相关产品推荐

