ESP32S3 关于使用INMP441麦克风 和MAX98357AETE功放进行录音和播放
一、接线
INMP441
SD 接IIS的DIn
SCK 接 BCK
WS 接 WS
接上电源和地
MAX98357
LRC接 ws
BCLK 接BCLK
DIN接 DOUT
VCC GND 正常接
下面是代码 头文件
#ifndef INMP441_H
#define INMP441_H#include "driver/gpio.h"
#include "driver/i2s_std.h"
#include "esp_check.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"
#include <stdint.h>
#include <stdlib.h>// 麦克风#define INMP441_BCLK_IO 9 // I2S bit clock io number#define INMP441_STD_WS_IO 10 // I2S word select io number#define INMP441_STD_DOUT_IO GPIO_NUM_NC // I2S data out io number#define INMP441_STD_DIO_IO 11 // I2S data in io number//功放
#define MAX98357AETE_STD_WS_IO 12 // I2S word select io number 接LRC
#define MAX98357AETE_BCLK_IO 13 // I2S bit clock io number
#define MAX98357AETE_STD_DOUT_IO 14 // I2S data out io number
#define MAX98357AETE_STD_DIO_IO GPIO_NUM_NC // I2S data in io number// 麦克风
// #define INMP441_BCLK_IO 47 // I2S bit clock io number
// #define INMP441_STD_WS_IO 48 // I2S word select io number
// #define INMP441_STD_DOUT_IO GPIO_NUM_NC // I2S data out io number
// #define INMP441_STD_DIO_IO 19 // I2S data in io number// // 功放
// #define MAX98357AETE_BCLK_IO 2 // I2S bit clock io number
// #define MAX98357AETE_STD_WS_IO 1 // I2S word select io number
// #define MAX98357AETE_STD_DOUT_IO 42 // I2S data out io number
// #define MAX98357AETE_STD_DIO_IO GPIO_NUM_NC // I2S data in io number#define CONFIG_EXAMPLE_BIT_SAMPLE 32
#define CONFIG_EXAMPLE_SAMPLE_RATE 16000
#define NUM_CHANNELS (1) // For mono recording only!
#define SAMPLES_PER_FRAME 1024#define SAMPLE_SIZE (CONFIG_EXAMPLE_BIT_SAMPLE * 32)#define SAMPLE_RATE 16000 // 16kHz采样率
#define BUFFER_MS 10 // 10ms缓冲区
#define BUFFER_SIZE (SAMPLE_RATE * BUFFER_MS / 1000) // 160 samplesvoid i2s_init_std(void);extern i2s_chan_handle_t tx_chan; // I2S tx channel handlerextern i2s_chan_handle_t rx_chan; // I2S rx channel handler
#endif
c文件
#include "INMP441.h"
#include "esp_log.h"static const char *TAG = "INMP441";
i2s_chan_handle_t tx_chan; // I2S tx channel handler
i2s_chan_handle_t rx_chan; // I2S rx channel handler// 定义独立控制器
#define RX_I2S_NUM I2S_NUM_0
#define TX_I2S_NUM I2S_NUM_1void i2s_init_std(void)
{i2s_chan_config_t tx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(TX_I2S_NUM, I2S_ROLE_MASTER);tx_chan_cfg.dma_desc_num = 8; // 增大缓冲区数量tx_chan_cfg.dma_frame_num = 512; // 每帧 256 个样本ESP_ERROR_CHECK(i2s_new_channel(&tx_chan_cfg, &tx_chan, NULL));i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(RX_I2S_NUM, I2S_ROLE_MASTER);// 1. 配置 DMA 参数chan_cfg.dma_desc_num = 8; // 增大缓冲区数量chan_cfg.dma_frame_num = 256; // 每帧 256 个样本ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &rx_chan));i2s_std_config_t tx_std_cfg = {.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(CONFIG_EXAMPLE_SAMPLE_RATE),.slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_MONO),.gpio_cfg = {.mclk = I2S_GPIO_UNUSED, // some codecs may require mclk signal, this example doesn't need it.bclk = MAX98357AETE_BCLK_IO,.ws = MAX98357AETE_STD_WS_IO,.dout = MAX98357AETE_STD_DOUT_IO,.din = I2S_GPIO_UNUSED,.invert_flags = {.mclk_inv = false,.bclk_inv = false,.ws_inv = false,},},.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT,};tx_std_cfg.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT;ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_chan, &tx_std_cfg));i2s_std_config_t std_cfg = {.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(CONFIG_EXAMPLE_SAMPLE_RATE),.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_MONO),.gpio_cfg ={.mclk = I2S_GPIO_UNUSED, // some codecs may require mclk signal, this example doesn't need it.bclk = INMP441_BCLK_IO,.ws = INMP441_STD_WS_IO,.dout = I2S_GPIO_UNUSED,.din = INMP441_STD_DIO_IO, // In duplex mode, bind output and input to a same gpio can loopback// internally.invert_flags ={.mclk_inv = false,.bclk_inv = false,.ws_inv = false,},},.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT,};// std_cfg.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT;ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_chan, &std_cfg));
}
使用示例
i2s_channel_enable(tx_chan);esp_err_t err = i2s_channel_write(tx_chan, converted_buffer, bytes_to_send, &bytes_written, portMAX_DELAY);i2s_channel_disable(tx_chan);
使能 发生数据 失能