esp32开发与应用(播放wav音频文件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

esp32本身也是支持音乐播放的,主要是i2s接口。现在电商网站上面,有一种芯片,输入是i2s接口,输出可以直接给喇叭。不像一般的芯片,后面还要一个音频放大器。比如ns4168,就是其中的一种,今天正好来试试。当然这里播放的都是wav格式,即没有压缩的音频文件。

1、信号接口

主要的信号接口就5个。两个是3.3v电源和地。另外三个是BCLK、WS、DOUT。有的可能名字不一样,叫BCLK、LRCLK、SDA。

板子上还有DATA和CLK,那个是负责麦克风的,可以先不管。

2、对应引脚

选择引脚26、25、22即可。

3、选择hello.wav

可以利用everything在电脑上搜一搜,指标就是16bit采样、16k速率、单声道。不然声音很难听。

4、CMakeLists准备

本身hello.wav是作为文件,直接连接到代码里面的,所以对代码分区有点影响。hello.wav也不能弄得太大,

复制代码
idf_component_register(SRCS "main.c" 
                    INCLUDE_DIRS "."
                    EMBED_FILES "hello.wav")

5、代码部分

代码部分不复杂,可以让ai直接生成即可,

复制代码
#include <stdint.h>

#include "freertos/FreeRTOS.h"
#include "esp_log.h"
#include "driver/i2s_std.h"


#define TAG "AUDIO"

#define SAMPLE_RATE 16000

#define I2S_BCLK    GPIO_NUM_26
#define I2S_WS      GPIO_NUM_25
#define I2S_DOUT    GPIO_NUM_22


static i2s_chan_handle_t tx_handle;


/* Embedded wav file */
extern const uint8_t hello_wav_start[] asm("_binary_hello_wav_start");
extern const uint8_t hello_wav_end[]   asm("_binary_hello_wav_end");


static void i2s_init(void)
{
    i2s_chan_config_t chan_cfg =
        I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);

    ESP_ERROR_CHECK(
        i2s_new_channel(&chan_cfg, &tx_handle, NULL)
    );


    i2s_std_config_t cfg = {
        .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(SAMPLE_RATE),

        .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(
            I2S_DATA_BIT_WIDTH_16BIT,
            I2S_SLOT_MODE_MONO
        ),

        .gpio_cfg = {
            .mclk = I2S_GPIO_UNUSED,
            .bclk = I2S_BCLK,
            .ws   = I2S_WS,
            .dout = I2S_DOUT,
            .din  = I2S_GPIO_UNUSED,
        },
    };


    ESP_ERROR_CHECK(
        i2s_channel_init_std_mode(tx_handle, &cfg)
    );

    ESP_ERROR_CHECK(
        i2s_channel_enable(tx_handle)
    );
}


static void play_wav(void)
{
    const uint8_t *data = hello_wav_start + 44;
    size_t len = hello_wav_end - hello_wav_start - 44;


    while (len) {

        size_t size = len > 1024 ? 1024 : len;
        size_t written;


        ESP_ERROR_CHECK(
            i2s_channel_write(
                tx_handle,
                data,
                size,
                &written,
                portMAX_DELAY
            )
        );


        data += size;
        len  -= size;
    }
}


void app_main(void)
{
    ESP_LOGI(TAG, "NS4168 WAV player");

    i2s_init();

    play_wav();
}

6、测试验证

测试的时候,可以电脑上听一遍,然后喇叭再放一编,看看有什么区别。

相关推荐
别催小唐敲代码12 小时前
Pixhawk 6C — Mission Planner 烧录 & 全套校准教程
stm32·单片机·嵌入式硬件
Freak嵌入式13 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
Freak嵌入式15 小时前
Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
汇编·stm32·单片机·嵌入式硬件·fpga开发·硬件架构
自小吃多15 小时前
PCB Editor软件差分对添加与设置笔记
笔记·嵌入式硬件
智购科技无人售货机厂家18 小时前
2026自动售货机连接器选型指南:从IP等级到插拔寿命的工程实践~YH
单片机·嵌入式硬件
Jaixln_HRF19 小时前
率能SS6548D 单通道16A/40V大电流H桥驱动芯片,45mΩ超低导通电阻,用于打印机/扫地机/工业设备
驱动开发·嵌入式硬件·硬件工程
Jason_zhao_MR20 小时前
电能质量监测为什么需要PTP精确时钟同步
linux·单片机·嵌入式硬件·嵌入式
Freak嵌入式20 小时前
RP2040 PIO 编程模型与状态机原理:从硬件架构到工作逻辑全解析
java·大数据·开发语言·单片机·嵌入式硬件·硬件架构
Messy create20 小时前
【BMS-AFE-断路检测】
单片机·嵌入式硬件·能源
恶魔泡泡糖21 小时前
stm32F103C8T6标准库DWT基础应用1
stm32·单片机·嵌入式硬件