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 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);

使能 发生数据 失能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值