Inter-IC Sound (I2S)¶
Overview¶
I2S (Inter-IC Sound) is a serial, synchronous communication protocol that is usually used for transmitting audio data between two digital audio devices.
ESP32-S3 contains two I2S peripheral(s). These peripherals can be configured to input and output sample data via the I2S driver.
An I2S bus consists of the following lines:
Master clock line (operational)
Bit clock line
Channel select line
Serial data line
Each I2S controller has the following features that can be configured using the I2S driver:
Operation as system master or slave
Capable of acting as transmitter or receiver
DMA controller that allows for streaming sample data without requiring the CPU to copy each data sample
Each controller can operate in half-duplex communication mode. Thus, the two controllers can be combined to establish full-duplex communication.
Functional Overview¶
Installing the Driver¶
Install the I2S driver by calling the function :cpp:func`i2s_driver_install` and passing the following arguments:
Port number
The structure
i2s_config_t
with defined communication parametersEvent queue size and handle
Once :cpp:func`i2s_driver_install` returns ESP_OK
, it means I2S has started.
Configuration example:
static const int i2s_num = 0; // i2s port number
i2s_config_t i2s_config = {
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
.sample_rate = 44100,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.tx_desc_auto_clear = false,
.dma_buf_count = 8,
.dma_buf_len = 64,
.bits_per_chan = I2S_BITS_PER_SAMPLE_16BIT
};
i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
Setting Communication Pins¶
Once the driver is installed, configure physical GPIO pins to which signals will be routed. For this, call the function :cpp:func`i2s_set_pin` and pass the following arguments to it:
Port number
The structure
i2s_pin_config_t
defining the GPIO pin numbers to which the driver should route the MCK, BCK, WS, DATA out, and DATA in signals. If you want to keep a currently allocated pin number for a specific signal, or if this signal is unused, then pass the macroI2S_PIN_NO_CHANGE
. See the example below.
注解
MCK only takes effect in I2S_MODE_MASTER mode.
static const i2s_pin_config_t pin_config = {
.mck_io_num = 0,
.bck_io_num = 4,
.ws_io_num = 5,
.data_out_num = 18,
.data_in_num = I2S_PIN_NO_CHANGE
};
i2s_set_pin(i2s_num, &pin_config);
Running I2S Communication¶
To perform a transmission:
Prepare the data for sending
Call the function
i2s_write()
and pass the data buffer address and data length to it
The function will write the data to the DMA Tx buffer, and then the data will be transmitted automatically.
i2s_write(I2S_NUM, samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100);
To retrieve received data, use the function i2s_read()
. It will retrieve the data from the DMA Rx buffer, once the data is received by the I2S controller.
i2s_read(I2S_NUM, data_recv, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_read, 100);
You can temporarily stop the I2S driver by calling the function i2s_stop()
, which will disable the I2S Tx/Rx units until the function i2s_start()
is called. If the function :cpp:func`i2s_driver_install` is used, the driver will start up automatically eliminating the need to call i2s_start()
.
Deleting the Driver¶
If the established communication is no longer required, the driver can be removed to free allocated resources by calling i2s_driver_uninstall()
.
Application Example¶
A code example for the I2S driver can be found in the directory peripherals/i2s.
In addition, there is a short configuration examples for the I2S driver.
I2S configuration¶
Example for general usage.
#include "driver/i2s.h"
static const int i2s_num = 0; // i2s port number
i2s_config_t i2s_config = {
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
.sample_rate = 44100,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S
.tx_desc_auto_clear = false,
.dma_buf_count = 8,
.dma_buf_len = 64
};
static const i2s_pin_config_t pin_config = {
.bck_io_num = 4,
.ws_io_num = 5,
.data_out_num = 18,
.data_in_num = I2S_PIN_NO_CHANGE
};
i2s_driver_install(i2s_num, &i2s_config, 0, NULL); //install and start i2s driver
i2s_set_pin(i2s_num, &pin_config);
...
/* You can reset parameters by calling 'i2s_set_clk'
*
* The low 16 bits are the valid data bits in one chan and the high 16 bits are
* the total bits in one chan. If high 16 bits is smaller than low 16 bits, it will
* be set to a same value as low 16 bits.
*/
uint32_t bits_cfg = (I2S_BITS_PER_CHAN_32BIT << 16) | I2S_BITS_PER_SAMPLE_16BIT;
i2s_set_clk(i2s_num, 22050, bits_cfg, I2S_CHANNEL_STEREO);
...
i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver
I2S on ESP32-S3 support TDM mode, up to 16 channels are available in TDM mode. If you want to use TDM mode, set field channel_format
of i2s_config_t
to I2S_CHANNEL_FMT_MULTIPLE
. Then enable the channels by setting chan_mask
using masks in i2s_channel_t
, the number of active channels and total channels will be calculate automatically. Also you can set a particular total channel number for it, but it shouldn’t be smaller than the largest channel you use.
If active channels are discrete, the inactive channels within total channels will be filled by a constant automatically. But if skip_msk
is enabled, these inactive channels will be skiped.
#include "driver/i2s.h"
static const int i2s_num = 0; // i2s port number
i2s_config_t i2s_config = {
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
.sample_rate = 44100,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_MULTIPLE,
.communication_format = I2S_COMM_FORMAT_STAND_I2S
.tx_desc_auto_clear = false,
.dma_buf_count = 8,
.dma_buf_len = 64,
.chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH2
};
static const i2s_pin_config_t pin_config = {
.bck_io_num = 4,
.ws_io_num = 5,
.data_out_num = 18,
.data_in_num = I2S_PIN_NO_CHANGE
};
i2s_driver_install(i2s_num, &i2s_config, 0, NULL); //install and start i2s driver
i2s_set_pin(i2s_num, &pin_config);
...
/* You can reset parameters by calling 'i2s_set_clk'
*
* The low 16 bits are the valid data bits in one chan and the high 16 bits are
* the total bits in one chan. If high 16 bits is smaller than low 16 bits, it will
* be set to a same value as low 16 bits.
*/
uint32_t bits_cfg = (I2S_BITS_PER_CHAN_32BIT << 16) | I2S_BITS_PER_SAMPLE_16BIT;
i2s_set_clk(i2s_port_t i2s_num, 22050, bits_cfg, I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1); // set clock
...
i2s_driver_uninstall(i2s_num); //stop & destroy i2s driver
API Reference¶
Header File¶
Functions¶
-
esp_err_t
i2s_set_pin
(i2s_port_t i2s_num, const i2s_pin_config_t *pin)¶ Set I2S pin number.
Inside the pin configuration structure, set I2S_PIN_NO_CHANGE for any pin where the current configuration should not be changed.
- Note
The I2S peripheral output signals can be connected to multiple GPIO pads. However, the I2S peripheral input signal can only be connected to one GPIO pad.
- Parameters
i2s_num
: I2S port numberpin
: I2S Pin structure, or NULL to set 2-channel 8-bit internal DAC pin configuration (GPIO25 & GPIO26)
- Note
if *pin is set as NULL, this function will initialize both of the built-in DAC channels by default. if you don’t want this to happen and you want to initialize only one of the DAC channels, you can call i2s_set_dac_mode instead.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_FAIL IO error
-
esp_err_t
i2s_set_pdm_rx_down_sample
(i2s_port_t i2s_num, i2s_pdm_dsr_t downsample)¶ Set PDM mode down-sample rate In PDM RX mode, there would be 2 rounds of downsample process in hardware. In the first downsample process, the sampling number can be 16 or 8. In the second downsample process, the sampling number is fixed as 8. So the clock frequency in PDM RX mode would be (fpcm * 64) or (fpcm * 128) accordingly.
- Note
After calling this function, it would call i2s_set_clk inside to update the clock frequency. Please call this function after I2S driver has been initialized.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_ERR_NO_MEM Out of memory
- Parameters
i2s_num
: I2S port numberdownsample
: i2s RX down sample rate for PDM mode.
-
esp_err_t
i2s_set_pdm_tx_up_sample
(i2s_port_t i2s_num, const i2s_pdm_tx_upsample_cfg_t *upsample_cfg)¶ Set TX PDM mode up-sample rate.
- Note
If you have set PDM mode while calling ‘i2s_driver_install’, default PDM TX upsample parameters have already been set, no need to call this function again if you don’t have to change the default configuration
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_ERR_NO_MEM Out of memory
- Parameters
i2s_num
: I2S port numberupsample_cfg
: Set I2S PDM up-sample rate configuration
-
esp_err_t
i2s_driver_install
(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue)¶ Install and start I2S driver.
This function must be called before any I2S driver read/write operations.
- Parameters
i2s_num
: I2S port numberi2s_config
: I2S configurations - see i2s_config_t structqueue_size
: I2S event queue size/depth.i2s_queue
: I2S event queue handle, if set NULL, driver will not use an event queue.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_ERR_NO_MEM Out of memory
ESP_ERR_INVALID_STATE Current I2S port is in use
-
esp_err_t
i2s_driver_uninstall
(i2s_port_t i2s_num)¶ Uninstall I2S driver.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_ERR_INVALID_STATE I2S port has been uninstalled by others (e.g. LCD i80)
- Parameters
i2s_num
: I2S port number
-
esp_err_t
i2s_write
(i2s_port_t i2s_num, const void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait)¶ Write data to I2S DMA transmit buffer.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
- Parameters
i2s_num
: I2S port numbersrc
: Source address to write fromsize
: Size of data in bytes[out] bytes_written
: Number of bytes written, if timeout, the result will be less than the size passed in.ticks_to_wait
: TX buffer wait timeout in RTOS ticks. If this many ticks pass without space becoming available in the DMA transmit buffer, then the function will return (note that if the data is written to the DMA buffer in pieces, the overall operation may still take longer than this timeout.) Pass portMAX_DELAY for no timeout.
-
esp_err_t
i2s_write_expand
(i2s_port_t i2s_num, const void *src, size_t size, size_t src_bits, size_t aim_bits, size_t *bytes_written, TickType_t ticks_to_wait)¶ Write data to I2S DMA transmit buffer while expanding the number of bits per sample. For example, expanding 16-bit PCM to 32-bit PCM.
Format of the data in source buffer is determined by the I2S configuration (see i2s_config_t).
- Parameters
i2s_num
: I2S port numbersrc
: Source address to write fromsize
: Size of data in bytessrc_bits
: Source audio bitaim_bits
: Bit wanted, no more than 32, and must be greater than src_bits[out] bytes_written
: Number of bytes written, if timeout, the result will be less than the size passed in.ticks_to_wait
: TX buffer wait timeout in RTOS ticks. If this many ticks pass without space becoming available in the DMA transmit buffer, then the function will return (note that if the data is written to the DMA buffer in pieces, the overall operation may still take longer than this timeout.) Pass portMAX_DELAY for no timeout.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
-
esp_err_t
i2s_read
(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait)¶ Read data from I2S DMA receive buffer.
- Note
If the built-in ADC mode is enabled, we should call i2s_adc_enable and i2s_adc_disable around the whole reading process, to prevent the data getting corrupted.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
- Parameters
i2s_num
: I2S port numberdest
: Destination address to read intosize
: Size of data in bytes[out] bytes_read
: Number of bytes read, if timeout, bytes read will be less than the size passed in.ticks_to_wait
: RX buffer wait timeout in RTOS ticks. If this many ticks pass without bytes becoming available in the DMA receive buffer, then the function will return (note that if data is read from the DMA buffer in pieces, the overall operation may still take longer than this timeout.) Pass portMAX_DELAY for no timeout.
-
esp_err_t
i2s_set_sample_rates
(i2s_port_t i2s_num, uint32_t rate)¶ Set sample rate used for I2S RX and TX.
The bit clock rate is determined by the sample rate and i2s_config_t configuration parameters (number of channels, bits_per_sample).
bit_clock = rate * (number of channels) * bits_per_sample
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_ERR_NO_MEM Out of memory
- Parameters
i2s_num
: I2S port numberrate
: I2S sample rate (ex: 8000, 44100…)
-
esp_err_t
i2s_stop
(i2s_port_t i2s_num)¶ Stop I2S driver.
There is no need to call i2s_stop() before calling i2s_driver_uninstall().
Disables I2S TX/RX, until i2s_start() is called.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
- Parameters
i2s_num
: I2S port number
-
esp_err_t
i2s_start
(i2s_port_t i2s_num)¶ Start I2S driver.
It is not necessary to call this function after i2s_driver_install() (it is started automatically), however it is necessary to call it after i2s_stop().
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
- Parameters
i2s_num
: I2S port number
-
esp_err_t
i2s_zero_dma_buffer
(i2s_port_t i2s_num)¶ Zero the contents of the TX DMA buffer.
Pushes zero-byte samples into the TX DMA buffer, until it is full.
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
- Parameters
i2s_num
: I2S port number
-
esp_err_t
i2s_pcm_config
(i2s_port_t i2s_num, const i2s_pcm_cfg_t *pcm_cfg)¶ Configure I2S a/u-law decompress or compress.
- Note
This function should be called after i2s driver installed Only take effecttive when the i2s ‘communication_format’ is set to ‘I2S_COMM_FORMAT_STAND_PCM_SHORT’ or ‘I2S_COMM_FORMAT_STAND_PCM_LONG’
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
- Parameters
i2s_num
: I2S port numberpcm_cfg
: including mode selection and a/u-law decompress or compress configuration paramater
-
esp_err_t
i2s_set_clk
(i2s_port_t i2s_num, uint32_t rate, uint32_t bits_cfg, i2s_channel_t ch)¶ Set clock & bit width used for I2S RX and TX.
Similar to i2s_set_sample_rates(), but also sets bit width.
stop i2s;
calculate mclk, bck, bck_factor
malloc dma buffer;
start i2s
- Return
ESP_OK Success
ESP_ERR_INVALID_ARG Parameter error
ESP_ERR_NO_MEM Out of memory
- Parameters
i2s_num
: I2S port numberrate
: I2S sample rate (ex: 8000, 44100…)bits_cfg
: I2S bits configuration the low 16 bits is for data bits per sample in one channel (see ‘i2s_bits_per_sample_t’) the high 16 bits is for total bits in one channel (see ‘i2s_bits_per_chan_t’) high 16bits =0 means same as the bits per sample.ch
: I2S channel, (I2S_CHANNEL_MONO, I2S_CHANNEL_STEREO or specific channel in TDM mode)
-
float
i2s_get_clk
(i2s_port_t i2s_num)¶ get clock set on particular port number.
- Return
actual clock set by i2s driver
- Parameters
i2s_num
: I2S port number
Structures¶
-
struct
i2s_pcm_cfg_t
¶ I2S PCM configuration.
Public Members
-
i2s_pcm_compress_t
pcm_type
¶ I2S PCM a/u-law decompress or compress type
-
i2s_pcm_compress_t
-
struct
i2s_pdm_tx_upsample_cfg_t
¶ I2S PDM up-sample rate configuration.
- Note
TX PDM can only be set to the following two upsampling rate configurations: 1: fp = 960, fs = sample_rate / 100, in this case, Fpdm = 128*48000 2: fp = 960, fs = 480, in this case, Fpdm = 128*Fpcm = 128*sample_rate If the pdm receiver do not care the pdm serial clock, it’s recommended set Fpdm = 128*48000. Otherwise, the second configuration should be applied.
Public Members
-
int
sample_rate
¶ I2S PDM sample rate
-
int
fp
¶ I2S PDM TX upsampling paramater. Normally it should be set to 960
-
int
fs
¶ I2S PDM TX upsampling paramater. When it is set to 480, the pdm clock frequency Fpdm = 128 * sample_rate, when it is set to sample_rate / 100, Fpdm will be fixed to 128*48000
-
struct
i2s_pin_config_t
¶ I2S pin number for i2s_set_pin.
-
struct
i2s_driver_config_t
¶ I2S driver configuration parameters.
Public Members
-
i2s_mode_t
mode
¶ I2S work mode
-
uint32_t
sample_rate
¶ I2S sample rate
-
i2s_bits_per_sample_t
bits_per_sample
¶ I2S sample bits in one channel
-
i2s_channel_fmt_t
channel_format
¶ I2S channel format.
-
i2s_comm_format_t
communication_format
¶ I2S communication format
-
int
intr_alloc_flags
¶ Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info
-
int
dma_buf_count
¶ I2S DMA Buffer Count
-
int
dma_buf_len
¶ I2S DMA Buffer Length
-
bool
use_apll
¶ I2S using APLL as main I2S clock, enable it to get accurate clock
-
bool
tx_desc_auto_clear
¶ I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability)
-
int
fixed_mclk
¶ I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value. If fixed_mclk set, mclk_multiple won’t take effect
-
i2s_mclk_multiple_t
mclk_multiple
¶ The multiple of I2S master clock(MCLK) to sample rate
-
i2s_bits_per_chan_t
bits_per_chan
¶ I2S total bits in one channel, only take effect when larger than ‘bits_per_sample’, default ‘0’ means equal to ‘bits_per_sample’
-
i2s_channel_t
chan_mask
¶ I2S active channel bit mask, set value in
i2s_channel_t
to enable specific channel, the bit map of active channel can not exceed (0x1<<total_chan).
-
uint32_t
total_chan
¶ I2S Total number of channels. If it is smaller than the biggest active channel number, it will be set to this number automatically.
-
bool
left_align
¶ Set to enable left alignment
-
bool
big_edin
¶ Set to enable big edin
-
bool
bit_order_msb
¶ Set to enable msb order
-
bool
skip_msk
¶ Set to enable skip mask. If it is enabled, only the data of the enabled channels will be sent, otherwise all data stored in DMA TX buffer will be sent
-
i2s_mode_t
-
struct
i2s_event_t
¶ Event structure used in I2S event queue.
Macros¶
-
I2S_PIN_NO_CHANGE
¶ Use in i2s_pin_config_t for pins which should not be changed
-
I2S_PDM_DEFAULT_UPSAMPLE_CONFIG
(rate)¶ Default I2S PDM Up-Sampling Rate configuration.
Enumerations¶
-
enum
i2s_port_t
¶ I2S port number, the max port number is (I2S_NUM_MAX -1).
Values:
-
I2S_NUM_0
= 0¶ I2S port 0
-
I2S_NUM_1
= 1¶ I2S port 1
-
I2S_NUM_MAX
¶ I2S port max
-
-
enum
i2s_event_type_t
¶ I2S event queue types.
Values:
-
I2S_EVENT_DMA_ERROR
¶
-
I2S_EVENT_TX_DONE
¶ I2S DMA finish sent 1 buffer
-
I2S_EVENT_RX_DONE
¶ I2S DMA finish received 1 buffer
-
I2S_EVENT_TX_Q_OVF
¶ I2S DMA sent queue overflow
-
I2S_EVENT_RX_Q_OVF
¶ I2S DMA receive queue overflow
-
I2S_EVENT_MAX
¶ I2S event max index
-
Header File¶
Enumerations¶
-
enum
i2s_bits_per_sample_t
¶ I2S bit width per sample.
Values:
-
I2S_BITS_PER_SAMPLE_8BIT
= 8¶ data bit-width: 8
-
I2S_BITS_PER_SAMPLE_16BIT
= 16¶ data bit-width: 16
-
I2S_BITS_PER_SAMPLE_24BIT
= 24¶ data bit-width: 24
-
I2S_BITS_PER_SAMPLE_32BIT
= 32¶ data bit-width: 32
-
-
enum
i2s_bits_per_chan_t
¶ I2S bit width per chan.
Values:
-
I2S_BITS_PER_CHAN_DEFAULT
= (0)¶ channel bit-width equals to data bit-width
-
I2S_BITS_PER_CHAN_8BIT
= (8)¶ channel bit-width: 8
-
I2S_BITS_PER_CHAN_16BIT
= (16)¶ channel bit-width: 16
-
I2S_BITS_PER_CHAN_24BIT
= (24)¶ channel bit-width: 24
-
I2S_BITS_PER_CHAN_32BIT
= (32)¶ channel bit-width: 32
-
-
enum
i2s_channel_t
¶ I2S channel.
Values:
-
I2S_CHANNEL_MONO
= (0x01 << 31) | 0x03¶ I2S channel (mono), two channel enabled. In this mode, you only need to send one channel data but the fifo will copy same data for another channel automatically, then both channels will transmit same data. The highest bit is for differentiating I2S_CHANNEL_STEREO since they both use two channels
-
I2S_CHANNEL_STEREO
= 0x03¶ I2S channel (stereo), two channel enabled. In this mode, two channels will transmit different data.
-
I2S_TDM_ACTIVE_CH0
= (0x1 << 0)¶ I2S channel 0 enabled
-
I2S_TDM_ACTIVE_CH1
= (0x1 << 1)¶ I2S channel 1 enabled
-
I2S_TDM_ACTIVE_CH2
= (0x1 << 2)¶ I2S channel 2 enabled
-
I2S_TDM_ACTIVE_CH3
= (0x1 << 3)¶ I2S channel 3 enabled
-
I2S_TDM_ACTIVE_CH4
= (0x1 << 4)¶ I2S channel 4 enabled
-
I2S_TDM_ACTIVE_CH5
= (0x1 << 5)¶ I2S channel 5 enabled
-
I2S_TDM_ACTIVE_CH6
= (0x1 << 6)¶ I2S channel 6 enabled
-
I2S_TDM_ACTIVE_CH7
= (0x1 << 7)¶ I2S channel 7 enabled
-
I2S_TDM_ACTIVE_CH8
= (0x1 << 8)¶ I2S channel 8 enabled
-
I2S_TDM_ACTIVE_CH9
= (0x1 << 9)¶ I2S channel 9 enabled
-
I2S_TDM_ACTIVE_CH10
= (0x1 << 10)¶ I2S channel 10 enabled
-
I2S_TDM_ACTIVE_CH11
= (0x1 << 11)¶ I2S channel 11 enabled
-
I2S_TDM_ACTIVE_CH12
= (0x1 << 12)¶ I2S channel 12 enabled
-
I2S_TDM_ACTIVE_CH13
= (0x1 << 13)¶ I2S channel 13 enabled
-
I2S_TDM_ACTIVE_CH14
= (0x1 << 14)¶ I2S channel 14 enabled
-
I2S_TDM_ACTIVE_CH15
= (0x1 << 15)¶ I2S channel 15 enabled
-
-
enum
i2s_comm_format_t
¶ I2S communication standard format.
Values:
-
I2S_COMM_FORMAT_STAND_I2S
= 0X01¶ I2S communication I2S Philips standard, data launch at second BCK
-
I2S_COMM_FORMAT_STAND_MSB
= 0X02¶ I2S communication MSB alignment standard, data launch at first BCK
-
I2S_COMM_FORMAT_STAND_PCM_SHORT
= 0x04¶ PCM Short standard, also known as DSP mode. The period of synchronization signal (WS) is 1 bck cycle.
-
I2S_COMM_FORMAT_STAND_PCM_LONG
= 0x0C¶ PCM Long standard. The period of synchronization signal (WS) is channel_bit*bck cycles.
-
I2S_COMM_FORMAT_STAND_MAX
¶ standard max
-
I2S_COMM_FORMAT_I2S
= 0x01¶ I2S communication format I2S, correspond to
I2S_COMM_FORMAT_STAND_I2S
-
I2S_COMM_FORMAT_I2S_MSB
= 0x01¶ I2S format MSB, (I2S_COMM_FORMAT_I2S |I2S_COMM_FORMAT_I2S_MSB) correspond to
I2S_COMM_FORMAT_STAND_I2S
-
I2S_COMM_FORMAT_I2S_LSB
= 0x02¶ I2S format LSB, (I2S_COMM_FORMAT_I2S |I2S_COMM_FORMAT_I2S_LSB) correspond to
I2S_COMM_FORMAT_STAND_MSB
-
I2S_COMM_FORMAT_PCM
= 0x04¶ I2S communication format PCM, correspond to
I2S_COMM_FORMAT_STAND_PCM_SHORT
-
I2S_COMM_FORMAT_PCM_SHORT
= 0x04¶ PCM Short, (I2S_COMM_FORMAT_PCM | I2S_COMM_FORMAT_PCM_SHORT) correspond to
I2S_COMM_FORMAT_STAND_PCM_SHORT
-
I2S_COMM_FORMAT_PCM_LONG
= 0x08¶ PCM Long, (I2S_COMM_FORMAT_PCM | I2S_COMM_FORMAT_PCM_LONG) correspond to
I2S_COMM_FORMAT_STAND_PCM_LONG
-
-
enum
i2s_channel_fmt_t
¶ I2S channel format type.
Values:
-
I2S_CHANNEL_FMT_RIGHT_LEFT
¶ Separated left and right channel
-
I2S_CHANNEL_FMT_ALL_RIGHT
¶ Load right channel data in both two channels
-
I2S_CHANNEL_FMT_ALL_LEFT
¶ Load left channel data in both two channels
-
I2S_CHANNEL_FMT_ONLY_RIGHT
¶ Only load data in right channel (mono mode)
-
I2S_CHANNEL_FMT_ONLY_LEFT
¶ Only load data in left channel (mono mode)
-
I2S_CHANNEL_FMT_MULTIPLE
¶ More than two channels are used
-
-
enum
i2s_mode_t
¶ I2S Mode.
Values:
-
I2S_MODE_MASTER
= (0x1 << 0)¶ Master mode
-
I2S_MODE_SLAVE
= (0x1 << 1)¶ Slave mode
-
I2S_MODE_TX
= (0x1 << 2)¶ TX mode
-
I2S_MODE_RX
= (0x1 << 3)¶ RX mode
-
I2S_MODE_PDM
= (0x1 << 6)¶ I2S PDM mode
-
-
enum
i2s_mclk_multiple_t
¶ The multiple of mclk to sample rate.
Values:
-
I2S_MCLK_MULTIPLE_DEFAULT
= 0¶ Default value. mclk = sample_rate * 256
-
I2S_MCLK_MULTIPLE_128
= 128¶ mclk = sample_rate * 128
-
I2S_MCLK_MULTIPLE_256
= 256¶ mclk = sample_rate * 256
-
I2S_MCLK_MULTIPLE_384
= 384¶ mclk = sample_rate * 384
-
-
enum
i2s_pcm_compress_t
¶ A/U-law decompress or compress configuration.
Values:
-
I2S_PCM_DISABLE
= 0¶ Disable A/U law decopress or compress
-
I2S_PCM_A_DECOMPRESS
¶ A-law decompress
-
I2S_PCM_A_COMPRESS
¶ A-law compress
-
I2S_PCM_U_DECOMPRESS
¶ U-law decompress
-
I2S_PCM_U_COMPRESS
¶ U-law compress
-
-
enum
i2s_pdm_dsr_t
¶ I2S PDM RX downsample mode.
Values:
-
I2S_PDM_DSR_8S
= 0¶ downsampling number is 8 for PDM RX mode
-
I2S_PDM_DSR_16S
¶ downsampling number is 16 for PDM RX mode
-
I2S_PDM_DSR_MAX
¶
-
-
enum
i2s_pdm_sig_scale_t
¶ Values:
-
I2S_PDM_SIG_SCALING_DIV_2
= 0¶ I2S TX PDM sigmadelta signal scaling: /2
-
I2S_PDM_SIG_SCALING_MUL_1
= 1¶ I2S TX PDM sigmadelta signal scaling: x1
-
I2S_PDM_SIG_SCALING_MUL_2
= 2¶ I2S TX PDM sigmadelta signal scaling: x2
-
I2S_PDM_SIG_SCALING_MUL_4
= 3¶ I2S TX PDM sigmadelta signal scaling: x4
-