Skip to content

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    | 校验 | 校验和

设备端处理:

  1. 解析模式值、增益值和模式名称
  2. 设置指定模式的EQ整体增益和名称到所有采样率的左右通道
  3. 支持所有采样率: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 高架滤波器

设备端处理:

  1. 解析参数并存储到所有采样率的对应模式中
  2. 调用 eq_calculate_coefficients_from_params() 计算系数
  3. 存储计算出的系数到所有采样率的对应模式中
  4. 自动应用到所有采样率: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    | 校验 | 校验和

设备端处理:

  1. 删除指定模式在Flash中存储的EQ参数文件
  2. 删除增益和模式名称的Flash存储文件
  3. 恢复该模式的头文件预设参数
  4. 如果模式号为0xFF,则复位所有模式
  5. 返回操作状态

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. 注意事项

  1. 时序要求: 发送参数后需要等待设备处理完成再发送下一条命令
  2. 数据完整性: 所有8个滤波器的参数都需要发送,即使某些滤波器未使用
  3. 模式同步: 设置模式后需要调用读取模式确保数据同步
  4. 错误恢复: 通信失败时需要重新建立连接并重试
  5. 参数验证: 设备端会验证参数范围,超出范围的值会被限制
  6. 校验和计算: 所有命令都必须包含正确的校验和,校验和为帧头到数据末尾所有字节的累加和取低8位