当前位置: 首页 > article >正文

立创开发板入门第六课 音频-扬声器和麦克风 I2S驱动

音频芯片介绍

开发板上带有一个麦克风,一个扬声器,音频编解码芯片使用ES8311。麦克风直接连接到了ES8311芯片上,ES8311和扬声器之间,还有一个音频驱动放大器。ES8311通过I2S接口与ESP32-C3连接。

ES8311这个芯片不仅使用I2S接口与ESP32连接,还有I2C接口与ESP32连接,I2C接口用于配置,I2S接口用于音频传输。

配置文件example_config.h

I2C引脚相关代码在它24~35行之间,这里使用了条件编译,根据使用的ESP32不同型号,定义I2C引脚。针对我们开发板上ESP32-C3,我们应该修改它的33、34行,我们修改为开发板上使用的GPIO0和GPIO1引脚。

I2C,共四个接线,VCC(正极), SCL,SDA,GND(负极),所以需要定义的只有SCL和SDA。

/* I2C端口和GPIO */
#define I2C端口号         (0)
#define I2C_串行时钟线      (GPIO_NUM_1)
#define I2C_串行数据线      (GPIO_NUM_0)

I2S引脚相,共五个接线,MCK主时钟引脚,BCK时钟引脚,WS左右声道引脚,SDI串行数据输入引脚用于接收音频数据,SDO串行数据输出引脚用于发送音频数据,

例如: 44.1kHz(音频的采样频率)×16(位数据)×2(对于立体声,由WS决定)=1.4112MHz(BCK),然后MCK通常是BCK的整数倍 256 倍或 384 倍等,例如1。4112MHz x 256 ≈361.27MHz

关代码在它的37~48之间。 先修改39~41行。

/* I2S端口和GPIO */
#define I2S端口号         (0)               //I2S_NUM
#define I2S_主时钟线      (GPIO_NUM_10)
#define I2S_位时钟线      (GPIO_NUM_8)
#define I2S_帧同步线       (GPIO_NUM_12)
#define I2S_数据输出线       (GPIO_NUM_11)
#define I2S_数据输入线       (GPIO_NUM_7)

 main文件块区:

1、换VDD_SPI引脚替换成GPIO11。

开发板上只把它用做GPIO11,I2S_DO引脚。把它变成GPIO11,需要调用一个函数即可。

printf("ESP电子熔丝VDD-SPI作为GPIO开始\n-----------------------------\n");
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);

第一行语句是提示,第二行代码是把VDD_SPI引脚变成GPIO引脚的函数,只需要运行一次,就可以将上面的两行代码注释起来。

 2、音频放大器芯片配置

gpio_config_t io_conf = {
        .intr_type = GPIO_INTR_DISABLE, // 禁止中断
        .mode = GPIO_MODE_OUTPUT,       // 设置为输出模式
        .pin_bit_mask = 1 << 13,        // 引脚的位掩模
        .pull_down_en = 0,              // 禁用下拉模式
        .pull_up_en = 1,                // 启用上拉模式
    };
  //使用给定设置配置GPIO
    gpio_config(&io_conf);

    gpio_set_level(GPIO_NUM_13, 1); // 输出高电平

3、i2s es8311编解码器

printf("i2s es8311编解码器示例启动\n-----------------------------\n");
    /* 初始化i2s外设 */
    if (i2s_driver_init() != ESP_OK) {
        ESP_LOGE(标签, "i2s驱动初始化失败");
        abort();
    } else {
        ESP_LOGI(标签, "i2s驱动初始化成功");
    }
    /* 初始化i2c外设并通过i2c配置es8311编解码器 */
    if (es8311_codec_init() != ESP_OK) {
        ESP_LOGE(标签, "es8311编解码器初始化失败");
        abort();
    } else {
        ESP_LOGI(标签, "es8311编解码器初始化成功");
    }

 4、选择是播音乐,还是测试麦克风的(回声机)。

#if CONFIG_EXAMPLE_MODE_MUSIC
    /* 在音乐模式下播放一段音乐 */
    xTaskCreate(i2s_music, "i2s_music", 4096, NULL, 5, NULL);
#else
    /* 在回声模式下回声来自MIC的声音 */
    xTaskCreate(i2s_echo, "i2s_echo", 8192, NULL, 5, NULL);
#endif

5、在源码的开头引入的头文件等,接下来是变量命名和导入音乐文件作为缓冲区,然后是对应子程序的设计。


http://www.kler.cn/a/507254.html

相关文章:

  • SurfaceFlinger代码笔记
  • 【redis】键的全局命令
  • 基于R计算皮尔逊相关系数
  • VSCode连接Github的重重困难及解决方案!
  • FPGA工程师成长四阶段
  • Facebook 隐私风波:互联网时代数据安全警钟
  • 3 前端(上): Web开发相关概念 、HTML语法、CSS语法
  • 【Golang 面试题】每日 3 题(三十)
  • MiniCPM-o 2.6:开源大型语言模型在多模态任务上超越GPT-4o和Claude 3.5
  • 【Vue】Vue组件--下
  • Linux和Docker常用终端命令:保姆级图文详解
  • Apache Hop从入门到精通 第三课 Apache Hop下载安装
  • 微服务的自我修养:从拆分到秩序的进化论
  • Redis监控系统:基于Redis Exporter的性能指标可视化
  • 二进制/源码编译安装mysql 8.0
  • Visual Studio Community 2022(VS2022)安装方法
  • 【Pico串流预览】使用“PICO Unity Live Preview Plugin”和PDC工具进行实时预览
  • JAVA实现五子棋小游戏(附源码)
  • SQL Prompt 插件
  • K8S中的Pod调度之定向调度
  • Python时间序列分析:使用TSFresh进行自动化特征提取
  • docker安装Nginx UI
  • nginx 配置代理,根据 不同的请求头进行转发至不同的代理
  • 使用 Wireshark 分析 TCP 吞吐瓶颈
  • 用java实现一个猜拳小游戏
  • electron 获取本机 ip 地址