machine.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) # 串行时钟输出
ws_pin = Pin(13) # 字时钟输出
sd_pin = Pin(12) # 串行数据输出
# 或
# PyBoards
sck_pin = Pin("Y6") # 串行时钟输出
ws_pin = Pin("Y5") # 字时钟输出
sd_pin = Pin("Y8") # 串行数据输出
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种操作模式: - 阻塞模式 - 非阻塞模式 - asyncio
阻塞模式:
num_written = audio_out.write(buf) # 阻塞直到缓冲区为空
num_read = audio_in.readinto(buf) # 阻塞直到缓冲区填满
非阻塞模式:
audio_out.irq(i2s_callback) # 当缓冲区为空时调用i2s_callback
num_written = audio_out.write(buf) # 立即返回
audio_in.irq(i2s_callback) # 当缓冲区填满时调用i2s_callback
num_read = audio_in.readinto(buf) # 立即返回
asyncio:
swriter = asyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()
sreader = asyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)
一些编解码设备如WM8960或SGTL5000需要单独初始化才能与I2S类一起工作。 对于这些设备,提供了单独的驱动程序,这些驱动程序还提供了控制音量、音频处理和其他功能的方法。
- 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操作的时间。
- init(sck, ...)
参见构造函数的参数描述
- deinit()
取消初始化I2S总线
- readinto(buf)
将音频样本读入由buf指定的缓冲区。buf必须支持缓冲区协议,如bytearray或array。 "buf"字节顺序是小端序。对于立体声格式,左声道样本先于右声道样本。对于单声道格式,使用左声道样本数据。 返回读取的字节数
- write(buf)
写入包含在buf中的音频样本。buf必须支持缓冲区协议,如bytearray或array。 "buf"字节顺序是小端序。对于立体声格式,左声道样本先于右声道样本。对于单声道格式,样本数据被写入左右声道。 返回写入的字节数
- irq(handler)
设置回调函数。当缓冲区为空(write方法)或变满(readinto方法)时调用handler。 设置回调会将write和readinto方法更改为非阻塞操作。 handler在MicroPython调度器的上下文中被调用。
- static shift(*, buf, bits, shift)
对buf中包含的所有样本进行按位移位。bits指定样本大小(位)。shift指定每个样本要移位的位数。 正数表示左移,负数表示右移。 通常用于音量控制。每位移位会使样本音量变化6dB。
- RX
用于将I2S总线模式初始化为接收
- TX
用于将I2S总线模式初始化为发送
- STEREO
用于将I2S总线格式初始化为立体声
- MONO
用于将I2S总线格式初始化为单声道