--- title: XMOS EQ UART 控制协议与命令集 description: EQ 参数配置与控制的 UART 串口通信协议规范,涵盖帧格式、命令集与字段说明,适用于 XU316 等相关产品。 keywords: 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 | 校验 | 校验和 ``` **版本号格式说明**: - 版本号采用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-6预设模式, 7-9用户模式 ) - 模式切换时自动清除滤波器状态 ## 5. 注意事项 1. **时序要求**: 发送参数后需要等待设备处理完成再发送下一条命令 2. **数据完整性**: 所有8个滤波器的参数都需要发送,即使某些滤波器未使用 3. **模式同步**: 设置模式后需要调用读取模式确保数据同步 4. **错误恢复**: 通信失败时需要重新建立连接并重试 5. **参数验证**: 设备端会验证参数范围,超出范围的值会被限制 6. **校验和计算**: 所有命令都必须包含正确的校验和,校验和为帧头到数据末尾所有字节的累加和取低8位