Other Parts Discussed in Thread: TAD5112
器件型号: TAD5112
尊敬的所有人:
我使用 TAD5112 存在问题。 我想用它来播放耳机上的短 WAV 文件。 左右声道交替(eMDR 应用程序)。 问题是我只能在播放 WAV 文件时听到软弹出的声音、没有音频。
我使用 STM32U5 和 SAI 外设来控制 TAD5112、这些外设配置为标准 I2S、32 位字长、44.1kHz 音频。 我使用 DMA 将数据传输到 SAI(存储器到外设,数据大小=字)。
下面是我使用 TAD5112 实现的原理图。 我以伪差分配置连接了耳机。 
我使用 PurePath Console 应用程序生成寄存器内容、但我发现它无法正确地将寄存器输出到应用程序中配置的文件。 应用会跳过一些寄存器、值并不总是正确的、因此我自己配置了寄存器。 以下是 TAD5112 的当前初始化:
bool TAD5112::Init(void) {
// Check if device is ready
if (!_i2c.isDeviceReady(_address, 3, I2C_TIMEOUT_MS)) {
return false;
}
_currentPage = 0xFF; // Reset page cache
// Perform a software reset
if (!SelectPage(0)) return false;
if (!WriteRegister(REG_RESET, 0x01)) { // Write 0x01 to Reset register
return false;
}
Utils::DelayMs(10); // Wait for reset to complete (datasheet recommends 10ms)
if (!WriteRegister(REG_P0_DEV_MISC_CFG, 0x09)) return false; // Disable sleep mode
Utils::DelayMs(2);
if (!WriteRegister(REG_P0_PASI_CFG0, 0x70)) return false; //Select I2S communication, 32bit words
if (!WriteRegister(REG_P0_PASI_RX_CFG0, 0x01)) return false; //Set 1 clock offset in I2S communication (standard I2S)
if (!WriteRegister(REG_P0_PASI_RX_CH1_CFG, 0x20)) return false; //ASI channel 1 = DAC channel 1, I2S left slot 0
if (!WriteRegister(REG_P0_PASI_RX_CH2_CFG, 0x30)) return false; //ASI channel 2 = DAC channel 2, I2S right slot 0
if (!WriteRegister(REG_P0_OUT1x_CFG0, 0x34)) return false; //OUT1 to input from DAC, pseudo differential mode
if (!WriteRegister(REG_P0_OUT1x_CFG1, 0x60)) return false; //OUT1P headphone mode, 0dB gain
if (!WriteRegister(REG_P0_OUT1x_CFG2, 0x60)) return false; //OUT1M headphone mode
if (!WriteRegister(REG_P0_OUT2x_CFG0, 0x30)) return false; // OUT2 to input from DAC, pseudo differential mode
if (!WriteRegister(REG_P0_OUT2x_CFG1, 0x60)) return false; //OUT2P headphone mode, 0dB gain
if (!WriteRegister(REG_P0_OUT2x_CFG2, 0x60)) return false; //OUT2M headphone mode
if (!WriteRegister(REG_P0_CH_EN, 0x0C)) return false; // enable DAC channels 1 & 2
if (!WriteRegister(REG_P0_DYN_PUPD_CFG, 0x20)) return false; // enable DAC dynamic power up & down
if (!WriteRegister(REG_P0_PWR_CFG, 0x40)) return false; // power up DAC;
// --- Configure Page 1 (Power and Analog Outputs) ---
if (!SelectPage(1)) return false;
if (!WriteRegister(REG_P1_JACK_DET_CFG1, 0x0E)) return false; // headset detection enabled, 2x current, DC-coupled
if (!WriteRegister(REG_P1_JACK_DET_CFG2, 0x40)) return false; // debounce connect 3 detections, detection time 16ms, debounce removal 5 detections
// Set default volume (0-100%)
_volume = 50;
SetVolume(_volume);
_isInitialized = true;
return true;
}
我的代码具有以下功能、可将 16 位带符号 WAV 音频加载到左声道和/或右声道(伪代码):
int32_t buffer[]
if(playback == leftonly) {
buffer[i] = audiosample16bit << 16;
buffer[i+1] = 0;
} else if(playback == rightonly) {
buffer[i] = 0;
buffer[i+1] = audiosample16bit << 16;
} else {
buffer[i] = audiosample16bit << 16;
buffer[i+1] = audiosample16bit << 16;
}
到目前为止我的调查结果:
- I2C 通信正常工作
- 验证 WAV 文件数据。 WAV 文件在 Windows 上播放、采样率为 44.1kHz。 我使用 Python 脚本将 wav 文件转换为 C++数组。 我比较的 WAV 文件 hexedit 与 C++代码,这匹配。 我使用具有 32 位时隙的 I2S、因此我将 16 位 wav 文件数据左移 16 位(例如 0x1234 à 0x1234000)。 我还使用调试器(一直到 DMA 缓冲器到 SAI 外设)进行了验证。
- 我检查了我的耳机、它在我的笔记本电脑 (L+R) 上播放音频
- 我按照预期检查了 CLK_DET_STS0 寄存器、PASI_SAMP_RATE_STS = 20
- CLK_ERR_STS0/CLK_ERR_STS1 寄存器均为 0
- DEV_STS0 寄存器为 0x0C、因此 DAC CH1 / CH2 上电
- DEV_STS1 寄存器为 0xF0、因此器件处于工作模式、播放开启
- 我检查了音频插孔的连接。 如果我直接测量耳机、每通道大约为 80 欧姆。 I 测量 OUT1M / OUT1P 和 OUT2M / OUT2P 之间的相同电阻
- 我添加了另一个 0.5s WAV 音频文件与简单的 1kHz 正弦波。 现在两个 L+R 通道上都有失真的蜂鸣声、无论选择左声道还是右声道都没有区别。 如果我选择立体声与此文件我只得到一个弹出
希望您能帮助我朝着正确的方向前进。 我有感觉,我是接近的解决方案。
提前感谢、
Robin

