Files
phaten-audio/zh/docs/dev_doc/protocols/XMOS_EQ_UART_Protocol.md
PhatenIoT-yan e469ee0144 update
2026-03-09 16:50:37 +08:00

34 KiB
Raw Blame History

title, description, keywords
title description keywords
XMOS EQ UART 控制协议与命令集 EQ 参数配置与控制的 UART 串口通信协议规范,涵盖帧格式、命令集与字段说明,适用于 XU316 等相关产品。 EQ, UART, 串口协议, 通信协议, 命令集, XU316,免开发固件, Phaten Audio

XMOS EQ UART 控制协议与命令集

--8<-- "common/phaten_xmos_support_img.md"

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-6: 预设模式, 7-9: 用户模式)
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 | 模式总数 (当前为10包含0-9共10个模式)
6        | 1    | uint8 | 预定义模式数量 (当前为7包含0-6共7个预设模式)
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-6预设模式, 7-9用户模式)
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    | 校验 | 校验和

版本号格式说明:

  • 版本号采用BCDBinary 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-6预设模式, 7-9用户模式 )
  • 模式切换时自动清除滤波器状态

5. 注意事项

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