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
是主时钟线的引脚对象;主时钟频率是采样率 * 256mode
指定接收或传输bits
指定样本大小(位),16 或 32format
指定通道格式,STEREO 或 MONOrate
指定音频采样率(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
。设置回调将write
和readinto
方法改为非阻塞操作。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
为单声道