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

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

相关推荐
周洲08302 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元2 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡3 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
Kuakewei8884 小时前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
ACP广源盛139246256734 小时前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
z20348315204 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
国科安芯6 小时前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构
ACP广源盛139246256736 小时前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
ACP广源盛139246256736 小时前
WAIC2026 国产算力浪潮下@ACP#IX8024 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
振南的单片机世界7 小时前
硬核菊花链:3个GPIO+无限74HC595=端口扩展“无限套娃”
arm开发·stm32·单片机·嵌入式硬件