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、测试验证

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

相关推荐
尼喃5 小时前
OVP/OCP过压过流保护芯片选型表:2A、3A、5A与10A方案怎么选
嵌入式硬件
NYFEA11 小时前
NF532重磅上新:高集成度13.56MHz非接触式控制器
嵌入式硬件
创界工坊工作室13 小时前
29-基于单片机的万年历设计
stm32·单片机·嵌入式硬件·proteus
国科安芯13 小时前
在轨服务与空间机器人任务中跨飞行器CANFD互连的共模与单粒子问题综述
嵌入式硬件·机器人·canfd·低轨卫星·商业航天·抗辐射
沐欣工作室_lvyiyi14 小时前
基于STM32的社区养老控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·社区养老控制系统·保定理工学院·华德学院·淮南师范学院
chengpei14714 小时前
硬改斐讯K2路由器32M Flash编译适配immortalwrt固件
嵌入式硬件·智能路由器
snow@li14 小时前
单片机:全景梳理核心原理与体系深度分析
单片机·嵌入式硬件
创界工坊工作室14 小时前
26-基于51单片机的智能热水器控制系统设计
stm32·单片机·嵌入式硬件·毕业设计·51单片机·proteus
NendoZen14 小时前
mangopi(芒果派)MQ-R T113 Buildroot开启adbd调试
linux·嵌入式硬件
碧海银沙音频科技研究院15 小时前
基于炬芯ATS308X内置音乐铃声与扫频音频功能实现
单片机·嵌入式硬件