XU316 USB免开发固件通用协议
一、 💡 免开发固件功能范围
- 固件只专注于处理和音频相关的功能,不处理按键,指示灯等和核心功能无关的功能。
- 产品的其他用户交互功能由MCU负责处理。
- MCU和XU316通过UART进行双向通信进行命令和数据交换。
- 固件通过HID和电脑进行通信。
二、XU316与MCU通信协议
1. 底层协议
基于UART (Universal Asynchronous Receiver/Transmitter) 协议
名词说明
名称 | 说明 |
波特率 | 115200 bps |
数据位 | 8 |
奇偶校验 | 无 |
停止位 | 1 |
数据流控 | 无 |
2. 帧格式
字段 | 字节数 | 说明 |
帧头 | 2 | 固定为0x55aa |
版本 | 1 | 协议版本号 |
命令字 | 1 | 指示帧的功能 |
数据长度 | 2 | 后续数据的长度N |
数据 | N | 具体的数据内容 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
注意事项 所有大于1个字节的数据均采用大端模式传输。协议中举例数据为十六进制。
3. XU316启动顺序和MCU交互流程
3.1 上电启动与启动选项阶段(手动上电启动才运行)
步骤:
- XU316启动会发送开始启动命令(命令字0x00) 给MCU,包含UAC1.0 VID/PID、UAC2.0 VID/PID、基础信息CRC和上电配置信息CRC。
- MCU接收启动命令,检查信息是否要更新基础信息和上电配置信息,并发相应的回复给XU316, XU316等待MCU响应启动, 最多3秒。
- 如果300ms未收到响应,XU316重发启动命令最多尝试4次。如果4次都没有收到响应,则直接加载默认USB配置枚举USB。
- MCU响应开始启动命令给XU316,包含启动选项。
- XU316解析启动选项。
3.2 基础信息更新阶段(手动上电启动才运行)
条件:启动选项包含0x01(更新基础产品信息)
- XU316请求读取基础产品信息, 发送0x01命令
- MCU返回新基础产品信息给XU316。
- XU316更新保存配置。
3.3 上电配置获取阶段(手动上电启动才运行)
条件:启动选项包含0x02(更新上电配置)或者从Flash读取数据不完整。
- XU316请求获取上电配置。 发送0x02命令
- MCU返回新上电配置给XU316。
- XU316更新保存配置。
3.4 Loading应用固件阶段
步骤:
- XU316获取当前模式, 发送0x03命令。
- MCU返回当前模式给XU316。
- XU316根据当前模式加载对应模式。
APP运行阶段
步骤:
- XU316获取当前用户配置(音量等), 命令0x04。
- MCU返回当前用户配置给XU316。
- XU316初始化APP并应用当前用户配置。
- XU316发送启动完成命令给MCU, 命令0x05。
- MCU返回完成命令响应给XU316。
4. 命令字列表
命令字 | 命令描述 |
0x00 | 开始启动 |
0x01 | 读取产品信息 |
0x02 | 读取上电配置信息 |
0x03 | 获取当前音频模式 |
0x04 | 获取当前用户配置 |
0x05 | 启动完成命令 |
0x20 | 报告应用状态 |
0x21 | 媒体控制 |
0x22 | 设置播放音频流格式和类型 |
0x23 | 设置音频模式 |
0x24 | 发送播放音量 |
0x25 | 发送录音音量 |
0x01 | HID启动MCU OTA升级命令 |
0x02 | HID发送MCU升级数据包 |
0x03 | HID发送MCU升级结束包 |
注意事项:
- 所有命令都需要遵循基本帧格式
- 部分命令需要等待对方确认响应
- 某些命令在特定条件下才能使用(如OTA相关命令)
- 命令响应超时时间通常为5秒
- 应用命令要在XU316启动命令完成后后再发送相关命令
5. 协议机制
5.1 确认机制
- 所有命令都需要对方回复确认
- 默认命令5秒超时时间,超时后视为失败,除非标注其他超时时间
6. 业务协议
6.1 基础功能命令
6.1.1 开始启动(命令字:0x00)
XU316发送:
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x00 |
数据长度 | 1 | 17 |
数据 | 17 | B0 重启原因:0x00 上电重启,0x01 切换模式重启,0xFF 其他原因重启 |
| | B1-2 unsigned short VID(UAC1.0) |
| | B3-4 unsigned short PID(UAC1.0) |
| | B5-6 unsigned short VID(UAC2.0) |
| | B7-8 unsigned short PID(UAC2.0) |
| | B9-12 unsigned int 基础信息32bit CRC |
| | B13-16 unsigned int 上电配置信息32bit CRC |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回字段描述
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x00 |
数据长度 | 1 | 0x1 |
数据 | 1 | B0 启动选项,见数据字段说明章节 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.1.2 读取产品信息(命令字:0x01)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x01 |
数据长度 | 1 | 0x00 |
数据 | 0 | |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x01 |
数据长度 | 1 | 0x3C (即 60 字节) |
数据 | 60 | 产品基础信息,见业务信息章节 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.1.3 读取上电配置信息(命令字:0x02)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x02 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据,表示没有额外的信息传输 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x02 |
数据长度 | 1 | 0x0E (即 14 字节) |
数据 | 14 | 上电配置信息,见业务信息章节 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.1.4 获取当前音频模式(命令字:0x03)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x03 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据,表示没有额外的信息传输 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x03 |
数据长度 | 1 | 0x05 (即 5 字节) |
数据 | 5 | 音频模式,见数据字段章节 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.1.5 获取当前用户配置(命令字:0x04)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x04 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据,表示没有额外的信息传输 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x04 |
数据长度 | 1 | 0x14 (即 20 字节) |
数据 | 14 | 用户配置参数,见业务信息章节 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.1.6 启动完成命令(命令字:0x05)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x05 |
数据长度 | 1 | 0x15 (即 21 字节) |
数据 | 15 | 启动状态和应用运行参数 |
| | B0: 0 启动成功,1 模式不匹配,其他值 启动失败 |
| | B1-BN: 应用运行参数,见业务信息说明 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x05 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.2 业务控制和查询命令(启动完成后才能发送)
6.2.1 报告应用状态(命令字:0x20)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x00 |
命令字 | 1 | 0x20 |
数据长度 | 1 | 0x14 (即 20 字节) |
数据 | 14 | 应用运行参数,见 业务信息说明 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x20 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.2.2 媒体控制(命令字:0x21)
MCU发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x21 |
数据长度 | 1 | 0x01 (即 1 字节) |
数据 | 1 | 媒体控制命令,见媒体控制字段 |
| | 0x00 音量+ / Vol Up |
| | 0x01 音量- / Vol Down |
| | 0x02 播放 / PLAY |
| | 0x03 下一曲 / NEXT |
| | 0x04 上一曲 / PREV |
| | 0x05 快进 / FORWARD |
| | 0x06 快退 / REWIND |
| | 0x07 静音 / MUTE |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
XU316返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x01 |
命令字 | 1 | 0x21 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.2.3 设置播放音频流格式和类型(命令字:0x22)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x22 |
数据长度 | 1 | 0x02 (即 2 字节) |
数据 | 2 | 音频流格式和类型,见 音频流格式和类型字段 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x01 |
命令字 | 1 | 0x22 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.2.4 设置音频模式(命令字:0x23)
MCU发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x23 |
数据长度 | 1 | 0x05 (即 5 字节) |
数据 | 5 | 音频模式,见 音频模式字段 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
XU316返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x01 |
命令字 | 1 | 0x23 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.2.5 发送播放音量(命令字:0x24)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x24 |
数据长度 | 1 | 0x02 (即 2 字节) |
数据 | 2 | 左声道:0xFF Mute,0-0dB -127:-127dB |
| | 右声道:0xFF Mute,0-0dB -127:-127dB |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x01 |
命令字 | 1 | 0x24 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.2.6 发送录音音量(命令字:0x25)
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x03 |
命令字 | 1 | 0x25 |
数据长度 | 1 | 0x01 (即 1 字节) |
数据 | 1 | 0xFF Mute,0-0dB -127:-127dB |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0x55aa |
版本 | 1 | 0x01 |
命令字 | 1 | 0x25 |
数据长度 | 1 | 0x00 |
数据 | 0 | 无数据 |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.3 MCU OTA升级命令(透传方式)
6.3.1 HID启动MCU OTA升级命令
XU316发送:(HID报告ID1输出报告40字节)
字段 | 字节数 | 说明 |
帧头 | 2 | 0xaa55 |
控制字 | 1 | 0x01 |
扩展字节 | 3 | FileSize |
FileSize | 1 | 数据字段中数据的长度 |
数据 | 32 | 默认为0(此字段用于可能的扩展数据) |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0xaa55 |
控制字 | 1 | 0x01 |
数据 | 4 | |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.3.2 HID发送MCU升级数据包
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0xaa55 |
控制字 | 1 | 0x02 |
扩展字节 | 3 | address:表示升级数据的地址(通常用于指定升级位置或块) |
数据长度 | 1 | data字段中数据的长度 |
数据 | 32 | data |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0xaa55 |
控制字 | 1 | 0x02 |
数据 | 4 | |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
6.3.3 HID发送MCU升级结束包
XU316发送
字段 | 字节数 | 说明 |
帧头 | 2 | 0xaa55 |
控制字 | 1 | 0x03 |
扩展字节 | 3 | 保留(默认为0) |
数据长度 | 1 | data字段中数据的长度 |
数据 | 32 | 保留(默认为0) |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
MCU返回
字段 | 字节数 | 说明 |
帧头 | 2 | 0xaa55 |
控制字 | 1 | 0x03 |
数据 | 4 | |
校验和 | 1 | 从帧头开始按字节求和,结果对256求余 |
7. 业务信息
7.1 产品基础信息
字段 | 字节数 | 说明 |
VID1 | 2 | USB Vendor ID (UAC1.0) |
PID1 | 2 | USB Product ID (UAC1.0) |
VID2 | 2 | USB Vendor ID (UAC2.0) |
PID2 | 2 | USB Product ID (UAC2.0) |
ManufactureName | 16 | USB Manufacture Name (字符串,最大 16 字节) |
ProductName | 16 | USB Product Name (字符串,最大 16 字节) |
SerialNumber | 16 | Product Serial Number (字符串,最大 16 字节) |
CRC | 4 | 对所有字段(VID1, PID1, VID2, PID2, ManufactureName, ProductName, SerialNumber)计算的 32-bit CRC 校验值 |
MCU可以根据XU316传回的的CRC来判断是否需要更新产品基础信息。
7.2 上电配置信息
字段 | 字节数 | 说明 |
默认音频模式 | 5 | 见音频模式字段说明 |
静音时间 | 2 | 0-65535(ms) |
麦克风默认音量 | 1 | 见麦克风音量字段说明 |
DAC左声道默认音量 | 1 | 见DAC音量字段说明 |
DAC右声道默认音量 | 1 | 见DAC音量字段说明 |
CRC | 4 | 对所有字段(默认音频模式、静音时间、麦克风音量、DAC左/右声道音量)计算的 32-bit CRC 校验值 |
MCU可以根据XU316传回的的CRC来判断是否需要更新上电配置信息。
7.3 应用运行参数
字段 | 字节数 | 说明 |
音频模式 | 5 | 见音频模式字段说明 |
静音时间 | 2 | 0-65535(ms) |
麦克风音量 | 1 | 见麦克风音量字段说明 |
DAC左声道音量 | 1 | 见DAC音量字段说明 |
DAC右声道音量 | 1 | 见DAC音量字段说明 |
CRC | 4 | 对所有字段(音频模式、静音时间、麦克风音量、DAC左/右声道音量)计算的 32-bit CRC 校验值 |
7.4 用户配置参数
字段 | 字节数 | 说明 |
音频模式 | 5 | 见音频模式字段说明 |
静音时间 | 2 | 0-65535(ms) |
麦克风音量 | 1 | 见麦克风音量字段说明 |
DAC左声道音量 | 1 | 见DAC音量字段说明 |
DAC右声道音量 | 1 | 见DAC音量字段说明 |
CRC | 4 | 对所有字段(音频模式、静音时间、麦克风音量、DAC左/右声道音量)计算的 32-bit CRC 校验值 |
8. 数据字段说明
8.1 重启原因
长度 | 说明 |
1字节 | 0x00 上电重启 |
| 0x01 切换模式重启 |
| 0xFF 其他原因重启 |
8.2 启动选项
长度 | 说明 |
1字节 | 0x00 使用所有的默认信息 |
| 0x01 需要更新基础产品信息 |
| 0x02 需要更新上电配置信息 |
| 0x04 需要更新IO配置信息 |
8.3 音频模式
长度 | 功能位 | 说明 |
6字节 | | |
BYTE 0 | Bit 7 | I2S Mode:0:Master、1:Slave |
| Bit 6 | Sync Mode: 0:Async、1:Sync |
| Bit 5 | MIDI:0:disable、1:enable |
| Bit 4 | SPDIF in:0:disable、1:enable |
| Bit 3 | SPDIF out:0:disable、1:enable |
| Bit 2 | ADAT in:0:disable、1:enable |
| Bit 1 | ADAT out:0:disable、1:enable |
| Bit 0 | DSD out:0:disable、1:enable |
BYTE 1 | Bit 0-3 | AUDIO Sample Rate: |
| | 0:44.1KHz、1:48KHz、2:88.2KHz、3:96KHz、 |
| | 4:176.4KHz、5:192KHz、6:352.8KHz、7:384KHz、 |
| | 8:705.6KHz、9:768KHz、10:1411.2KHz、11:1536KHz |
| Bit 4 | MQA:0:disable、1:enable |
| Bit 5 | Audio Class: 0:UAC 1.0、1:USB UAC 2.0 |
| Bit 6-7 | AUDIO WIDTH:0:16bit、1:24bit、2:32bit |
BYTE 2-3 | Bit 0-5 | Input:0:disable、x(>0):channel count |
| Bit 6-11 | Output:0:disable、x(>0):channel count |
| Bit 12-15 | Other cfg |
BYTE 4 | | 0:USB MODE、1:OPT MODE、2:COAX MODE、3:BT MODE、 |
| | 4:HDMI ARC MODE、5:WIFI MODE、6:AIRPLAY MODE、7:SPOTIFY MODE |
8.4 麦克风音量
长度 | 说明 |
1字节 | 0xFF Mute |
| 0x00-0xFE 有MCU和HID应用自己定义 |
8.5 DAC音量
长度 | 说明 |
1字节 | 0x00 Mute |
| 0x01-0xFF 有MCU和HID应用自己定义 |
8.6 上电模式
长度 | 说明 |
1字节 | 0x00 默认模式,启动时使用上电配置信息的参数 |
| 0x01 断电记忆模式,启动时使用从MCU获取的用户配置参数 |
8.7 媒体控制(媒体按键)
长度 | 说明 |
1字节 | 0x00 音量+/Vol Up |
| 0x01 音量-/Vol Down |
| 0x02 播放/PLAY |
| 0x03 下一曲/NEXT |
| 0x04 上一曲/PREV |
| 0x05 快进/FORWARD |
| 0x06 快退/REWIND |
| 0x07 静音/MUTE |
8.8 音频流格式和类型
音频流格式
长度 | 说明 |
1字节 | 0x00 AUDIO_PCM_44100 |
| 0x01 AUDIO_PCM_48000 |
| 0x02 AUDIO_PCM_88200 |
| 0x03 AUDIO_PCM_96000 |
| 0x04 AUDIO_PCM_176400 |
| 0x05 AUDIO_PCM_192000 |
| 0x06 AUDIO_PCM_352800 |
| 0x07 AUDIO_PCM_384000 |
| 0x08 AUDIO_PCM_705600 |
| 0x09 AUDIO_PCM_768000 |
| 0x0A AUDIO_PCM_1441200 |
| 0x0B AUDIO_PCM_1536000 |
| 0x0C AUDIO_PCM_32000 |
| 0x0D AUDIO_PCM_64000 |
| 0x0E AUDIO_PCM_128000 |
| 0x0F AUDIO_PCM_256000 |
| 0x10 AUDIO_PCM_512000 |
| 0x11 AUDIO_DSD_64 |
| 0x12 AUDIO_DSD_128 |
| 0x13 AUDIO_DSD_256 |
| 0x14 AUDIO_DSD_512 |
| 0x15 AUDIO_DSD_1024 |
| 0x16 AUDIO_MQA_44100 |
| 0x17 AUDIO_MQA_88200 |
| 0x18 AUDIO_MQA_176400 |
| 0x19 AUDIO_MQA_352800 |
| 0x1A AUDIO_MQA_705600 |
| 0x1B AUDIO_MQA_1411200 |
| 0x1C AUDIO_MQA_2822400 |
| 0x1D AUDIO_MQA_5644800 |
| 0x1E AUDIO_MQA_48000 |
| 0x1F AUDIO_MQA_96000 |
| 0x20 AUDIO_MQA_192000 |
| 0x21 AUDIO_MQA_384000 |
| 0x22 AUDIO_MQA_768000 |
| 0x23 AUDIO_MQA_1536000 |
| 0x24 AUDIO_MQA_3072000 |
| 0x25 AUDIO_MQA_6144000 |
| 0x26 AUDIO_MQA_64000 |
| 0x27 AUDIO_MQA_128000 |
| 0x28 AUDIO_MQA_256000 |
| 0x29 AUDIO_MQA_512000 |
| 0x2A AUDIO_MQA_1024000 |
| 0x2B AUDIO_MQA_2048000 |
| 0x2C AUDIO_MQA_4096000 |
| 0x2D AUDIO_MQA_8192000 |
| 0xFF AUDIO_NO_USED |
音频类型
长度 | 说明 |
1字节 | 0x00 PCM |
| 0x01 Reserve |
| 0x02 MQA |
| 0x03 MQB |
| 0x04 MQA_Studio |
| 0x05 DSD |