立创开发板入门第六课 音频-扬声器和麦克风 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