工具/软件:
主题:帮助使用 teensy 4.1的外部时钟为 TDM 模式配置 TAC5212
尊敬的 TI 团队:
我正在使用 TAC5212编解码器(在 TDM 从模式下)处理一个音频项目、该编解码器由 teensy 4.1微控制器(NXP i.MX RT1062 @ 600 MHz)驱动。 我阅读了数据表和时钟应用手册、但仍然无法获得干净的输出或有效的时钟锁定。
设置摘要:
-编解码器: TAC5212
- MCU: teensy 4.1 (TDM Master)
- MCLK : 11.2896 MHz (从 teensy )
- BCLK:12.288 MHz (32位× 16时隙× 24kHz)
- FSYNC:24kHz、高电平有效
-数据: TDM 流,插槽0和1用于立体声
行为:
-音频存在,但划伤或错位。
-时钟状态寄存器(0x13)始终读取0x00 -从不锁定。
-调整 PASI_RX_OFFSET 可以稍微提高质量,但绝不会干净。
-启用 PLL 会导致无音频。
最小配置代码:
下面是我当前用于配置编解码器和发送测试音频的 teensy 草图:
#include <Arduino.h> #include <Wire.h> #include <Audio.h> #define TAC5212_ADDR 0x50 AudioSynthWaveform waveform1; AudioSynthWaveform waveform2; AudioOutputI2S i2sOut; AudioConnection patchCord1(waveform1, 0, i2sOut, 0); AudioConnection patchCord2(waveform2, 0, i2sOut, 1); AudioControlSGTL5000 dummyControl; void writeReg(uint8_t reg, uint8_t val) { Wire.beginTransmission(TAC5212_ADDR); Wire.write(reg); Wire.write(val); Wire.endTransmission(); } void setupCodec() { writeReg(0x01, 0x01); delay(100); // Reset writeReg(0x02, 0x09); delay(100); // Wakeup uint8_t PASI_FORMAT = 0b00 << 6; // [7:6] PASI_FORMAT: 00 = TDM uint8_t PASI_WLEN = 0b11 << 4; // [5:4] PASI_WLEN: 11 = 32-bit uint8_t PASI_FSYNC_POL = 0 << 3; // [3] FSYNC_POL: 0 = Active Low, 1 = Active High uint8_t PASI_BCLK_POL = 0 << 2; // [2] BCLK_POL: 0 = Normal (rising edge) uint8_t PASI_BUS_ERR = 0 << 1; // [1] BUS_ERR: 0 = Disable error detection uint8_t PASI_BUS_ERR_RCOV = 0 << 0; // [0] BUS_ERR_RCOV: 0 = Disable recovery uint8_t pasi_cfg0 = PASI_FORMAT | PASI_WLEN | PASI_FSYNC_POL | PASI_BCLK_POL | PASI_BUS_ERR | PASI_BUS_ERR_RCOV; writeReg(0x1A, pasi_cfg0); uint8_t PASI_RX_EDGE = 0 << 7; // [7] Half-cycle delay uint8_t PASI_RX_USE_INT_FSYNC = 0 << 6; // [6] Use external FSYNC uint8_t PASI_RX_USE_INT_BCLK = 0 << 5; // [5] Use external BCLK uint8_t PASI_RX_OFFSET = 2; // [4:0] Shift input by 2 BCLKs uint8_t pasi_rx_cfg0 = PASI_RX_EDGE | PASI_RX_USE_INT_FSYNC | PASI_RX_USE_INT_BCLK | PASI_RX_OFFSET; writeReg(0x26, pasi_rx_cfg0); writeReg(0x2A, 0b00100000); // DAC L2 ← Slot 0 writeReg(0x2B, 0b00100001); // DAC R2 ← Slot 1 writeReg(0x6E, 80); // L2 Volume writeReg(0x70, 80); // R2 Volume writeReg(0x76, 0x0C); // Enable L2 + R2 writeReg(0x78, 0x40); // Power up } void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(115200); Wire.begin(); AudioMemory(12); waveform1.begin(WAVEFORM_SQUARE); waveform1.frequency(440); waveform1.amplitude(0.25); waveform2.begin(WAVEFORM_SQUARE); waveform2.frequency(660); waveform2.amplitude(0.25); delay(1000); setupCodec(); } void loop() {}
MCLK 连接到 GPI1 (根据文档而定)。
示波器图像显示:
- MCLK
- BCLK
- FSYNC
-在时隙0和1上有可见过渡的 TDM 数据流
请求:
请您帮助确认:
1.此模式下 PASI_CFG0 (0x1A)和 PASI_RX_CFG0 (0x26)的正确设置
2.即使外部时钟稳定、也是否需要 PLL
3.是否需要无文档设置或对齐时隙/延迟时间
非常感谢任何建议、我已经坚持使用了几周。
此致、
Jay Shoemaker
https://t-dsp.com/