This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TLV320DAC3101:音频论坛

Guru**** 667810 points
Other Parts Discussed in Thread: TLV320DAC3101
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1078564/tlv320dac3101-audio-forum

部件号:TLV320DAC3101

大家好,我和我的 Roman 正在与 ESP32和 TVl320DAC3101合作开发定制 PCB。 我正在使用带有 ESP32 Dev Modul 板的 Arduino 编程。 我可以使用 I2C 设置和读取所有寄存器。 使用 I2S,我正在发送 Sounddata。

我的问题是:

 正确设置所有寄存器后,我发出大约0.5秒的蜂鸣音。 我可以听到哔声,但只要我想播放 Flash 中的 MP3文件(ESP32可以读取和播放),DAC 就不会让任何东西发出。

我正在阅读第1页的寄存器42/43,我可以看到 D0不是1,即使在播放声音文件之前它是1。 这是我的一次工作,但声音被撕裂了,你无法理解一个词。  

这是我的主要:

这是启动 DAC 的功能:

Serial.println("Starting Setup");
    delay(10);

    

    setRegister(0, 1, 1); // Soft reset
    delay(10); // 10ms startup delay

    
    setRegister(0,0x04,0x07);// PLL_CLKIN = BCLK, CODEC_CLKIN = PLL_CLK
    setRegister(0,0x06,0x20);// J = 32
    setRegister(0,0x05,0x92);//Turn PPL Driver on, P = 1, R = 2
    delay(100);
    setRegister(0,0x0b,0x88);// DAC NDAC divider = Powered Up, DAC NDAC_VAL = 8
    setRegister(0,0x0C,0x82);// DAC MDAC divider = Powered Up, DAC MDAC_VAL = 2
    
    setRegister(0,0x0D,0x00);// DAC DOSR_VAL MSB = 0
    setRegister(0,0x0E,0x80);// DAC DOSR_VAL LSB = 128
    
    setRegister(0,0x1B,0x00);// CODEC Interface = I2S, Word Length = 16 Bit, BLCK = INPUT, WCLK = Input
    setRegister(0,0x1C,0x00);// Data-Slot Offset Programmability, Offset = 0 BCLK
    
    
    setRegister(0,0x3C,0x19);// Set Processing BLock = PCB_P25
    setRegister(8,0x01,0x04); // DAC Coefficient RAM Control= Adaptive filtering enabled in DAC processing block
    
    
    setRegister(0,0x74,0x00);//VOlume Control Pin disabled
    
    setRegister(1,0x21,0x4E);//De-pop, Power on = 800 ms, Step time = 4 ms
    setRegister(1,0x23,0x44);//Set DACL->Routed to Left Channel and DACR-> Routed to Right Channel
    
    /*Set Headphone gain */
    setRegister(1,0x28,0x0e);
    setRegister(1,0x29,0x0e);
    
    /*Set Speaker gain */
    setRegister(1,0x2a,0x04);
    setRegister(1,0x2b,0x04);
    
    /*Power up HPL and HPR */
    setRegister(1,0x1F,0xC6);



    /*Power up Speaker */
    setRegister(1,0x20,0xC6);
    /*Set Speaker Volume */
    setRegister(1,0x26,0x80);
    setRegister(1,0x27,0x80);
    
    /*Waiting Time*/
    delay(1000);
    
    setRegister(0,0x3f,0xd6);// Power UP DAC for left and Right Channels
    
    setRegister(0,0x41,0x00);//Set LEft Gain
    setRegister(0,0x42,0x00);// Set Right gain
    
    setRegister(0,0x40,0x00);// Unmute the digital Volume of the DAC

这是串行监视器上的输出:

15:03:39.272 -> initialization done.
15:03:39.272 -> Starting Setup
15:03:40.405 -> Finished Setup
15:03:40.405 -> 0xe8
15:03:40.405 -> 0xe8
15:03:40.405 -> 0x05
15:03:40.405 -> 0x05
15:03:40.405 -> ------------------------------------------------------------
15:03:40.452 -> info:        PSRAM not found, inputBufferSize: 6399 bytes
15:03:40.452 -> [  1392][V][ssl_client.cpp:311] stop_ssl_socket(): Cleaning SSL connection.
15:03:40.547 -> info:        buffers freed, free Heap: 274144 bytes
15:03:40.594 -> info:        Reading file: "/obiwankechnobli.mp3"
15:03:40.641 -> info:        MP3Decoder has been initialized, free Heap: 250480 bytes
15:03:40.641 -> info:        stream ready
15:03:40.641 -> info:        Content-Length: 492032
15:03:40.641 -> info:        ID3 framesSize: 9291
15:03:41.628 -> [  2603][E][TLV320DAC3101.cpp:182] getRegister(): Timed out
15:03:41.628 -> Interrupt Flags: 0x00
15:03:41.628 -> DAC Interrupt Flags: 0x00
15:03:41.628 -> DAC Flag Register: 0x88
15:03:41.628 -> SPR Driver: 0x04
15:03:41.628 -> SPL Driver: 0x04
15:03:41.675 -> After reinitialising SPR Driver: 0x04
15:03:41.675 -> After reinitialising SPL Driver: 0x04
15:03:41.675 -> info:        ID3 version: 2.4
15:03:41.675 -> info:        ID3 normal frames
15:03:41.721 -> info:        Audio-Length: 482741
15:03:41.721 -> info:        syncword found at pos 0
15:03:41.721 -> info:        Channels: 2
15:03:41.721 -> info:        SampleRate: 44100
15:03:41.721 -> info:        BitsPerSample: 16
15:03:41.721 -> Interrupt Flags: 0x00
15:03:41.721 -> DAC Interrupt Flags: 0x00
15:03:41.721 -> DAC Flag Register: 0x88
15:03:41.721 -> SPR Driver: 0x04
15:03:41.721 -> SPL Driver: 0x04
15:03:41.721 -> After reinitialising SPR Driver: 0x04
15:03:41.721 -> After reinitialising SPL Driver: 0x04
15:03:41.768 -> info:        BitRate: 128000
15:04:12.098 -> info:        End of file "obiwankechnobli.mp3"

