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。设置回调将- 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为单声道