XMOS EQ UART 控制协议与命令集¶
1. 协议基础规范¶
1.1 底层通信协议¶
EQ Designer使用串口协议进行主机与设备之间的通信。协议基于XU316零代码协议规范,支持EQ参数设置、读取、模式切换等功能。
| 参数 | 值 |
|---|---|
| 波特率 | 115200 bps |
| 数据位 | 8 |
| 奇偶校验 | 无 |
| 停止位 | 1 |
| 数据流控 | 无 |
1.2 帧格式与数据传输¶
通用帧格式 所有命令和响应均遵循以下帧格式:
| 字段 | 字节数 | 说明 |
|---|---|---|
| 帧头 | 2 | 固定为 0x55 0xAA |
| 版本 | 1 | 协议版本号 (通常为 0x00) |
| 命令字 | 1 | EQ命令码 (0x40-0x5C) |
| 数据长度 | 1 | 后续数据的长度 N |
| 数据 | N | 具体的数据内容 |
| 校验和 | 1 | 从帧头开始按字节求和,结果对 256 求余 (Sum % 256) |
数据包字段示例
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 版本 | 协议版本 (0x00)
3 | 1 | 命令 | EQ命令码 (0x40-0x5C)
4 | 1 | 长度 | 数据长度
5-N | N | 数据 | 命令数据
N+1 | 1 | 校验 | 校验和
数据传输说明
- 字节序:所有大于1个字节的数据均采用 小端模式 (Little Endian) 传输(注:与XU316标准协议的大端序不同,请以本协议为准)。
- 浮点数:遵循 IEEE 754 float 格式。
2. 协议命令集¶
2.1 命令分类概览¶
| 命令字 | 命令描述 | 发送方向 | 功能说明 |
|---|---|---|---|
| 0x40 | SET_EQ_MODE | 主机→设备 | 切换EQ模式 |
| 0x41 | GET_EQ_MODE | 主机→设备 | 获取当前EQ模式信息 |
| 0x42 | SET_MODE_GAIN_AND_NAME | 主机→设备 | 设置模式整体增益和名称 |
| 0x43 | SET_EQ_PARAMS | 主机→设备 | 发送EQ参数 |
| 0x44 | GET_EQ_PARAMS | 主机→设备 | 读取EQ参数 |
| 0x45 | GET_DEVICE_INFO | 主机→设备 | 获取设备信息 |
| 0x46 | RESET_EQ_PARAMS | 主机→设备 | 复位EQ参数 |
| 0x47 | GET_EQ_MODE_COUNT | 主机→设备 | 获取EQ模式总数 |
| 0x48 | SET_AND_SAVE_EQ_MODE | 主机→设备 | 设置并保存EQ模式 |
| 0x49 | SET_VOLUME | 主机→设备 | 设置音量级别 |
| 0x4A | GET_VOLUME | 主机→设备 | 获取音量级别 |
| 0x4B | GET_LED_INFO | 主机→设备 | 获取LED信息 |
| 0x4C | SET_LED_SWITCH | 主机→设备 | 设置LED开关 |
| 0x4D | GET_LED_SWITCH | 主机→设备 | 获取LED开关 |
| 0x4E | GET_LED_STATUS | 主机→设备 | 获取LED状态 |
| 0x4F | GET_LED_COUNT | 主机→设备 | 获取LED总数 |
| 0x50 | GET_UAC_MODE_INFO | 主机→设备 | 获取UAC模式信息 |
| 0x51 | SET_UAC_MODE | 主机→设备 | 设置UAC模式 |
| 0x52 | GET_CURRENT_UAC_MODE | 主机→设备 | 获取当前UAC模式 |
| 0x53 | SET_EQ_ENABLE | 主机→设备 | 设置EQ使能开关 |
| 0x54 | GET_EQ_ENABLE | 主机→设备 | 获取EQ使能开关 |
| 0x55 | GET_SAMPLE_FORMAT | 主机→设备 | 获取采样率和格式 |
| 0x56 | SET_GAIN_MODE | 主机→设备 | 设置增益模式 |
| 0x57 | GET_GAIN_MODE | 主机→设备 | 获取增益模式 |
| 0x58 | SET_FILTER_MODE | 主机→设备 | 设置滤波器模式 |
| 0x59 | GET_FILTER_MODE | 主机→设备 | 获取滤波器模式 |
| 0x5A | SET_GAME_MODE | 主机→设备 | 设置游戏模式 |
| 0x5B | GET_GAME_MODE | 主机→设备 | 获取游戏模式 |
| 0x5C | GET_FIRMWARE_VERSION | 主机→设备 | 获取固件版本 |
3. 基础功能命令详解¶
3.1 0x40 - SET_EQ_MODE (切换EQ模式)¶
功能: 切换当前EQ模式
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x40 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 模式值 (0-5: 预设模式, 6-8: 用户模式, 9: bypass)
6 | 1 | 校验 | 校验和
设备端处理:
- 直接设置
g_current_eq_mode = data[5] - 不进行参数传输或计算
3.2 0x41 - GET_EQ_MODE (读取EQ模式信息)¶
功能: 读取EQ模式信息
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x41 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 模式值 (0-9: 有效模式值, 0xFF: 获取当前模式信息)
6 | 1 | 校验 | 校验和
设备端处理:
- 如果mode值为0xFF,返回当前模式值、整体增益和模式名称
- 如果mode值为有效模式值(0-9),返回指定模式值、整体增益和模式名称
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x41 | 命令码
4 | 1 | 0x15 | 数据长度 (21字节)
5 | 1 | uint8 | 模式值 (当前模式或指定模式)
6-9 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数)
10-25 | 16 | char | 模式名称 (UTF-8编码,16字节)
26 | 1 | 校验 | 校验和
使用说明:
- 发送mode=0xFF时,返回当前激活的EQ模式信息
- 发送mode=0-9时,返回指定模式的增益和名称信息(不切换当前模式)
3.3 0x42 - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称)¶
功能: 设置EQ模式整体增益和名称
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x42 | 命令码
4 | 1 | 0x15 | 数据长度 (21字节)
5 | 1 | uint8 | 模式值 (0-9)
6-9 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数)
10-25 | 16 | char | 模式名称 (UTF-8编码,16字节)
26 | 1 | 校验 | 校验和
设备端处理:
- 解析模式值、增益值和模式名称
- 设置指定模式的EQ整体增益和名称到所有采样率的左右通道
- 支持所有采样率:44100, 48000, 88200, 96000, 176400, 192000 Hz
3.4 0x43 - SET_EQ_PARAMS (发送EQ参数)¶
功能: 发送单个滤波器的参数
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x43 | 命令码
4 | 1 | 0x13 | 数据长度 (19字节: 1字节模式 + 1字节索引 + 1字节类型 + 4个float参数共16字节)
5 | 1 | uint8 | 模式值 (0-9)
6 | 1 | uint8 | 滤波器Band索引 (0-7)
7 | 1 | uint8 | 滤波器类型
8-11 | 4 | float | 中心频率 (Hz)
12-15 | 4 | float | Q值
16-19 | 4 | float | 带宽 (Hz)
20-23 | 4 | float | 增益 (dB)
24 | 1 | 校验 | 校验和
滤波器类型码:
| 类型码 | 滤波器类型 |
|---|---|
| 0x00 | bypass滤波器 |
| 0x01 | 全通滤波器 |
| 0x02 | 峰值滤波器 |
| 0x03 | 低通滤波器 |
| 0x04 | 高通滤波器 |
| 0x05 | 带通滤波器 |
| 0x06 | 带阻滤波器 |
| 0x07 | 陷波滤波器 |
| 0x08 | 恒定Q值滤波器 |
| 0x09 | 低架滤波器 |
| 0x0A | 高架滤波器 |
设备端处理:
- 解析参数并存储到所有采样率的对应模式中
- 调用
eq_calculate_coefficients_from_params()计算系数 - 存储计算出的系数到所有采样率的对应模式中
- 自动应用到所有采样率:44100, 48000, 88200, 96000, 176400, 192000 Hz
3.5 0x44 - GET_EQ_PARAMS (读取EQ参数)¶
功能: 读取单个滤波器的参数
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x44 | 命令码
4 | 1 | 0x02 | 数据长度
5 | 1 | uint8 | 模式值 (0-9)
6 | 1 | uint8 | EQ索引 (0-7)
7 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x44 | 命令码
4 | 1 | 0x13 | 数据长度 (19字节: 1字节模式 + 1字节索引 + 1字节类型 + 4个float参数共16字节)
5 | 1 | uint8 | 模式值 (0-9)
6 | 1 | uint8 | 滤波器Band索引 (0-7)
7 | 1 | uint8 | 滤波器类型
8-11 | 4 | float | 中心频率 (Hz)
12-15 | 4 | float | Q值
16-19 | 4 | float | 带宽 (Hz)
20-23 | 4 | float | 增益 (dB)
24 | 1 | 校验 | 校验和
3.6 0x45 - GET_DEVICE_INFO (获取设备信息)¶
功能: 获取设备基本信息
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x45 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x45 | 命令码
4 | 1 | 0x34 | 数据长度 (52字节: 2字节PID + 2字节VID + 16字节产品 + 16字节厂商 + 16字节序列号)
5-6 | 2 | uint16 | 产品ID (PID, 小端序)
7-8 | 2 | uint16 | 厂商ID (VID, 小端序)
9-24 | 16 | char | 产品字符串 (UTF-8编码,16字节)
25-40 | 16 | char | 厂商字符串 (UTF-8编码,16字节)
41-56 | 16 | char | 序列号字符串 (UTF-8编码,16字节)
57 | 1 | 校验 | 校验和
3.7 0x46 - RESET_EQ_PARAMS (复位EQ参数)¶
功能: 删除客户定制EQ参数并恢复预设参数
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x46 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 模式号 (0-9, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 )
6 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x46 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败)
6 | 1 | 校验 | 校验和
设备端处理:
- 删除指定模式在Flash中存储的EQ参数文件
- 删除增益和模式名称的Flash存储文件
- 恢复该模式的头文件预设参数
- 如果模式号为0xFF,则复位所有模式
- 返回操作状态
3.8 0x47 - GET_EQ_MODE_COUNT (获取EQ模式总数)¶
功能: 获取预定义加用户模式的总数(不包含禁用模式)
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x47 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x57 | 命令码
4 | 1 | 0x02 | 数据长度 (2字节)
5 | 1 | uint8 | 模式总数 (当前为9,包含0-8共9个模式,不包含禁用模式)
6 | 1 | uint8 | 预定义模式数量 (当前为6,包含0-5共6个预设模式)
7 | 1 | 校验 | 校验和
3.9 0x48 - SET_AND_SAVE_EQ_MODE (设置并保存EQ模式)¶
功能: 设置当前EQ模式并保存到Flash,开机时自动恢复
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x48 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 模式值 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass)
6 | 1 | 校验 | 校验和
设备端处理:
- 将模式值保存到Flash
- 开机时自动从Flash读取并恢复该模式
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x48 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败)
6 | 1 | 校验 | 校验和
3.10 0x49 - SET_VOLUME (设置音量级别)¶
功能: 设置设备音量级别
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x49 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 音量级别 (0-60: 0=最小音量, 60=最大音量)
6 | 1 | 校验 | 校验和
参数说明:
- 音量级别范围: 0-60(共61级)
- 说明: 控制设备的输出音量级别
- 0: 最小音量(约-127.5dB)
- 60: 最大音量(0dB)
- 每级约2dB的衰减变化
设备端处理:
- 参数会通过现有的定时保存机制自动保存到Flash
- 如果参数超出范围(>60),固件将拒绝设置并返回false
3.11 0x4A - GET_VOLUME (获取音量级别)¶
功能: 读取设备当前音量级别
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4A | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4A | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 当前音量级别 (0-60)
6 | 1 | 校验 | 校验和
3.12 0x4B - GET_LED_INFO (获取LED信息)¶
功能: 读取LED索引和LED名称
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4B | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0)
6 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4B | 命令码
4 | 1 | 0x11 | 数据长度 (17字节)
5 | 1 | uint8 | LED索引 (0-7)
6-21 | 16 | char | LED名称 (UTF-8编码,16字节)
22 | 1 | 校验 | 校验和
3.13 0x4C - SET_LED_SWITCH (设置LED开关)¶
功能: 设置LED开关状态
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4C | 命令码
4 | 1 | 0x02 | 数据长度
5 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0)
6 | 1 | uint8 | LED开关 (0=OFF关闭, 1=ON开启)
7 | 1 | 校验 | 校验和
设备端处理:
- 当LED开关为OFF时,所有LED输出都被禁用,不显示任何LED
- 当LED开关为ON时,LED正常显示
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4C | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败)
6 | 1 | 校验 | 校验和
3.14 0x4D - GET_LED_SWITCH (获取LED开关)¶
功能: 读取LED开关状态
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4D | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0)
6 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4D | 命令码
4 | 1 | 0x02 | 数据长度
5 | 1 | uint8 | LED索引 (0-7)
6 | 1 | uint8 | LED开关 (0=OFF关闭, 1=ON开启)
7 | 1 | 校验 | 校验和
3.15 0x4E - GET_LED_STATUS (获取LED状态)¶
功能: 读取LED RGB颜色和状态
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4E | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0)
6 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4E | 命令码
4 | 1 | 0x05 | 数据长度
5 | 1 | uint8 | LED索引 (0-7)
6 | 1 | uint8 | R颜色值 (0-255)
7 | 1 | uint8 | G颜色值 (0-255)
8 | 1 | uint8 | B颜色值 (0-255)
9 | 1 | uint8 | LED状态 (0=熄灭, 1=常亮, 2=慢闪, 3=快闪, 4=呼吸)
10 | 1 | 校验 | 校验和
LED状态枚举:
- 0: LED_STATUS_OFF (熄灭)
- 1: LED_STATUS_SOLID (常亮)
- 2: LED_STATUS_SLOW_BLINK (慢闪)
- 3: LED_STATUS_FAST_BLINK (快闪)
- 4: LED_STATUS_BREATHE (呼吸)
注意:
- RGB颜色值基于当前LED颜色定义转换(低电平有效)
- LED状态基于当前LED显示模式(常亮/闪烁)判断
3.16 0x4F - GET_LED_COUNT (获取LED总数)¶
功能: 读取设备支持的LED总数
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4F | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x4F | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | LED总数 (当前设备为1)
6 | 1 | 校验 | 校验和
设备端处理:
- 返回设备支持的LED总数
- 当前设备只有1个LED,所以返回1
- LED索引范围为0到(LED总数-1)
3.17 0x50 - GET_UAC_MODE_INFO (获取UAC模式信息)¶
功能: 读取UAC模式总数和模式名称列表
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x50 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x50 | 命令码
4 | 1 | 0x11 | 数据长度 (17字节)
5 | 1 | uint8 | UAC模式总数 (当前为2,包含UAC1.0和UAC2.0)
6-13 | 8 | char | 模式0名称 (UTF-8编码,8字节,如"UAC2.0")
14-21 | 8 | char | 模式1名称 (UTF-8编码,8字节,如"UAC1.0")
22 | 1 | 校验 | 校验和
设备端处理:
- 返回UAC模式总数(当前为2)
- 返回每个模式的名称(不超过8个字符)
- 模式0对应UAC2.0,模式1对应UAC1.0
3.18 0x51 - SET_UAC_MODE (设置UAC模式)¶
功能: 设置UAC模式(UAC1.0或UAC2.0)
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x51 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | UAC模式值 (0=UAC2.0, 1=UAC1.0)
6 | 1 | 校验 | 校验和
设备端处理:
- 设置UAC模式并重启设备
- 注意:设备重启后不会返回响应
3.19 0x52 - GET_CURRENT_UAC_MODE (获取当前UAC模式)¶
功能: 读取当前UAC模式
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x52 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x52 | 命令码
4 | 1 | 0x09 | 数据长度 (9字节)
5 | 1 | uint8 | 当前UAC模式值 (0=UAC2.0, 1=UAC1.0)
6-13 | 8 | char | 当前UAC模式名称 (UTF-8编码,8字节,如"UAC2.0"或"UAC1.0")
14 | 1 | 校验 | 校验和
设备端处理:
- 返回当前UAC模式名称(不超过8个字符)
3.20 0x53 - SET_EQ_ENABLE (设置EQ使能开关)¶
功能: 设置EQ使能开关(启用/禁用)
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x53 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | EQ使能开关 (0=OFF禁用, 1=ON启用)
6 | 1 | 校验 | 校验和
设备端处理:
- 只保存EQ使能状态到Flash(独立文件存储),不影响已保存的模式
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x53 | 命令码
4 | 1 | 0x02 | 数据长度
5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败)
6 | 1 | uint8 | 当前EQ使能状态 (0=OFF, 1=ON)
7 | 1 | 校验 | 校验和
3.21 0x54 - GET_EQ_ENABLE (获取EQ使能开关)¶
功能: 读取EQ使能开关状态
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x54 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x54 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | EQ使能开关状态 (0=OFF禁用, 1=ON启用)
6 | 1 | 校验 | 校验和
设备端处理:
- 返回当前EQ使能开关状态(0=OFF, 1=ON)
3.22 0x55 - GET_SAMPLE_FORMAT (获取采样率和格式)¶
功能: 读取当前采样率和DSD模式
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x55 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x55 | 命令码
4 | 1 | 0x05 | 数据长度 (5字节)
5-8 | 4 | uint32 | 采样率 (samFreq,小端序,单位:Hz)
9 | 1 | uint8 | DSD模式 (dsdMode: 0=PCM, 1=DOP, 2=Native DSD)
10 | 1 | 校验 | 校验和
设备端处理:
- 返回当前采样率(32位无符号整数,小端序,单位:Hz)
- 返回DSD模式(0表示PCM格式,>0表示DSD格式)
- 设备会在采样率或DSD模式发生变化时自动上报此信息(通过UART主动发送)
自动上报机制:
- 设备中监控采样率和DSD模式的变化
- 当这些值发生变化时,设备会自动构建0x55响应数据包并通过UART主动发送
3.23 0x56 - SET_GAIN_MODE (设置增益模式)¶
功能: 设置增益模式
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x56 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 增益模式值 (0=低阻, 1=高阻)
6 | 1 | 校验 | 校验和
参数说明:
- 增益模式范围: 0-1
- 说明: 控制设备的增益档位
- 0: 低阻模式(适合高灵敏度耳机)
- 1: 高阻模式(适合高阻抗耳机)
设备端处理:
- 参数会通过现有的定时保存机制自动保存到Flash
3.24 0x57 - GET_GAIN_MODE (获取增益模式)¶
功能: 读取设备当前增益模式
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x57 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x57 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 当前增益模式 (0=低阻, 1=高阻)
6 | 1 | 校验 | 校验和
3.25 0x58 - SET_FILTER_MODE (设置滤波器模式)¶
功能: 设置滤波器模式
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x58 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 滤波器模式值 (0-7: 8种滤波器模式)
6 | 1 | 校验 | 校验和
参数说明:
- 滤波器模式范围: 0-7(共8种模式)
- 说明: 选择DAC的数字滤波器类型
- 0: Minimum Phase filter (default)
- 1: Linear Phase Apodizing Fast Roll-off filter
- 2: Linear phase fast roll-off filter
- 3: Linear Phase Fast Roll-off low-ripple filter
- 4: Linear phase slow roll-off filter
- 5: Minimum phase fast roll-off filter
- 6: Minimum phase slow roll-off filter
- 7: Minimum Phase Fast Roll-Off Low Dispersion
设备端处理:
- 参数会通过现有的定时保存机制自动保存到Flash
- 如果参数超出范围(>7),固件将拒绝设置并返回false
3.26 0x59 - GET_FILTER_MODE (获取滤波器模式)¶
功能: 读取设备当前滤波器模式
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x59 | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x59 | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 当前滤波器模式 (0-7)
6 | 1 | 校验 | 校验和
3.27 0x5A - SET_GAME_MODE (设置游戏模式)¶
功能: 设置游戏模式
方向: 主机→设备
数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x5A | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1)
6 | 1 | 校验 | 校验和
参数说明:
- 游戏模式范围: 0-2
- 说明: 选择游戏音效模式
- 0: 无音效(标准立体声)
- 1: FPS模式(增强定位感)
- 2: 虚拟7.1(环绕声效果)
设备端处理:
- 参数会通过现有的定时保存机制自动保存到Flash
- 如果参数超出范围(>2),固件将拒绝设置并返回false
3.28 0x5B - GET_GAME_MODE (获取游戏模式)¶
功能: 读取设备当前游戏模式
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x5B | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x5B | 命令码
4 | 1 | 0x01 | 数据长度
5 | 1 | uint8 | 当前游戏模式 (0=无音效, 1=FPS, 2=虚拟7.1)
6 | 1 | 校验 | 校验和
3.29 0x5C - GET_FIRMWARE_VERSION (获取固件版本)¶
功能: 读取设备固件版本号
方向: 主机→设备
请求数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x5C | 命令码
4 | 1 | 0x00 | 数据长度
5 | 1 | 校验 | 校验和
响应数据包格式:
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x55 | 帧头1
1 | 1 | 0xAA | 帧头2
2 | 1 | 0x00 | 版本
3 | 1 | 0x5C | 命令码
4 | 1 | 0x03 | 数据长度 (3字节)
5 | 1 | uint8 | 主版本号 (BCD格式,如0x01表示1)
6 | 1 | uint8 | 次版本号 (BCD格式,如0x00表示0)
7 | 1 | uint8 | 修订版本号 (BCD格式,如0x0C表示12)
8 | 1 | 校验 | 校验和
版本号格式说明:
- 版本号采用BCD(Binary Coded Decimal)格式
- 3个字节分别表示:主版本号、次版本号、修订版本号
- 例如:0x01 0x00 0x0C 表示版本 1.0.12
4. 关键特性¶
4.1 设备端系数计算¶
- 主机只发送参数 (fc, Q, bw, gain)
- 设备端根据参数实时计算滤波器系数
- 支持动态bshift计算,确保系数精度
4.2 参数格式¶
- 浮点参数: fc, Q, bw, gain 使用IEEE 754 float格式传输
- 字节序: 所有多字节数据使用小端序
4.3 错误处理¶
- 数据包长度检查
- 帧头验证
- 参数范围检查
- 滤波器索引边界检查
4.4 模式管理¶
- 支持10个EQ模式 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass)
- 支持禁用EQ模式 (10)
- 模式切换时自动清除滤波器状态
5. 注意事项¶
- 时序要求: 发送参数后需要等待设备处理完成再发送下一条命令
- 数据完整性: 所有8个滤波器的参数都需要发送,即使某些滤波器未使用
- 模式同步: 设置模式后需要调用读取模式确保数据同步
- 错误恢复: 通信失败时需要重新建立连接并重试
- 参数验证: 设备端会验证参数范围,超出范围的值会被限制
- 校验和计算: 所有命令都必须包含正确的校验和,校验和为帧头到数据末尾所有字节的累加和取低8位

