这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【TEENSY4.0】简易USB音频播放器

共2条 1/1 1 跳转至

【TEENSY4.0】简易USB音频播放器

工程师
2026-08-30 15:50:36     打赏
Teensy 4.0 USB 音频播放器

项目概述

本工程根据官方的SGTL5000,更换封装实现,电脑通过 USB 将双声道 PCM 音频发送给 Teensy 4.0,Teensy Audio Library 在 Cortex-M7 上完成 DSP 处理,再通过 I2S 送入 SGTL5000,最后从耳机输出或线路输出得到模拟音频。

本版本包含 USB 播放、双声道低音/高音均衡、数字音量、静音、峰值监视、CPU 占用率监视.

1. 音频信号流

电脑 USB Audio -> AudioInputUSB
                 -> 左/右 AudioFilterBiquad
                 -> 左/右 AudioAmplifier
                 -> AudioOutputI2S
                 -> SGTL5000
                 -> HP_L/HP_R 耳机输出

Teensy 负责音频对象调度和 DSP 运算;SGTL5000 负责 I2S 转模拟和耳机放大。

2. 硬件连接

2.1 Teensy 4.0 与 SGTL5000

Teensy 引脚SGTL5000/网络作用
18SDAI2C 配置数据
19SCLI2C 配置时钟
23MCLK主音频时钟
21BCLK/SCLKI2S 位时钟
20LRCLK左右声道时钟
7DIN/TXTeensy -> SGTL5000 音频数据
8DOUT/RXSGTL5000 -> Teensy 音频数据

播放 USB 音频时最关键的连接是:

Teensy pin 7 (I2S TX) -> SGTL5000 I2S_DIN

不要交换 DIN、DOUT 或三根 I2S 时钟线。

image.png

焊接成品图

image.png

2.2 电源和耳机

Teensy、SGTL5000 数字地和模拟地必须共地;SGTL5000 I/O 只能使用 3.3 V。HP_VGND/HPVAG 是耳机虚拟地,不是普通 GND,也不能给其他负载供电。

耳机连接:

Tip    -> HP_L
Ring   -> HP_R
Sleeve -> HP_VGND

按当前原理图符号,U2 的连接意图为:

U2 pin 6 -> GND(外壳/屏蔽)
U2 pin 5 -> HP_R
U2 pin 3 -> HP_L
U2 pin 2 -> HP_VGND

KH-PJ-327D-SMT 不同供应商的焊盘编号可能不同,必须以实际 datasheet 为准。断电后用万用表确认 Tip、Ring、Sleeve 分别通到 HP_L、HP_R、HP_VGND。4--8 ohm 裸喇叭不能直接接 HP_L/HP_R,必须经过独立功放。

3. Arduino IDE 配置

安装 Arduino IDE、Teensy board package/Teensyduino 和 Teensy Audio Library。选择:

Tools > Board     > Teensy 4.0
Tools > CPU Speed > 600 MHz
Tools > USB Type  > Audio

AudioInputUSB 只有在 USB_AUDIO/AUDIO_INTERFACE 启用时才会定义。如果出现 AudioInputUSB does not name a type,重新选择 Audio 或 Serial + MIDI + Audio 后编译;日志中应看到 -DUSB_AUDIO。Multiple libraries were found 只要 Used: 指向 Teensy 包内的 Audio 库即可。 要选择audio否则设备不会识别到

image.png

4. 代码说明

4.1 头文件和编译保护

#include <Arduino.h>
#include <Audio.h>
#include <Wire.h>
#include <ctype.h>

#if !defined(AUDIO_INTERFACE)
#error "AudioInputUSB requires Tools > USB Type > Audio (or Serial + MIDI + Audio)"
#endif

Audio.h 提供音频对象,Wire.h 用于 I2C 配置 SGTL5000;#error 会在 USB 配置错误时给出明确提示。

4.2 创建音频对象

AudioInputUSB        usbInput;
AudioFilterBiquad    equalizerL, equalizerR;
AudioAmplifier       leftGain, rightGain;
AudioOutputI2S       i2sOutput;
AudioAnalyzePeak     peakLeft, peakRight;
AudioControlSGTL5000 codec;

AudioInputUSB 接收电脑 PCM;左右两个 AudioFilterBiquad 执行 EQ;AudioAmplifier 控制数字音量;AudioOutputI2S 输出 I2S;AudioAnalyzePeak 显示峰值;AudioControlSGTL5000 通过 I2C 配置芯片。滤波器是单声道对象,所以左右必须各有一个实例。

4.3 建立音频连接

AudioConnection usbToEqL(usbInput, 0, equalizerL, 0);
AudioConnection usbToEqR(usbInput, 1, equalizerR, 0);
AudioConnection eqToGainL(equalizerL, 0, leftGain, 0);
AudioConnection eqToGainR(equalizerR, 0, rightGain, 0);
AudioConnection gainToI2sL(leftGain, 0, i2sOutput, 0);
AudioConnection gainToI2sR(rightGain, 0, i2sOutput, 1);

编号 0 是左声道,1 是右声道。Audio Library 在后台按音频块传递数据,loop() 不需要手动复制采样。

4.4 DSP、音量和 SGTL5000

equalizerL.setLowShelf(0, 100.0f, bassDb, 0.707f);
equalizerL.setHighShelf(1, 8000.0f, trebleDb, 0.707f);
leftGain.gain(gain);
rightGain.gain(gain);

参数顺序是 stage、frequency、gain_dB、slope。当前 EQ 为 100 Hz 低搁架和 8 kHz 高搁架,范围 -12 到 +12 dB。数字音量范围是 0--1。

codecReady = codec.enable();
codec.headphoneSelect(AUDIO_HEADPHONE_DAC);
codec.unmuteHeadphone();
codec.volume(0.80f);

这几行初始化 SGTL5000、将 I2S DAC 路由到耳机放大器、解除静音并设置模拟耳机音量。

4.5 串口、内存和性能

支持以下命令:

volume 0.5
bass 3
treble -2
mute 1
status

参数变化后会重新调用 applyDsp()。AudioMemory(60) 为音频块预留内存;status 显示左右峰值和 CPU 占用率。

5. 上传和测试

  1. 使用支持数据传输的 USB 线连接 Teensy。

  2. 按第 3 节配置 Arduino IDE,编译并上传。

  3. 打开 115200 baud 串口监视器,行尾选择 Newline 或 Both NL & CR。

  4. 在电脑声音设置中选择 Teensy Audio 作为播放设备。

  5. 发送:

volume 0.1
status

代码烧录之后就可以看到音频设备

image.png

将耳机与开发板的3.5mm接口连接就可以听音乐了

image.png

可以通过串口命令实时调节效果

image.png

注意事项:其中验证的时候SGTL5000,需要先提供一个系统的时钟信号,否则其中的I2C是不会正常驱动的。

这个板子相关资料:简易USB音频播放器.zip 其中是嘉立创格式,请将后缀修改为:epro





院士
2026-08-30 16:56:52     打赏
2楼

谢谢分享图文并茂的资料,学习了。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]