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

引数の説明についてはコンストラクタを参照してください

deinit() None

I2S バスをディイニシャライズします

readinto(buf: bytearray) int

buf で指定されたバッファにオーディオサンプルを読み込みます。buf は bytearray や array のようにバッファプロトコルをサポートしている必要があります。"buf" のバイト順はリトルエンディアンです。ステレオフォーマットでは、左チャンネルサンプルが右チャンネルサンプルに先行します。モノラルフォーマットでは、左チャンネルのサンプルデータが使用されます。読み込まれたバイト数を返します

write(buf: bytes) int

buf に含まれるオーディオサンプルを書き込みます。buf は bytearray や array のようにバッファプロトコルをサポートしている必要があります。"buf" のバイト順はリトルエンディアンです。ステレオフォーマットでは、左チャンネルサンプルが右チャンネルサンプルに先行します。モノラルフォーマットでは、サンプルデータが右チャンネルと左チャンネルの両方に書き込まれます。書き込まれたバイト数を返します

irq(handler: Callable[[I2S], None]) None

コールバックを設定します。handlerbuf が空になったとき (write メソッド)、または満たされたとき (readinto メソッド) に呼び出されます。コールバックを設定すると、write および readinto メソッドはノンブロッキング動作に変わります。handler は MicroPython スケジューラのコンテキストで呼び出されます。

static shift(*, buf: bytearray, bits: int, shift: int) None

buf に含まれるすべてのサンプルをビット単位でシフトします。bits はサンプルサイズをビットで指定します。shift は各サンプルをシフトするビット数を指定します。正の値で左シフト、負の値で右シフトになります。通常は音量制御に使用されます。1 ビットのシフトごとにサンプルの音量が 6dB 変化します。

定数

RX: int

I2S バスの mode を受信に初期化するための値です

TX: int

I2S バスの mode を送信に初期化するための値です

STEREO: int

I2S バスの format をステレオに初期化するための値です

MONO: int

I2S バスの format をモノラルに初期化するための値です