class I2S – Inter-IC Sound veri yolu protokolü

I2S sınıfı, bir Inter-IC Sound (I2S) veri yolunu denetleyici modunda sürer – MCU, bit saatini (SCK) ve sözcük seçme saatini (WS) üretir ve örnek verilerini SD hattı üzerinden alışveriş eder. Sürücü, arka planda sürekli DMA’yı destekler; bu nedenle Python tarafının yalnızca dahili örnek arabelleğini beslemesi yeterlidir. Çevre birimi / yalnızca alıcı modları desteklenmez.

Bir I2S çevre birimini bağlayan STM32 OpenMV kameralarda ve OpenMV Cam RT1062’de kullanılabilir. OpenMV Cam AE3 (alif portu) üzerinde açığa çıkarılmaz.

STM32 OpenMV kameralarda I2S(2), pinlerini SPI(2) ile paylaşır – bit saati P2 (SCK) üzerinde, sözcük seçme P3 (NSS) üzerinde ve seri veri hattı SPI veri yönü kuralını izler: TX P0 (MOSI) kullanır, RX P1 (MISO) kullanır.

Örnek – çıkış (TX). 44.1 kHz, 16 bit mono örneklerle harici bir ses DAC’ını sürmek üzere, 16384 baytlık (16 KiB) DMA destek arabelleğiyle bir TX veri yolu oluşturun:

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

Örnek – giriş (RX). Bir mikrofondan 22.05 kHz, 32 bit stereo (sol + sağ aralanmış) yakalayan, 16384 baytlık (16 KiB) DMA destek arabelleğine sahip bir RX veri yolu oluşturun:

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

Aktarım yöntemleri üç biçimde kullanılabilir:

Engelleyenwrite() ve readinto() yalnızca işlem tamamlandığında geri döner:

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

Engellemeyenirq() ile bir geri çağırma (callback) yükleyin; aktarım yöntemleri hemen geri döner. Geri çağırma (callback), DMA TX arabelleğini boşalttığında veya RX arabelleğini doldurduğunda MicroPython zamanlayıcısından çalıştırılır:

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

asyncioI2S bir akıştır ve asyncio.StreamReader / asyncio.StreamWriter ile sarmalanabilir:

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

sreader = asyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)

Yapıcı

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)

Verilen id ile bir I2S nesnesi oluşturun:

  • id belirli bir I2S veri yolunu tanımlar; karta ve porta özgüdür

Tüm portlarda desteklenen yalnızca anahtar sözcükle belirtilen parametreler:

  • sck seri saat hattı için bir pin nesnesidir

  • ws sözcük seçme hattı için bir pin nesnesidir

  • sd seri veri hattı için bir pin nesnesidir

  • mck ana saat hattı için bir pin nesnesidir; ana saat frekansı örnekleme hızı * 256’dır

  • mode alma veya gönderme işlemini belirtir

  • bits örnek boyutunu (bit) belirtir, 16 veya 32

  • format kanal biçimini belirtir, STEREO veya MONO

  • rate ses örnekleme hızını (Hz) belirtir; bu, ws sinyalinin frekansıdır

  • ibuf dahili arabellek uzunluğunu (bayt) belirtir

Tüm portlarda DMA arka planda sürekli çalışır ve örnek veriler dahili arabellek ile I2S çevre birimi arasında aktarılırken kullanıcı uygulamalarının başka işlemler gerçekleştirmesine olanak tanır. Dahili arabelleğin boyutunu artırmak, kullanıcı uygulamalarının alt taşma (örneğin write yöntemi) veya üst taşma (örneğin readinto yöntemi) öncesinde I2S dışı işlemler gerçekleştirebileceği süreyi artırma potansiyeline sahiptir.

Yöntemler

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

argüman açıklamaları için Yapıcı bölümüne bakın

deinit() None

I2S veri yolunu kapatın

readinto(buf: bytearray) int

Ses örneklerini buf ile belirtilen arabelleğe okuyun. buf arabellek protokolünü desteklemelidir, örneğin bytearray veya array. “buf” bayt sıralaması little-endian’dır. Stereo biçimde sol kanal örneği sağ kanal örneğinden önce gelir. Mono biçimde sol kanal örnek verisi kullanılır. Okunan bayt sayısını döndürür

write(buf: bytes) int

buf içinde bulunan ses örneklerini yazın. buf arabellek protokolünü desteklemelidir, örneğin bytearray veya array. “buf” bayt sıralaması little-endian’dır. Stereo biçimde sol kanal örneği sağ kanal örneğinden önce gelir. Mono biçimde örnek verisi hem sağ hem sol kanallara yazılır. Yazılan bayt sayısını döndürür

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

Bir geri çağırma (callback) ayarlar. handler, buf boşaldığında (write yöntemi) veya dolduğunda (readinto yöntemi) çağrılır. Bir geri çağırma (callback) ayarlamak, write ve readinto yöntemlerini engellemeyen işleme dönüştürür. handler, MicroPython zamanlayıcısının bağlamında çağrılır.

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

buf içinde bulunan tüm örneklerin bit düzeyinde kaydırması. bits örnek boyutunu bit cinsinden belirtir. shift her örneğin kaç bit kaydırılacağını belirtir. Sola kaydırma için pozitif, sağa kaydırma için negatif. Tipik olarak ses düzeyi denetimi için kullanılır. Her bit kaydırması örnek ses düzeyini 6dB değiştirir.

Sabitler

RX: int

I2S veri yolu mode değerini alma olarak başlatmak için

TX: int

I2S veri yolu mode değerini gönderme olarak başlatmak için

STEREO: int

I2S veri yolu format değerini stereo olarak başlatmak için

MONO: int

I2S veri yolu format değerini mono olarak başlatmak için