ESP32芯片选择:
需要使用2个通道IIS的,只能选择ESP32、ESP32-S3、ESP32-P4三种之一,需要适应PDM RX时也只能选择这3个芯片系列。
芯片 | I2S 标准 | PDM TX | PDM RX | TDM | ADC/DAC | LCD/摄像头 |
---|---|---|---|---|---|---|
ESP32 | I2S 0/1 | I2S 0 | I2S 0 | 无 | I2S 0 | I2S 0 |
ESP32-S2 | I2S 0 | 无 | 无 | 无 | 无 | I2S 0 |
ESP32-C3 | I2S 0 | I2S 0 | 无 | I2S 0 | 无 | 无 |
ESP32-C6 | I2S 0 | I2S 0 | 无 | I2S 0 | 无 | 无 |
ESP32-S3 | I2S 0/1 | I2S 0 | I2S 0 | I2S 0/1 | 无 | 无 |
ESP32-H2 | I2S 0 | I2S 0 | 无 | I2S 0 | 无 | 无 |
ESP32-P4 | I2S 0~2 | I2S 0 | I2S 0 | I2S 0~2 | 无 | 无 |
I2S简介
I2S(Inter-IC Sound,集成电路内置音频总线)是一种同步串行通信协议,通常用于在两个数字音频设备之间传输音频数据。
ESP32-S3 包含 2 个 I2S 外设。通过配置这些外设,可以借助 I2S 驱动来输入和输出采样数据。
标准或 TDM 通信模式下的 I2S 总线包含以下几条线路:
MCLK:主时钟线。该信号线可选,具体取决于从机,主要用于向 I2S 从机提供参考时钟。
BCLK:位时钟线。用于数据线的位时钟。
WS:字(声道)选择线。通常用于识别声道(除 PDM 模式外)。
DIN/DOUT:串行数据输入/输出线。如果 DIN 和 DOUT 被配置到相同的 GPIO,数据将在内部回环。
PDM 通信模式下的 I2S 总线包含以下几条线路:
CLK:PDM 时钟线。
DIN/DOUT:串行数据输入/输出线。
每个 I2S 控制器都具备以下功能,可由 I2S 驱动进行配置:
可用作系统主机或从机
可用作发射器或接收器
DMA 控制器支持流数据采样,CPU 无需单独复制每个采样数据
每个控制器都有独立的 RX 和 TX 通道,连接到不同 GPIO 管脚,能够在不同的时钟和声道配置下工作。注意,尽管在一个控制器上 TX 通道和 RX 通道的内部 MCLK 相互独立,但输出的 MCLK 信号只能连接到一个通道。如果需要两个互相独立的 MCLK 输出,必须将其分配到不同的 I2S 控制器上。
I2S 文件结构
需要包含在 I2S 应用中的公共头文件如下所示:
i2s.h:提供原有 I2S API(用于使用原有驱动的应用)。
i2s_std.h:提供标准通信模式的 API(用于使用标准模式的新驱动程序的应用)。
i2s_pdm.h:提供 PDM 通信模式的 API(用于使用 PDM 模式的新驱动程序的应用)。
i2s_tdm.h:提供 TDM 通信模式的 API(用于使用 TDM 模式的新驱动的应用)。
备注
原有驱动与新驱动无法共存。包含 i2s.h 以使用原有驱动,或包含其他三个头文件以使用新驱动。原有驱动未来可能会被删除。
已包含在上述头文件中的公共头文件如下所示:
i2s_types_legacy.h:提供只在原有驱动中使用的原有公共类型。
i2s_types.h:提供公共类型。
i2s_common.h:提供所有通信模式通用的 API。
I2S 时钟
时钟源
i2s_clock_src_t::I2S_CLK_SRC_DEFAULT:默认 PLL 时钟。
i2s_clock_src_t::I2S_CLK_SRC_PLL_160M:160 MHz PLL 时钟。
时钟术语
采样率:单声道每秒采样数据数量。
SCLK:源时钟频率,即时钟源的频率。
MCLK:主时钟频率,BCLK 由其产生。MCLK 信号通常作为参考时钟,用于同步 I2S 主机和从机之间的 BCLK 和 WS。
BCLK:位时钟频率,一个 BCLK 时钟周期代表数据管脚上的一个数据位。通过 i2s_std_slot_config_t::slot_bit_width 配置的通道位宽即为一个声道中的 BCLK 时钟周期数量,因此一个声道中可以有 8/16/24/32 个 BCLK 时钟周期。
LRCK / WS:左/右时钟或字选择时钟。在非 PDM 模式下,其频率等于采样率。
备注
通常,MCLK 应该同时是 采样率 和 BCLK 的倍数。字段 i2s_std_clk_config_t::mclk_multiple 表示 MCLK 相对于 采样率 的倍数。在大多数情况下,将其设置为 I2S_MCLK_MULTIPLE_256 即可。但如果 slot_bit_width 被设置为 I2S_SLOT_BIT_WIDTH_24BIT,为了保证 MCLK 是 BCLK 的整数倍,应该将 i2s_std_clk_config_t::mclk_multiple 设置为能被 3 整除的倍数,如 I2S_MCLK_MULTIPLE_384,否则 WS 会不精准。
I2S 通信模式
标准模式
标准模式中有且仅有左右两个声道,驱动中将声道称为 slot。这些声道可以支持 8/16/24/32 位宽的采样数据,声道的通信格式主要包括以下几种:
Philips 格式:数据信号与 WS 信号相比有一个位的位移。WS 信号的占空比为 50%。
MSB 格式:与 Philips 格式基本相同,但其数据没有位移。
PCM 帧同步:数据有一个位的位移,同时 WS 信号变成脉冲,持续一个 BCLK 周期。
PDM 模式 (TX)
在 PDM(Pulse-density Modulation,脉冲密度调制)模式下,TX 通道可以将 PCM 数据转换为 PDM 格式,该格式始终有左右两个声道。PDM TX 只在 I2S0 中受支持,且只支持 16 位宽的采样数据。PDM TX 至少需要一个 CLK 管脚用于时钟信号,一个 DOUT 管脚用于数据信号(即下图中的 WS 和 SD 信号。BCK 信号为内部位采样时钟,在 PDM 设备之间不需要)。PDM 模式允许用户配置上采样参数 i2s_pdm_tx_clk_config_t::up_sample_fp 和 i2s_pdm_tx_clk_config_t::up_sample_fs,上采样率可以通过公式 up_sample_rate = i2s_pdm_tx_clk_config_t::up_sample_fp / i2s_pdm_tx_clk_config_t::up_sample_fs 来计算。在 PDM TX 中有以下两种上采样模式:
固定时钟频率模式:在这种模式下,上采样率将根据采样率的变化而变化。设置 fp = 960、 fs = sample_rate / 100,则 CLK 管脚上的时钟频率 (Fpdm) 将固定为 128 * 48 KHz = 6.144 MHz。注意此频率不等于采样率 (Fpcm)。
固定上采样率模式:在这种模式下,上采样率固定为 2。设置 fp = 960、 fs = 480,则 CLK 管脚上的时钟频率 (Fpdm) 将为 128 * sample_rate。
PDM 模式 (RX)
在 PDM(Pulse-density Modulation,脉冲密度调制)模式下,RX 通道可以接收 PDM 格式的数据并将数据转换成 PCM 格式。PDM RX 只在 I2S0 中受支持,且只支持 16 位宽的采样数据。PDM RX 至少需要一个 CLK 管脚用于时钟信号,一个 DIN 管脚用于数据信号。此模式允许用户配置下采样参数 i2s_pdm_rx_clk_config_t::dn_sample_mode。在 PDM RX 中有以下两种下采样模式:
i2s_pdm_dsr_t::I2S_PDM_DSR_8S:在这种模式下,WS 管脚的时钟频率 (Fpdm) 将为 sample_rate (Fpcm) * 64。
i2s_pdm_dsr_t::I2S_PDM_DSR_16S: 在这种模式下,WS 管脚的时钟频率 (Fpdm) 将为 sample_rate (Fpcm) * 128。
TDM 模式
TDM(Time Division Multiplexing,时分多路复用)模式最多支持 16 个声道,可通过 i2s_tdm_slot_config_t::slot_mask 启用通道。
但由于硬件限制,声道设置为 32 位宽时最多只能支持 4 个声道,16 位宽时最多只能支持 8 个声道,8 位宽时最多只能支持 16 个声道。TDM 的声道通信格式与标准模式基本相同,但有一些细微差别。
Philips 格式:数据信号与 WS 信号相比有一个位的位移。无论一帧中包含多少个声道,WS 信号的占空比将始终保持为 50%。
TDM Philips Timing Diagram
MSB 格式:与 Philips 格式基本相同,但数据没有位移。
PCM 短帧同步:数据有一个位的位移,同时 WS 信号变为脉冲,每帧持续一个 BCLK 周期。
PCM 长帧同步:数据有一个位的位移,同时 WS 信号将在每一帧持续一个声道的宽度。例如,如果启用了四个声道,那么 WS 的占空比将是 25%,如果启用了五个声道,则为 20%。
详情参阅链接