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.

[参考译文] TLV320AIC3101:具有此编解码器的 ESP32 S3

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1432973/tlv320aic3101-esp32-s3-with-this-codec

器件型号:TLV320AIC3101

工具与软件:

您好!

我已经开发一段时间了、一直推荐德州仪器(TI)编解码器  TLV320AIC3101IRHBR。 遗憾的是、我从未像这样对编解码器进行编程、因此有点困惑。 我订购了很多板、只需要一些帮助就可以了。 它连接到 ESP32S3、下面放一些引脚。 基本上、我需要知道如何 初始化 这个函数并通过 I2S 向其发送音频。 其输出连接到 PAM8403放大器。 这只能以44.1k 的立体声播放 MP3。 但我不确定哪些东西需要初始化。 我还连接了电位器、我想使用 ADC 来控制音量。 我已将引脚放在下面。 有人能帮我吗?

I2C_SDA = IO15
I2C_SCL = IO12
I2S_DOUT = IO17
I2S_DIN = IO18
I2S_WCLK = IO19
I2S_BCLK = IO20
I2S_MCLK = IO21
电位计 A0 = IO1

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

    您好!

    若要设置寄存器以初始化音频路由、建议使用 EVM GUI 软件生成 I2C 命令。 您可以从 EVM 页面下载该软件、它是名为"SLAC249"的软件: https://www.ti.com/tool/TLV320AIC3101EVM-K

    从软件用于立体声播放的 DAC 预设到线路输出、以下是它提供的脚本:
    W 30 07 8A
    W 30 66 A0
    W 30 25 C0
    W 30 29 02
    W 30 2B 00
    W 30 52 80
    W 30 5C 80
    W 30 4B 80
    第80章
    W 30 56 09
    W 30 5D 09
    W 30 4F 09

    您可以进一步指定要与 GUI 配合使用的时钟、这将在"Command Line Interface"选项卡中生成所需的 I2C。

    至于 ADC 中的电位器、我建议在 ESP32上使用 ADC、然后使用 I2C 改变 DAC 的音量。 您可以使用页0/寄存器43更改 DAC 的数字音量、如数据表中的表49所指定。

    如果您需要更多帮助或说明、请告诉我!

    此致!
    MIR

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

    感谢您的答复! 我将了解该工具! 我认为该编解码器也具有 ADC? 我可以将其用于音量旋钮吗?

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

    您好!

    是的、编解码器具有 ADC、但它专用于音频。 它将模拟输入转换为 I2S、这是一种数字音频协议。 我认为、 与使用 ESP 本身上的 ADC 引脚相比、在解读 I2S 后发送 I2C 命令以更改音量可能更难对您的 ESP32编码、但可以实现这一目的。 音频 ADC 可能超出音量旋钮应用的限制、因为它具有高位深度和特定输入电压范围。  

    此致!
    MIR

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

    谢谢你。 我已经达到了这一点。 我收到 I2S 错误、我不知道。 它启动 DAC、扬声器在开启时发出砰声、但我收到这个错误。  

    我得到的唯一误差。 20:08:14.340 ->正在初始化...

    20:08:14.340 -> I2C 已初始化。

    20:08:14.958 ->编解码器已初始化。

    20:08:15.023 ->正在连接到 Wi-Fi。

    20:08:16.047 -> Wi-Fi 已连接。

    20:08:16.410 -> MP3流已打开。

    20:08:16.410 -> E (3077) I2S (旧版):I2S_SET_PIN (1862):WS_IO_num 无效

    20:08:16.410 -> MP3解码器已启动。

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

    您好!

    出现这个错误时、您可能永远不会运行任何 I2C、因为您没有初始化与器件的连接。 我不是 ESP32或此 Arduino 代码的专家、但我想知道您能否在  I2S_SET_Pin 命令中直接将端口指定为0? 如果您正在使用的引用无效、那么代码似乎需要某个特定引脚、而您的引用可能不正确。 另外、在 I2S 的 ESP API 文档(https://docs.espressif.com/projects/esp-idf/en/v3.3/api-reference/peripherals/i2s.html)中将显示端口可以是0还是1。 或许尝试将其切换到1、看看这样是否有效。

    此致!
    MIR

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

    好的,谢谢你的帮助。 我做了大量的 Arduino 和 DAC 编码,但从来没有设置这样的编解码器与所有的初始写入。 我想我可以让它在该代码中工作。

    您能否告诉我如何使用此代码中的写入内容? 我需要44.1k 音频、因为它是 MP3、I2S 16位、立体声以及启用 DAC。 它将通过 I2S 将音频文件播放到 DAC。 您能告诉我这些写入是什么以及我如何将它们编码成代码吗?

    以下是我的代码。

    #include
    #include
    #include "Audio.h"

    #define I2C_SDA 3.
    #define I2C_SCL 8.
    #define I2S_DOUT 9.
    #define I2S_DIN 10
    #define I2S_WCLK 11.
    #define I2S_BCLK 12.
    #define I2S_MCLK 13.
    #define CODEC_RESET_PIN 14 //定义 RESET 引脚

    // Wi-Fi 凭证
    const char* ssid ="wifi";
    const char* password ="ssid";

    const char* MP3_url ="EXAMPLEURL"

    //将 I2C 实例传递给编解码器
    tlv320aic3101 CODEC (CODEC_RESET_PIN、&Wire)
    音频;

    void setup(){
    Serial.begin(115200);
    //配置 RESET 引脚
    pinMode (CODEC_RESET_PIN、输出)
    //重置编解码器
    digitalWrite (CODEC_RESET_PIN、LOW)
    delay (10)//将 RESET 保持为低电平10ms
    digitalWrite (CODEC_RESET_PIN、高电平)
    delay (10)//在复位后等待编解码器稳定

    //初始化编解码器的 I2C
    Wire.begin(I2C_SDA、I2C_SCL)

    //连接到 Wi-Fi
    WiFi.begin(ssid、密码)
    serial.print ("正在连接至 Wi-Fi")
    while (WiFi.status()!= WL_CONNECTED ){
    延迟(500);
    serial.print(".")
    }
    serial.println ("\n 已连接至 Wi-Fi!")

    //为编解码器设置 I2S 配置
    I2S_PIN_CONFIG_t I2S_PINS =
    .bcK_io_num = I2S_BCLK、
    .ws_io_num = I2S_WCLK、
    .data_out_num = I2S_DOUT
    .data_in_num = I2S_DIN
    }

    codec.begin(&i2s_pins);//初始化编解码器
    audio.setPinout(I2S_BCLK、I2S_WCLK、I2S_DOUT)//初始化音频的 I2S
    }

    void loop(){
    如果(!audio.isruning()){
    audio.connecttohost (MP3_URL)//连接到 MP3流
    }
    audio.loop()//保持音频流式传输
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jack:

    我认为在 Wire Arduino 库中、它是 Wire.write (command)、因此要写入特定寄存器、您可以执行 Wire.write (register in hex)、然后选择 Wire.write (value to set in hex)。

    您需要实施我先前发送的脚本。 以第一行为例、 w 30 07 8A:

    Wire.write (0x07)

    Wire.write (0x8a)

    您可能需要绕过格式设置以确保其正常工作、但我认为这是要使用的协议。 如果您有任何其他问题、请告诉我您找到的内容。

    此致!
    MIR