一、接线
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 samples
void i2s_init_std(void);
extern i2s_chan_handle_t tx_chan; // I2S tx channel handler
extern 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_1
void 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);
使能 发生数据 失能