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 或 32format
指定通道格式,STEREO 或 MONOrate
指定音频采样率(样本/秒)ibuf
指定内部缓冲区长度(字节)
对于所有端口,DMA 在后台连续运行,并允许用户应用程序在内部缓冲区和 I2S 外围单元之间传输样本数据时执行其他操作。增加内部缓冲区的大小有可能增加用户应用程序在下溢(例如
write
方法)或溢出(例如readinto
方法)之前执行非 I2S 操作的时间。
方法¶
-
I2S.
init
(sck, ...)¶ 参数描述见构造函数
-
I2S.
deinit
()¶ 取消初始化 I2S 总线
-
I2S.
readinto
(buf)¶ 将音频样本读入由 指定的缓冲区
buf
。buf
必须支持缓冲协议,如字节数组或数组。“buf”字节顺序是小端的。对于立体声格式,左声道样本在右声道样本之前。对于 Mono 格式,使用左声道样本数据。返回读取的字节数
-
I2S.
write
(buf)¶ 编写包含在
buf
.buf
必须支持缓冲协议,如字节数组或数组。“buf”字节顺序是小端的。对于立体声格式,左声道样本在右声道样本之前。对于 Mono 格式,样本数据同时写入左右声道。返回写入的字节数
-
I2S.
irq
(handler)¶ 设置回调。
handler
当buf
被清空(write
方法)或变满(readinto
方法)时被调用。设置回调会将write
和readinto
方法更改为非阻塞操作。handler
在 MicroPython 调度程序的上下文中调用。
-
static
I2S.
shift
(buf, bits, shift)¶ 中包含的所有样本的按位移位
buf
.bits
以位为单位指定样本大小。shift
指定要移动每个样本的位数。左移为正,右移为负。通常用于音量控制。每个位移位将采样音量改变 6dB。