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

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

相关推荐
Industio_触觉智能18 小时前
RK3506 Buildroot系统目录地图-上|7个关键符号链接与构建产物全解析
嵌入式硬件·sdk·智能硬件·固件·瑞芯微·系统编译·rk3506
lzj_pxxw21 小时前
STM32移植FreeRTOS(Cmake+CubeMX)
vscode·stm32·嵌入式硬件
물の韜1 天前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
无敌贵点大王1 天前
从寄存器层面重学STM32(7)——定时器
stm32·单片机·嵌入式硬件
碧海银沙音频科技研究院1 天前
粉色笔记本电脑每次要等把电池电耗尽才能开机问题解决方法
嵌入式硬件
wuyk5552 天前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
shijuejianceliu2 天前
传统规则视觉与嵌入式AI智能相机的技术差异
人工智能·嵌入式硬件·视觉检测·相机
不脱发的程序猿2 天前
GD32串口数据收进内存之后DMA如何处理?
单片机·嵌入式硬件·dma·嵌入式·串口通信·gd32
FPGA小迷弟2 天前
FPGA 与千兆以太网校验和:从原理到 Verilog 实现
嵌入式硬件·fpga开发·无人机·ai编程·fpga
国科安芯3 天前
83 倍:ASC0108S 在推挽和开漏之间,差的不是速度,是回程
单片机·嵌入式硬件·架构·电平转换·抗辐射