如何在I2S(数据音频时钟控制器模式)「音频 时钟」

I2S(Inter-IC Sound,集成电路内置音频总线)是一种同步串行通信协议,通常用于在两个数字音频设备之间传输音频数据
ESP32 包含两个 I2S 外设,可以通过 I2S 驱动来配置输入和输出采样数据
I2S 协议的基本原理是使用以下几条线来传输数据:MCLK:主时钟线,可选的信号,主要用于为 I2S 从设备提供参考时钟
BCLK:位时钟线,用于数据线的位时钟
WS:字(槽)选择线,通常用于标识声道,除了 PDM 模式
DIN/DOUT:串行数据输入/输出线
(如果 din 和 dout 设置为相同的 GPIO,则数据会在内部回环)I2S 外设还支持 LCD 模式,用于通过并行总线传输数据,一些 LCD 显示器和摄像头模块使用这种模式
I2S 外设的每个控制器都有以下特性,可以通过 I2S 驱动来配置:作为系统主机或从机运行能够充当发送器或接收器DMA 控制器,允许流式传输采样数据,无需 CPU 复制每个数据样本每个控制器可以以半双工通信模式运行
因此,两个控制器可以组合起来建立全双工通信
I2S0 输出可以直接路由到数字模拟转换器(DAC)的输出通道(GPIO 25 和 GPIO 26),以产生直接的模拟输出,无需涉及任何外部 I2S 编解码器
I2S0 还可以用于传输 PDM(脉冲密度调制)信号
要在 ESP32 上使用 I2S,需要以下几个步骤:安装 I2S 驱动程序
可以使用 ESP-IDF 编程指南 或 Arduino-ESP32 文档2中提供的 I2S API 来安装驱动程序
配置 I2S 参数
需要根据应用场景选择合适的通信模式(标准、TDM 或 PDM)、时钟源、采样率、数据位宽、声道数等参数
连接 I2S 引脚
需要将 ESP32 的 I2S 引脚(MCLK、BCLK、WS、DIN/DOUT)连接到相应的外部设备(如音频编解码器、麦克风、扬声器等)
读写 I2S 数据
您可以使用 I2S API 中提供的函数来读取或写入音频数据,或者使用 DMA 控制器来实现数据流传输
以下是一个使用 ESP32 和 MAX98357A 来实现 I2S 的发送和接收音频数据的示例代码:这段代码会从一个外部设备(如麦克风)读取音频数据,并将其发送到另一个外部设备(如扬声器)
#include "driver/i2s.h"#define SAMPLE_RATE (44100)#define SAMPLE_BITS (16)#define CHANNELS (2)#define PIN_I2S_BCLK (26)#define PIN_I2S_LRC (25)#define PIN_I2S_DIN (33)#define PIN_I2S_DOUT (27)void app_main(void){ //配置I2S参数 i2s_config_t i2s_config = { .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, //主机模式,发送和接收 .sample_rate = SAMPLE_RATE, .bits_per_sample = SAMPLE_BITS, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //双声道 .communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, //中断优先级 .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = false }; //配置I2S引脚 i2s_pin_config_t pin_config = { .bck_io_num = PIN_I2S_BCLK, //位时钟 .ws_io_num = PIN_I2S_LRC, //字选择 .data_out_num = PIN_I2S_DOUT, //数据输出 .data_in_num = PIN_I2S_DIN //数据输入 }; //安装I2S驱动程序 i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL); //设置I2S引脚 i2s_set_pin(I2S_NUM_0, &pin_config); //设置I2S时钟 i2s_set_clk(I2S_NUM_0, SAMPLE_RATE, SAMPLE_BITS, CHANNELS); //创建一个缓冲区,用于存储音频数据 int buffer_size = 1024; char buffer = malloc(buffer_size); while (1) { //从I2S读取音频数据 int bytes_read = 0; i2s_read(I2S_NUM_0, buffer, buffer_size, &bytes_read, portMAX_DELAY); //将音频数据写入I2S int bytes_written = 0; i2s_write(I2S_NUM_0, buffer, bytes_read, &bytes_written, portMAX_DELAY); }}
如何在I2S(数据音频时钟控制器模式)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息