ESP32 I2S

I2S支持DMA;

I2S可以直接利用DAC来输出模拟信号 (GPIO 25 & GPIO 26);

高精度时钟使能参数:   .use_apll = true

 

ESP32配置外设一般都是配置一个结构体,I2S也不例外:

static const i2s_config_t i2s_config = {
     .mode = I2S_MODE_MASTER | I2S_MODE_TX,
     .sample_rate = 44100,
     .bits_per_sample = 16,
     .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
     .communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
     .intr_alloc_flags = 0, // default interrupt priority
     .dma_buf_count = 8,
     .dma_buf_len = 64,
     .use_apll = false
};

I2S可以经由多个GPIO输出多路信号,但是输入信号只能由一个GPIO输入;

esp_err_t i2s_set_pin(i2s_port_t i2s_num,  const i2s_pin_config_t *pin)

这个函数有两个参数,第一个参数就是I2S的接口号,第二个参数是pin_config的结构体初始化,如果第二个结构体参数是NULL的话,就默认设置GPIO25&GPIO26引脚,也就是说内置的两个DAC都会被初始化;

 

下面这个API函数用于设置I2S的DAC模式,一般情况下I2S的内置DAC是被默认不激活的;

esp_err_ti2s_set_dac_mode(i2s_dac_mode_tdac_mode)

 内置的DAC至支持I2S1

 

下面这个API函数在I2S读写之前必须被引用,这个函数安装I2S驱动:

esp_err_ti2s_driver_install(i2s_port_ti2s_numconsti2s_config_t *i2s_config, int queue_size, void *i2s_queue)

 

下面这个函数就是卸载I2S驱动,用完了就卸载:

esp_err_ti2s_driver_uninstall(i2s_port_ti2s_num)

 

下面这个函数用来向DMA写数据,但是这个函数可能被官方取消,以后用I2S_write来取代:

int i2s_write_bytes(i2s_port_ti2s_numconst void *src, size_t size, TickType_t ticks_to_wait)

esp_err_ti2s_write(i2s_port_ti2s_numconst void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait)

 

下面这个函数用于设置传输速率,RX&TX都管用哦,

 esp_err_ti2s_set_sample_rates(i2s_port_ti2s_num, uint32_t rate)

 

下面两个函数分别是结束和开始I2S驱动:

 esp_err_ti2s_stop(i2s_port_ti2s_num)

 esp_err_ti2s_start(i2s_port_ti2s_num)

 

下面这个函数是清空I2S的DMA缓存:

 esp_err_ti2s_zero_dma_buffer(i2s_port_ti2s_num)

 

 

 

 

 

 


 

posted @ 2019-03-01 18:34  braveheart007  阅读(4057)  评论(0编辑  收藏  举报