class I2S -- Protokol bus Inter-IC Sound

Kelas I2S mengendalikan bus Inter-IC Sound (I2S) dalam mode pengontrol -- MCU menghasilkan clock bit (SCK) dan clock pemilih kata (WS) serta menukar data sampel pada jalur SD. Driver mendukung DMA berkelanjutan di latar belakang sehingga sisi Python hanya perlu menjaga buffer sampel internal tetap terisi. Mode periferal / hanya-penerima tidak didukung.

Tersedia pada STM32 OpenMV cams yang menghubungkan periferal I2S dan OpenMV Cam RT1062. Tidak tersedia pada OpenMV Cam AE3 (port alif).

I2S(2) pada STM32 OpenMV cams berbagi pin dengan SPI(2) -- clock bit pada P2 (SCK), pemilih kata pada P3 (NSS), dan jalur data serial mengikuti konvensi arah data SPI: TX menggunakan P0 (MOSI), RX menggunakan P1 (MISO).

Contoh -- keluaran (TX). Buat bus TX untuk mengendalikan DAC audio eksternal pada 44,1 kHz, sampel mono 16-bit, dengan buffer pendukung DMA 16384 byte (16 KiB):

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,
)

Contoh -- masukan (RX). Buat bus RX yang menangkap dari mikrofon pada 22,05 kHz, stereo 32-bit (kiri + kanan berselang-seling), dengan buffer pendukung DMA 16384 byte (16 KiB):

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,
)

Metode transfer dapat digunakan dalam tiga gaya:

Pemblokiran -- write() dan readinto() hanya kembali setelah operasi selesai:

num_written = audio_out.write(buf)   # blocks until buf is drained
num_read = audio_in.readinto(buf)    # blocks until buf is filled

Non-pemblokiran -- pasang callback dengan irq() dan metode transfer langsung kembali. Callback dijalankan dari penjadwal MicroPython saat DMA mengosongkan buffer TX atau mengisi buffer RX:

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 adalah stream dan dapat dibungkus oleh 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)

Konstruktor

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)

Buat objek I2S dengan id yang diberikan:

  • id mengidentifikasi bus I2S tertentu; bersifat spesifik pada board dan port

Parameter khusus-kata kunci yang didukung pada semua port:

  • sck adalah objek pin untuk jalur clock serial

  • ws adalah objek pin untuk jalur pemilih kata

  • sd adalah objek pin untuk jalur data serial

  • mck adalah objek pin untuk jalur clock master; frekuensi clock master adalah laju sampling * 256

  • mode menentukan mode penerimaan atau transmisi

  • bits menentukan ukuran sampel (bit), 16 atau 32

  • format menentukan format saluran, STEREO atau MONO

  • rate menentukan laju sampling audio (Hz); ini adalah frekuensi sinyal ws

  • ibuf menentukan panjang buffer internal (byte)

Untuk semua port, DMA berjalan secara berkelanjutan di latar belakang dan memungkinkan aplikasi pengguna melakukan operasi lain sementara data sampel dipindahkan antara buffer internal dan unit periferal I2S. Meningkatkan ukuran buffer internal berpotensi meningkatkan waktu yang dapat digunakan aplikasi pengguna untuk melakukan operasi non-I2S sebelum terjadi underflow (mis. metode write) atau overflow (mis. metode readinto).

Metode

init(*, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int) None

lihat Konstruktor untuk deskripsi argumen

deinit() None

Batalkan inisialisasi bus I2S

readinto(buf: bytearray) int

Baca sampel audio ke dalam buffer yang ditentukan oleh buf. buf harus mendukung protokol buffer, seperti bytearray atau array. Urutan byte "buf" adalah little-endian. Untuk format Stereo, sampel saluran kiri mendahului sampel saluran kanan. Untuk format Mono, data sampel saluran kiri digunakan. Mengembalikan jumlah byte yang dibaca

write(buf: bytes) int

Tulis sampel audio yang terdapat dalam buf. buf harus mendukung protokol buffer, seperti bytearray atau array. Urutan byte "buf" adalah little-endian. Untuk format Stereo, sampel saluran kiri mendahului sampel saluran kanan. Untuk format Mono, data sampel ditulis ke saluran kanan dan kiri. Mengembalikan jumlah byte yang ditulis

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

Atur callback. handler dipanggil saat buf dikosongkan (metode write) atau terisi penuh (metode readinto). Mengatur callback mengubah metode write dan readinto menjadi operasi non-pemblokiran. handler dipanggil dalam konteks penjadwal MicroPython.

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

pergeseran bitwise dari semua sampel yang terdapat dalam buf. bits menentukan ukuran sampel dalam bit. shift menentukan jumlah bit untuk menggeser setiap sampel. Positif untuk geser kiri, negatif untuk geser kanan. Biasanya digunakan untuk kontrol volume. Setiap pergeseran bit mengubah volume sampel sebesar 6dB.

Konstanta

RX: int

untuk menginisialisasi mode bus I2S ke mode terima

TX: int

untuk menginisialisasi mode bus I2S ke mode transmit

STEREO: int

untuk menginisialisasi format bus I2S ke stereo

MONO: int

untuk menginisialisasi format bus I2S ke mono