クラス I2S -- IC間サウンド(Inter-IC Sound)バスプロトコル

I2S は、デジタルオーディオデバイスの接続に使う同期シリアルプロトコルです。物理レベルで、バスは SCK, WS, SD の3つの回線で構成されます。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)    # シリアルデータ出力

または

# PyBoard の場合
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種類の操作モードをサポートしています
  • ブロッキング
  • ノンブロッキング
  • 非同期 I/O

ブロッキング:

num_written = audio_out.write(buf) # buf から書き出すのが終わるまでブロック

num_read = audio_in.readinto(buf) # buf への読み込むのが終わるまでブロック

ノンブロッキング:

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

非同期 I/O

swriter = uasyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()

sreader = uasyncio.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 には受信(I2S.RX)または送信(I2S.TX)を指定します。
  • bits にはサンプルサイズ(ビット数)、16 または 32 を指定します
  • format にはチャネルフォーマット、I2S.STEREO または I2S.MONO を指定します
  • rate にはオーディオサンプリングレート(Hz)を指定します。これは ws 信号の周波数です
  • ibuf には内部バッファ長(バイト数)を指定します

すべてのポートで、DMA がバックグラウンドで継続的に実行され、サンプルデータが内部バッファと I2S ペリフェラルユニット間で転送されている間、ユーザーアプリケーションが他の操作を実行できるようにします。内部バッファのサイズを大きくすると、ユーザーアプリケーションがアンダーフロー(write メソッドなど)またはオーバーフロー(readinto メソッドなど)の前に非 I2S 操作を実行できる時間が長くなる可能性があります。

メソッド

I2S.init(sck, ...)

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

I2S.deinit()

I2S バスを非初期化します

I2S.readinto(buf)

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

I2S.write(buf)

buf に含まれるオーディオサンプルを書き出します。buf は bytearray や array のようなバッファプロトコルをサポートする必要があります。 "buf" のバイトオーダはリトルエンディアンです。ステレオフォーマットの場合、左チャンネルのサンプルが右チャンネルのサンプルよりも優先されます。モノラルフォーマットの場合、左チャンネルのサンプルデータが使われます。戻り値は書き出したバイト数です

I2S.irq(handler)

コールバックを設定します。 handler に指定したコールバック関数は、 write メソッドで buf の書き出しが完了したとき、または readinto メソッドで読み込みが完了したときに呼び出されます。コールバックを設定すると、 writereadinto メソッドはノンブロッキング操作に変更されます。 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 をモノラルにするためのものです