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:
idmengidentifikasi bus I2S tertentu; bersifat spesifik pada board dan port
Parameter khusus-kata kunci yang didukung pada semua port:
sckadalah objek pin untuk jalur clock serialwsadalah objek pin untuk jalur pemilih katasdadalah objek pin untuk jalur data serialmckadalah objek pin untuk jalur clock master; frekuensi clock master adalah laju sampling * 256modemenentukan mode penerimaan atau transmisibitsmenentukan ukuran sampel (bit), 16 atau 32formatmenentukan format saluran, STEREO atau MONOratemenentukan laju sampling audio (Hz); ini adalah frekuensi sinyalwsibufmenentukan 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. metodereadinto).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
- readinto(buf: bytearray) int¶
Baca sampel audio ke dalam buffer yang ditentukan oleh
buf.bufharus 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.bufharus 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.
handlerdipanggil saatbufdikosongkan (metodewrite) atau terisi penuh (metodereadinto). Mengatur callback mengubah metodewritedanreadintomenjadi operasi non-pemblokiran.handlerdipanggil dalam konteks penjadwal MicroPython.
- static shift(*, buf: bytearray, bits: int, shift: int) None¶
pergeseran bitwise dari semua sampel yang terdapat dalam
buf.bitsmenentukan ukuran sampel dalam bit.shiftmenentukan 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¶