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
sdout_pin = Pin(12) # Serial data output

or

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

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

audio_in = I2S(2,
               sck=sck_pin, ws=ws_pin, sdin=sdin_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 = uasyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()

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

构造函数

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

构造给定 id 的 I2S 对象:

  • id标识特定的 I2S 总线。

id特定于板和端口:

  • PYBv1.0/v1.1:有一个 id=2 的 I2S 总线。

  • PYBD-SFxW:有两条 I2S 总线,id=1 和 id=2。

  • ESP32:有两条 I2S 总线,id=0 和 id=1。

所有端口都支持的仅关键字参数:

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

  • ws 是单词选择行的引脚对象

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

  • mode 指定接收或发送

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

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

  • rate 指定音频采样率(样本/秒)

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

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

方法

I2S.init(sck, ...)

参数描述见构造函数

I2S.deinit()

取消初始化 I2S 总线

I2S.readinto(buf)

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

I2S.write(buf)

编写包含在buf. buf 必须支持缓冲协议,如字节数组或数组。“buf”字节顺序是小端的。对于立体声格式,左声道样本在右声道样本之前。对于 Mono 格式,样本数据同时写入左右声道。返回写入的字节数

I2S.irq(handler)

设置回调。handlerbuf被清空(write 方法)或变满(readinto 方法)时被调用。设置回调会将 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 为单声道