class I2S – Inter-IC Sound 总线协议

I2S 是一种同步串行协议,用于连接数字音频设备。在物理层面,总线由 3 条线组成:SCK、WS、SD。I2S 类支持控制器操作。不支持外设操作。

I2S 类目前作为技术预览版提供。在预览期间,鼓励用户提供反馈。基于这些反馈,I2S 类的 API 和实现可能会有所变化。

可以使用以下方式创建和初始化 I2S 对象:

from machine import I2S
from machine import Pin

# ESP32
sck_pin = Pin(14)   # Serial clock output
ws_pin = Pin(13)    # Word clock output
sd_pin = Pin(12)    # Serial data output

or

# PyBoards
sck_pin = Pin("Y6")   # Serial clock output
ws_pin = Pin("Y5")    # Word clock output
sd_pin = Pin("Y8")    # Serial data output

audio_out = I2S(2,
                sck=sck_pin, ws=ws_pin, sd=sd_pin,
                mode=I2S.TX,
                bits=16,
                format=I2S.MONO,
                rate=44100,
                ibuf=20000)

audio_in = I2S(2,
               sck=sck_pin, ws=ws_pin, sd=sd_pin,
               mode=I2S.RX,
               bits=32,
               format=I2S.STEREO,
               rate=22050,
               ibuf=20000)
支持 3 种操作模式:
  • 阻塞

  • 非阻塞

  • 异步

阻塞:

num_written = audio_out.write(buf) # blocks until buf emptied

num_read = audio_in.readinto(buf) # blocks until buf filled

非阻塞:

audio_out.irq(i2s_callback)         # i2s_callback is called when buf is emptied
num_written = audio_out.write(buf)  # returns immediately

audio_in.irq(i2s_callback)          # i2s_callback is called when buf is filled
num_read = audio_in.readinto(buf)   # returns immediately

异步:

swriter = asyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()

sreader = asyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)

构造函数

class machine.I2S(id, *, sck, ws, sd, mck=None, mode, bits, format, rate, ibuf)

构造一个给定 id 的 I2S 对象:

  • id 标识特定的 I2S 总线;它是特定于板和移植版本的

仅限关键字参数,这些参数在所有移植版本上都支持:

  • sck 是串行时钟线的引脚对象

  • ws 是字选择线的引脚对象

  • sd 是串行数据线的引脚对象

  • mck 是主时钟线的引脚对象;主时钟频率是采样率 * 256

  • mode 指定接收或传输

  • bits 指定样本大小(位),16 或 32

  • format 指定通道格式,STEREO 或 MONO

  • rate 指定音频采样率(Hz);这是 ws 信号的频率

  • ibuf 指定内部缓冲区长度(字节)

对于所有移植版本,DMA 在后台连续运行,允许用户应用程序在样本数据在内部缓冲区和 I2S 外设单元之间传输时执行其他操作。增加内部缓冲区的大小有可能增加用户应用程序在下溢(例如 write 方法)或上溢(例如 readinto 方法)之前执行非 I2S 操作的时间。

方法

I2S.init(sck, ...)

有关参数描述,请参阅构造函数

I2S.deinit()

反初始化I2S总线

I2S.readinto(buf)

将音频样本读入由 buf 指定的缓冲区。buf 必须支持缓冲协议,如 bytearray 或 array。“buf”字节顺序为小端。对于 Stereo 格式,左声道样本在右声道样本之前。对于 Mono 格式,使用左声道样本数据。返回读取的字节数

I2S.write(buf)

写入 buf 中包含的音频样本。buf 必须支持缓冲协议,如 bytearray 或 array。“buf”字节顺序为小端。对于 Stereo 格式,左声道样本在右声道样本之前。对于 Mono 格式,样本数据写入右声道和左声道。返回写入的字节数

I2S.irq(handler)

设置回调。当 buf 清空(write 方法)或变满(readinto 方法)时,调用 handler。设置回调将 writereadinto 方法改为非阻塞操作。handler 在 MicroPython 调度器的上下文中被调用。

static I2S.shift(*, buf, bits, shift)

buf 中包含的所有样本进行位移。bits 指定样本大小(位)。shift 指定每个样本要移位的位数。正数表示左移,负数表示右移。通常用于音量控制。每位移动改变样本音量 6dB。

常量

I2S.RX

初始化I2S总线 mode 为接收

I2S.TX

初始化 I2S 总线 mode 为传输

I2S.STEREO

初始化 I2S 总线 format 为立体声

I2S.MONO

初始化 I2S 总线 format 为单声道