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_num, consti2s_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_num, const void *src, size_t size, TickType_t ticks_to_wait)
esp_err_ti2s_write
(i2s_port_ti2s_num, const 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)