项目概述
本工程根据官方的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
| 18 | SDA | I2C 配置数据 |
| 19 | SCL | I2C 配置时钟 |
| 23 | MCLK | 主音频时钟 |
| 21 | BCLK/SCLK | I2S 位时钟 |
| 20 | LRCLK | 左右声道时钟 |
| 7 | DIN/TX | Teensy -> SGTL5000 音频数据 |
| 8 | DOUT/RX | SGTL5000 -> Teensy 音频数据 |
播放 USB 音频时最关键的连接是:
Teensy pin 7 (I2S TX) -> SGTL5000 I2S_DIN
不要交换 DIN、DOUT 或三根 I2S 时钟线。

焊接成品图

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否则设备不会识别到

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. 上传和测试
使用支持数据传输的 USB 线连接 Teensy。
按第 3 节配置 Arduino IDE,编译并上传。
打开 115200 baud 串口监视器,行尾选择 Newline 或 Both NL & CR。
在电脑声音设置中选择 Teensy Audio 作为播放设备。
发送:
volume 0.1 status
代码烧录之后就可以看到音频设备

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

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

注意事项:其中验证的时候SGTL5000,需要先提供一个系统的时钟信号,否则其中的I2C是不会正常驱动的。
这个板子相关资料:简易USB音频播放器.zip 其中是嘉立创格式,请将后缀修改为:epro
我要赚赏金
