class I2S -- Inter-IC Sound バスプロトコル¶
I2S クラスは、Inter-IC Sound (I2S) バスをコントローラーモードで駆動します。MCU がビットクロック (SCK) とワードセレクトクロック (WS) を生成し、SD ラインでサンプルデータをやり取りします。ドライバはバックグラウンドでの連続 DMA をサポートしているため、Python 側は内部サンプルバッファを満たし続けるだけで済みます。ペリフェラル/受信専用モードはサポートされていません。
I2S ペリフェラルが配線された STM32 の OpenMV カム、および OpenMV Cam RT1062 で利用できます。OpenMV Cam AE3 (alif ポート) では公開されていません。
STM32 の OpenMV カムでは I2S(2) は SPI(2) とピンを共有します。ビットクロックは P2 (SCK)、ワードセレクトは P3 (NSS)、シリアルデータラインは SPI のデータ方向の慣例に従います。TX は P0 (MOSI) を使用し、RX は P1 (MISO) を使用します。
例 -- 出力 (TX)。外部オーディオ DAC を 44.1 kHz、16 ビットモノラルサンプルで駆動する TX バスを、16384 バイト (16 KiB) の DMA バッキングバッファとともに構築します:
from machine import I2S, Pin
audio_out = I2S(
2,
sck=Pin("P2"), ws=Pin("P3"), sd=Pin("P0"),
mode=I2S.TX,
bits=16,
format=I2S.MONO,
rate=44100,
ibuf=16384,
)
例 -- 入力 (RX)。マイクから 22.05 kHz、32 ビットステレオ (左 + 右のインターリーブ) で取り込む RX バスを、16384 バイト (16 KiB) の DMA バッキングバッファとともに構築します:
from machine import I2S, Pin
audio_in = I2S(
2,
sck=Pin("P2"), ws=Pin("P3"), sd=Pin("P1"),
mode=I2S.RX,
bits=32,
format=I2S.STEREO,
rate=22050,
ibuf=16384,
)
転送メソッドは 3 つのスタイルで使用できます:
ブロッキング -- write() と readinto() は操作が完了したときにのみ戻ります:
num_written = audio_out.write(buf) # blocks until buf is drained
num_read = audio_in.readinto(buf) # blocks until buf is filled
ノンブロッキング -- irq() でコールバックをインストールすると、転送メソッドは即座に戻ります。コールバックは、DMA が TX バッファを空にしたとき、または RX バッファを満たしたときに、MicroPython スケジューラから実行されます:
audio_out.irq(i2s_callback)
num_written = audio_out.write(buf) # returns immediately
audio_in.irq(i2s_callback)
num_read = audio_in.readinto(buf) # returns immediately
asyncio -- I2S はストリームであり、asyncio.StreamReader / asyncio.StreamWriter でラップできます:
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: int, *, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int)¶
指定された 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: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int) None¶
引数の説明についてはコンストラクタを参照してください
- readinto(buf: bytearray) int¶
bufで指定されたバッファにオーディオサンプルを読み込みます。bufは bytearray や array のようにバッファプロトコルをサポートしている必要があります。"buf" のバイト順はリトルエンディアンです。ステレオフォーマットでは、左チャンネルサンプルが右チャンネルサンプルに先行します。モノラルフォーマットでは、左チャンネルのサンプルデータが使用されます。読み込まれたバイト数を返します
- write(buf: bytes) int¶
bufに含まれるオーディオサンプルを書き込みます。bufは bytearray や array のようにバッファプロトコルをサポートしている必要があります。"buf" のバイト順はリトルエンディアンです。ステレオフォーマットでは、左チャンネルサンプルが右チャンネルサンプルに先行します。モノラルフォーマットでは、サンプルデータが右チャンネルと左チャンネルの両方に書き込まれます。書き込まれたバイト数を返します
定数¶