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

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

相关推荐
piaoyiren2 小时前
基于 STM32F103 蓝牙遥控云台超声波避障小车
stm32·单片机·嵌入式硬件·蓝牙·超声波测距·直流电机
ShallWeL2 小时前
Orin 上 USB / CSI 相机采集踩坑
人工智能·嵌入式硬件·智能硬件·agi
JSMSEMI113 小时前
JSM4430 30V N 沟道增强型 MOSFET
单片机·嵌入式硬件
XMAIPC_Robot4 小时前
RK3588+FPGA半导体设备量产踩坑大全|发热、时序漂移、推理抖动、成像干扰、EMC干扰方案
人工智能·嵌入式硬件·fpga开发·arm+fpga
朝饮坠露兮14 小时前
#浮动源 vs 共地源:模拟 IC 测试中的 VI 源架构详解
嵌入式硬件
碎光拾影17 小时前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
wuyk55520 小时前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
梅名智20 小时前
找不到libm.so, libc.so
嵌入式硬件
CPETW21 小时前
企业版配套软件介绍 ---- USB TO SPI 3.0-Slave
网络·科技·单片机·嵌入式硬件·电子