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:
Engelleyen – write() 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
Engellemeyen – irq() 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
asyncio – I2S 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:
idbelirli bir I2S veri yolunu tanımlar; karta ve porta özgüdür
Tüm portlarda desteklenen yalnızca anahtar sözcükle belirtilen parametreler:
sckseri saat hattı için bir pin nesnesidirwssözcük seçme hattı için bir pin nesnesidirsdseri veri hattı için bir pin nesnesidirmckana saat hattı için bir pin nesnesidir; ana saat frekansı örnekleme hızı * 256’dırmodealma veya gönderme işlemini belirtirbitsörnek boyutunu (bit) belirtir, 16 veya 32formatkanal biçimini belirtir, STEREO veya MONOrateses örnekleme hızını (Hz) belirtir; bu,wssinyalinin frekansıdıribufdahili 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
writeyöntemi) veya üst taşma (örneğinreadintoyö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
- readinto(buf: bytearray) int¶
Ses örneklerini
bufile belirtilen arabelleğe okuyun.bufarabellek 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¶
bufiçinde bulunan ses örneklerini yazın.bufarabellek 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,bufboşaldığında (writeyöntemi) veya dolduğunda (readintoyöntemi) çağrılır. Bir geri çağırma (callback) ayarlamak,writevereadintoyö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¶
bufiçinde bulunan tüm örneklerin bit düzeyinde kaydırması.bitsörnek boyutunu bit cinsinden belirtir.shifther ö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¶