【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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、测试验证
测试的时候,可以电脑上听一遍,然后喇叭再放一编,看看有什么区别。