I2S - Inter-IC Sound,正确书写的 I²S 发音为“eye-squared-ess”,另一种表示法是 IIS。I²S 是一种电气串行总线接口标准,用于将数字音频设备连接在一起。
它用于在电子设备中的集成电路之间传输 PCM(脉冲编码调制)音频数据。I²S 总线将时钟和串行数据信号分开,与需要从数据流中恢复时钟的异步通信系统所需的接收器相比,接收器更简单。
尽管名称相似,但 I²S 与双向 I²C (IIC) 总线无关且不兼容。
I²S 总线至少由三条线路组成:
注意
所有线路都可以连接到几乎任何引脚,即使在运行过程中也会发生这种变化。
它还可能包括 Master clock 线:
注意
有关每个 ESP32 芯片的 I2S 外设的更多详细信息,请查看 ESP-IDF 文档 。
在 Master mode (默认) 下,器件在 ws.
在 Slave 模式下 ,器件监听连接的 pins 的 clock 信号和字选择 - 即,除非外部驱动,否则 pins 将保持低电平。目前尚不支持此模式。
作模式的设置是通过函数 begin 完成的,也是由函数参数模式设置的。
由于时钟源不同,PDM 模式始终处于 Simplex 模式,仅使用一个数据引脚。
STD 和 TDM 模式在双工模式下工作,使用两个独立的数据引脚:
在此模式下,驱动程序能够在每条线路上同时读取和写入,适用于对讲机或电话等应用程序。
这是通道样本中的位数。数据位宽由函数参数 bits_cfg 设置。当前支持的值为:
采样率由函数参数 rate 设置。它是每秒的采样数,以 Hz 为单位。
插槽模式由功能参数 ch 设置。当前支持的值为:
在初始化之前,设置要使用的引脚。
使用前,请选择要使用的 pin。
bool begin(i2s_mode_t mode, uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, int8_t slot_mask=-1)
Parameters: 参数:
此函数将在成功时返回 true,如果失败,则返回 true。
失败时,如果设置了正确的日志级别,将打印错误消息。
执行安全的取消初始化 - free buffers、destroy task、end driver operation 等。
void end()
设置引脚的功能将取决于作模式。
使用标准或 TDM 模式时设置 I2S 接口的引脚。
void setPins(int8_t bclk, int8_t ws, int8_t dout, int8_t din=-1, int8_t mclk=-1)
Parameters: 参数:
使用 PDM TX 模式时,设置 I2S 接口的引脚。
void setPinsPdmTx(int8_t clk, int8_t dout0, int8_t dout1=-1)
Parameters: 参数:
使用 PDM RX 模式时,设置 I2S 接口的引脚。
void setPinsPdmRx(int8_t clk, int8_t din0, int8_t din1=-1, int8_t din2=-1, int8_t din3=-1)
Parameters: 参数:
设置在使用 standard 或 TDM 模式时哪些 pins 具有 inverted logic 。数据引脚不能反转。
void setInverted(bool bclk, bool ws, bool mclk=false)
Parameters: 参数:
设置在使用 PDM 模式时哪些引脚具有反转逻辑。数据引脚不能反转。
void setInvertedPdm(bool clk)
Parameters: 参数:
I2S 配置可以在运行期间更改。
配置 I2S TX 通道。
bool configureTX(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, int8_t slot_mask=-1)
Parameters: 参数:
此函数将在成功时返回 true,如果失败,则返回 true。
失败时,如果设置了正确的日志级别,将打印错误消息。
配置 I2S RX 通道。
bool configureRX(uint32_t rate, i2s_data_bit_width_t bits_cfg, i2s_slot_mode_t ch, i2s_rx_transform_t transform=I2S_RX_TRANSFORM_NONE)
Parameters: 参数:
此函数将在成功时返回 true,如果失败,则返回 true。
失败时,如果设置了正确的日志级别,将打印错误消息。
获取 TX 通道处理程序指针。
i2s_chan_handle_t txChan()
获取 TX 采样率。
uint32_t txSampleRate()
获取 TX 数据宽度(8 位、16 位或 32 位)。
i2s_data_bit_width_t txDataWidth()
获取 TX 插槽模式(立体声或单声道)。
i2s_slot_mode_t txSlotMode()
获取 RX 通道处理程序指针。
i2s_chan_handle_t rxChan()
获取 RX 采样率。
uint32_t rxSampleRate()
获取 RX 数据宽度(8 位、16 位或 32 位)。
i2s_data_bit_width_t rxDataWidth()
获取 RX 插槽模式(立体声或单声道)。
i2s_slot_mode_t rxSlotMode()
从 I2S 接口读取一定数量的数据字节。
size_t readBytes(char *buffer, size_t size)
Parameters: 参数:
此函数将返回读取的字节数。
从 I2S 接口读取下一个可用字节。
int read()
此函数将返回下一个可用字节,如果没有可用数据或发生错误,则返回 -1。
write 写入
write 函数有两个版本:
第一个版本向 I2S 接口写入一定数量的数据字节。
size_t write(uint8_t *buffer, size_t size)
Parameters: 参数:
此函数将返回写入的字节数。
第二个版本将单个字节写入 I2S 接口。
size_t write(uint8_t d)
Parameters: 参数:
如果写入了字节,则此函数将返回 1,如果发生错误,则返回 0。
Get 如果有可供读取的数据。
int available()
如果有可供读取的数据 , 此函数将返回 I2S_READ_CHUNK_SIZE,如果没有,则返回 -1。
从 I2S 接口获取下一个可用字节,而无需将其从缓冲区中删除。当前未实现。
int peek()
此函数当前将始终返回 -1。
获取 I2S 接口上 I/O 作的最后一个错误代码。
int lastError()
使用当前的 RX 设置将短的 PCM WAV 录制到内存中。返回必须由用户释放的缓冲区。
uint8_t * recordWAV(size_t rec_seconds, size_t * out_size)
Parameters: 参数:
此函数将返回一个指针,该指针指向包含录制的 WAV 数据的缓冲区,如果发生错误,则返回 NULL。
使用当前 TX 设置从内存中播放 PCM WAV。
void playWAV(uint8_t * data, size_t len)
Parameters: 参数:
使用当前 TX 设置从内存中播放 MP3。
bool playMP3(uint8_t *src, size_t src_len)
Parameters: 参数:
此函数将在成功时返回 true,如果失败,则返回 false。
失败时,如果设置了正确的日志级别,将打印错误消息。
#include <ESP_I2S.h>
const int buff_size = 128;
int available_bytes, read_bytes;
uint8_t buffer[buff_size];
I2SClass I2S;
void setup() {
I2S.setPins(5, 25, 26, 35, 0); //SCK, WS, SDOUT, SDIN, MCLK
I2S.begin(I2S_MODE_STD, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO);
I2S.read();
available_bytes = I2S.available();
if(available_bytes < buff_size) {
read_bytes = I2S.readBytes(buffer, available_bytes);
} else {
read_bytes = I2S.readBytes(buffer, buff_size);
}
I2S.write(buffer, read_bytes);
I2S.end();
}
void loop() {}