这是我的 DAC 的 Scheema:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    主:
    #include <stdio.h>
    #include <string.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <sd.h>
    #include <fs.h>
    #include <SPIFFs.h>
    #include <Audio.h>
    #include "Farbwecker_pin.h"
    #include“TLV320DAC3101.h”


    SPIClass spiSD(HSPI);
    #define format_SPIFFS_if_failed true

    #define SerialDebugging true

    #define I2C_DEP_ADDR 0x18

    TLV3203101 DACtlv320dac3101;
    音频;

    UINT32_t I2C_FREQUENCY = 100000;

    内部 x=5;
    内部 y =0;

    作废 setup_DAC (作废)


    Wire.begin(I2C_SDA,I2C_SCL,I2C_FREQUENCY);
    tlv320dac3101.begin();
    tlv320dac3101.setVolume(150);
    tlv320dac3101.setRaw(0,0);
    serial.printf("0x%02x\n",tlv320dac3101.getRegister(0x41);
    serial.printf("0x%02x\n",tlv320dac3101.getRegister(0x42);
    tlv320dac3101.setRaw(0,1);
    serial.printf ("0x%02x\n",tlv320dac3101.getRegister (0x2B));
    serial.printf ("0x%02x\n",tlv320dac3101.getRegister (0x2A));
    tlv320dac3101.beep(255,255,1000,8000);


    serial.println("------------------- ");

    }


    void setup(){


    PINMode (SD_CS,输出);
    DigitalWrite (SD_CS,高);
    Serial.begin(115200);
    spiSD.begin(SD_SCK,SD_味 噌,SD_MOSI,SD_CS);
    如果(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED))

    serial.println("初始化失败!");
    While (1);
    }
    否则

    serial.println("初始化完成。");
    }


    Serial.setDebugOutput(true);

    Setup_DAC ();
    audio.setPinout(I2S_BCLK,I2S_LRC,I2S_DOUT);
    音频.connecttoFS(SPIFFS,"obiwankechnobli.mp3");

    }

    void loo()

    AUDID.LOW();
    如果(Serial.Available ()){//将 streamURL 置于串行监视器中
    AUDIT.stopSong();
    string r=Serial.readString();r.TRIM ();
    if(r.length()>5) audio.connecttohost(r.c_str());
    log_i (“自由堆=%i”,ESP.getFreeHeap ());
    serial.println("------------------- ");

    }
    }

    /*此功能将在与 File*/建立连接时自动启动
    void AUDIO_INFO (const char *info){
    serial.print (“信息:”);
    serial.println(info);
    如果(x<y){
    tlv320dac3101.setRaw(0,0);
    serial.printf("中断标志:0x%02x\n",tlv320dac3101.getRegister(0x2E);
    serial.printf(" DAC 中断标志:0x%02x\n",tlv320dac3101.getRegister(0x2C));
    serial.printf("DAC 标志寄存器:0x%02x\n",tlv320dac3101.getRegister(0x25));
    tlv320dac3101.setRaw(0,1);
    serial.printf(" SPR 驱动程序:0x%02x\n",tlv320dac3101.getRegister(0x2B);
    serial.printf(" SPL 驱动程序:0x%02x\n",tlv320dac3101.getRegister(0x2A);

    IF (tlv320dac3101.getRegister (0x2A)= 0x04 || tlv320dac3101.getRegister (0x2B)= 0x04)

    tlv320dac3101.setRaw(0,1);
    tlv320dac3101.setRaw(0x2B,0x00);
    tlv320dac3101.setRaw(0x2A,0x00);
    tlv320dac3101.setRaw(0x2B,0x04);
    tlv320dac3101.setRaw(0x2A,0x04);

    延迟(1);
    serial.printf("重新初始化 SPR 驱动程序后:0x%02x\n",tlv320dac3101.getRegister(0x2B);
    serial.printf("重新初始化 SPL 驱动程序后:0x%02x\n",tlv320dac3101.getRegister(0x2A);
    }
    Y =0;
    {y++;}

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Roman,

    您使用的是 HP 或 SPK 输出吗? 这两种情况的结果是否相同?
    播放前和播放后,您是否可以检查寄存器31和32? 我想知道是否会发生过电流或短事件。
    除此之外,您能否确认您为芯片提供了哪些时钟? 我还会仔细检查这与 内部时钟树设置的时钟错误无关。

    此致,
    伊万·萨拉扎尔
    应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    伊文,你好,

    我正在使用 SPK。 耳机无法真正使用,因为在定制板上,我没有耳机的电容器。  

    在寄存器31和32中是0xC6前后的值,因此没有短路。 我没有将 MCLK 仅连接到 BCLK 和 WCLK。 BCLK 约为1.4MHZ,WCLK 约为44.1kHz。 我今天又测试了节目,现在它开始播放音频,我可以听到高质量的声音,即使在互联网上,我也可以播放音乐。 我的代码中没有任何更改。 只添加了一些读取寄存器功能。  

    我不知道它今天是如何运作的,也不知道为什么运作,但上周它从未开始倾斜。

    感谢您的帮助,您能快速响应,这一点很好。

    此致

    罗马