T5-3.13.6版本AI玩具打开UI后播放音频时会有明显噪声
用T5AI_BOARD_EYES的版型,在原来的版本3.13.3的时候也有这个问题,使能UI后,播放音频会有比较明显的噪声一起播放出来,把UI关闭后噪声就会消失,新版本3.13.6好像会好一些,但还是可以听到,播放声音的时候会有哒哒哒,嘎嘎嘎的噪声,不知道这个怎么优化,现在眼睛尺寸是160*160,噪声在关闭UI后会消失。
用T5AI_BOARD_EYES的版型,在原来的版本3.13.3的时候也有这个问题,使能UI后,播放音频会有比较明显的噪声一起播放出来,把UI关闭后噪声就会消失,新版本3.13.6好像会好一些,但还是可以听到,播放声音的时候会有哒哒哒,嘎嘎嘎的噪声,不知道这个怎么优化,现在眼睛尺寸是160*160,噪声在关闭UI后会消失。
T5AI_BOARD_EYES + ENABLE_TUYA_UI 播放音频出现"哒哒/嘎嘎"噪声 — 根因与排查方案
我把 EYES 板的 LCD/音频驱动和 LVGL 渲染链路都过了一遍,现象(开 UI 才有、关 UI 消失、改 160×160 后噪声更密)非常典型,根因排序如下,可按优先级直接排查。
一、根因排序(按可能性)
1. SPI LCD 高频开关通过电源/地耦合干扰 T5 片内 AUD DAC 模拟前端(最可能)
T5 的扬声器/麦克风走的是 BK7258 内置的 AUD ADC/DAC(模拟域),不是 I2S:
Code: Select all
vendor/T5/tuyaos/tuyaos_adapter/src/driver/tkl_audio.c:206
onboard_spk_cfg.clk_src = AUD_CLK_APLL; // 片内 DAC,模拟域而 EYES 板的 SPI LCD 默认配置:
Code: Select all
apps/tuyaos_demo_wukong_ai/src/drivers/app_tuya_display/tdd_lcd_driver/src/spi/lcd_spi_st7735s.c:36
.freq_hz = 48000000, // 48MHz,已是 ST7735 上限
.spi_dma_flags = 1, // DMA 大块传开 UI 之后,LVGL 任务以 4ms 间隔不断把帧 DMA 到 SPI(128×128×2=32KB 每帧;改 160×160 后 51200B,刷屏数据 +56%),48MHz SPI 时钟+DMA 突发开关在 PCB 电源/地上产生周期性噪声,被 AUD DAC 的 AVDD/AGND 耦合进去 → 听感上就是与刷屏节拍同步的"哒哒哒";改 160×160 后单帧 DMA 时间更长、噪声更密集,完全吻合你的描述。
关 UI 后整个 SPI 路径停摆,噪声立刻消失 — 这是电气耦合的强证据。
2. SPI DMA 与 AUD DMA 总线/中断争抢,导致 DAC FIFO 欠载(次可能)
Code: Select all
apps/tuyaos_demo_wukong_ai/src/miscs/gui/tuya_lvgl/src/tuya_app_gui.c:28
#define TASK_PRIORITY_LVGL 5 // BK/FreeRTOS 数值越大越高
vendor/T5/tuyaos/tuyaos_adapter/src/driver/tkl_audio.c:226
mic task_prio = 2, stack = 4096 // 比 LVGL 低LVGL 优先级高于音频处理任务;SPI flush 是"提交 DMA → 信号量长等"模式(tal_display_spi.c:111-143),DMA 通道占用期间若与 AUD DAC 的 DMA 喂数发生总线饥饿,DAC 就会出现欠载 click。
3. APLL 共享干扰 — 基本排除
查 tkl_spi.c:390 仅在 #if CONFIG_SOC_BK7256XX(T2 平台)操作 APLL,T5/BK7258 路径不动 APLL,所以 AUD_CLK_APLL 不会被 SPI 拉走。
二、排查与解决步骤(建议按顺序逐项尝试)
Step 1 — 强力定位:播放期间暂停 LVGL 刷屏
代码里已有现成 API:
Code: Select all
apps/tuyaos_demo_wukong_ai/src/miscs/gui/lvgl/src/lvgl_v8/lv_vendor.c:202
void lv_vendor_stop(void); // 停渲染任务
void lv_vendor_disp_lock/unlock(); // 持锁互斥
apps/tuyaos_demo_wukong_ai/src/miscs/gui/tuya_port/src/tuya_port_disp.c:275
void tkl_lvgl_pause(void); // 暂停在播音状态机切到 PLAY 时调用 tkl_lvgl_pause(),停止后调用 tkl_lvgl_resume()。
预期:噪声完全消失(与关 UI 等价)。这一步同时验证根因是 SPI 刷屏。
Step 2 — 降低 SPI 频率试听
把 lcd_spi_st7735s.c:46 的 freq_hz 从 48000000 改为 24000000 或 16000000,重新编译试听:
噪声明显减弱 → 电气耦合是主因,按 Step 4 处理硬件
噪声基本不变 → 主因偏向总线争抢,按 Step 3 处理软件
Step 3 — 软件层缓解(不动硬件)
降低 LVGL 任务优先级到 ≤ 音频任务:把 TASK_PRIORITY_LVGL 从 5 改为 2 或 3
限制刷屏频率:lv_vendor.c:151 的 sleep_time 下限从 4 改大到 2033(3050FPS 降到 2030FPS),眼睛动画基本不影响观感
降低色深/帧 buffer:把 LVGL 的 disp_buf_size 调小(如改成 1/4 屏分块刷),减少单次 DMA 突发时长
Step 4 — 硬件层根治(量产方案)
这是 T5 + 模拟音频 + 高频 SPI 屏的通用问题,软件只能缓解,量产板必须从硬件上隔离:
背光(GPIO25)和 SPK_EN(GPIO28)物理相邻,BL PWM 需独立 LDO 或 RC 滤波
AUD DAC 的 AVDD / AGND 必须用独立的 LDO 供电,不要和 LCD/MCU 数字 3V3 共网,AGND 单点接地到 PCB 数字地
SPK_EN 引脚串 100Ω + 1nF 简单 RC,避免 SPI 时钟串扰
LCD 排线远离 AUD 模拟走线和喇叭功放输入;如果可能,LCD SPI 时钟用串阻(2233Ω)+ 包地处理
扬声器功放电源加 LC(10uH + 10uF)滤波
三、关于 3.13.6 比 3.13.3 略好的解释
3.13.6 对 LVGL 任务调度和 DMA 时序做了优化,争抢和软件突发减少 → 第二根因(DMA 争抢)影响减弱;但第一根因(电气耦合)只能靠硬件解决,所以仍然能听到。
四、快速自检清单
Step 1 加 lv_vendor_stop()/tkl_lvgl_pause() 验证噪声是否完全消失
Step 2 SPI 频率从 48M→24M→16M 三档试听
示波器抓 SPK_EN(GPIO28) 在播音时的电平/纹波,是否能看到与刷屏同步的毛刺
测 AUD DAC 的 AVDD 纹波,开 UI / 关 UI 对比
改 160×160 是否同步改了引脚?确认未占用 audio 模拟域的参考引脚
如果 Step 1 暂停 LVGL 后噪声完全消失,请回帖告诉我,可以进一步给出"播音期间智能暂停 UI"的整套状态机集成代码(在 wukong_ai_mode_*.c 切到 PLAY/TTS 状态时挂钩 lv_vendor_stop/resume)。
如果 Step 2 降频后明显改善,重点放在硬件电源去耦改造,软件保持当前帧率即可。